2011-01-18 8 views
9

Tôi có một NSScrollView lấp đầy toàn bộ cửa sổ và hiển thị một hình ảnh lớn. Bây giờ tôi muốn phủ một NSView tùy chỉnh lên các phần của Chế độ xem Cuộn (ví dụ: chiều cao và chiều rộng cửa sổ 20 pixel hàng đầu) để hiển thị thông tin bổ sung. Khi người dùng cuộn chế độ xem cuộn, NSView tùy chỉnh ở trên cùng sẽ vẫn ở vị trí hiện tại.Lớp phủ NSView trên NSScrollView

Tôi đã thử những điều sau đây:

  1. Tạo một thể hiện của NSView kích thước của cửa sổ của tôi
  2. Thêm NSScrollView như subview của tạo trước NSView
  3. Thêm giao diện tùy chỉnh của tôi như subview đến NSView ở bước 1

Điều này hoạt động ngay từ đầu, chế độ xem cuộn được hiển thị chính xác và NSView tùy chỉnh của tôi. Tuy nhiên, ngay sau khi tôi bắt đầu di chuyển chế độ xem cuộn (cuộn), NSView tùy chỉnh được cuộn cùng với nội dung của NSScrollView và cuối cùng biến mất khi nó di chuyển ra ngoài giới hạn và một phần của chế độ xem cuộn, vị trí của nó, được vẽ lại . Làm thế nào tôi có thể có hiệu quả lớp NSView tùy chỉnh của tôi trên đầu trang của NSScrollView và chắc chắn rằng nó vẫn đặt?

Cảm ơn!

+0

Tôi biết điều này đã được hỏi lại vào năm 2011, nhưng chỉ là một gợi ý nếu bạn nhấn vào ngày hôm nay. Bạn có thể có thể giải quyết điều này bằng cách đơn giản là làm cho tất cả mọi thứ lớp được hỗ trợ xem. Chỉ cần thiết lập wantsLayer cho NSView được tạo ở bước 1. điều đó sẽ làm cho tất cả các lớp đệ quy được hỗ trợ –

Trả lời

3

Tôi biết rằng bạn đã có giải pháp làm việc cho điều này, nhưng tôi tình cờ cũng đang tìm kiếm cùng một thứ và tôi đã vượt qua lớp học của Louis Klaassen, điều này dường như cung cấp giải pháp dễ dàng cho loại lớp phủ.

Như được mô tả trên CocoaDev wiki, bạn chỉ cần tạo NSWindow mới trong Bộ dựng giao diện, có nó là một thể hiện của LKOverlayWindow và đính kèm NSScrollView thông qua một ổ cắm hoặc chỉ định mã đó. Sau khi được gắn vào một dạng xem cuộn, nội dung của LKOverlayWindow sẽ phủ lên khung nhìn cuộn và theo dõi nó khi nó di chuyển và được thay đổi kích cỡ (sau này dường như chỉ làm việc với NSScrollView như một cửa sổ của cửa sổ). Một dự án mẫu được cung cấp bởi tác giả here.

Tôi sẽ đi theo con đường phân lớp NSScrollView, nhưng điều này hóa ra lại dễ dàng hơn nhiều trong trường hợp của tôi.

+0

Rất hay, sẽ sử dụng lần sau. Cảm ơn bạn đã chia sẻ nó! – Robin

9

Bạn có hai tùy chọn:

Trước tiên, tắt "Sao chép khi cuộn". Bạn có thể thực hiện việc này trực tiếp bằng IB hoặc bằng cách đặt tùy chọn copiesOnScroll trên thành viên contentView của số NSScrollView. Tùy chọn đó, được bật theo mặc định làm cho nó để chế độ xem cuộn "sao chép hình ảnh được hiển thị hiện tại của nó trong khi cuộn (chỉ vẽ các phần tiếp xúc của chế độ xem tài liệu)". Nếu tắt, "nó buộc nội dung của nó được vẽ lại mỗi lần." Vì vậy, nếu hiệu suất không phải là một vấn đề lớn, nó hoạt động để chỉ cần tắt nó đi.

Tuy nhiên, làm cho nó để nội dung phải vẽ lại mỗi lần có thể gây ra vấn đề hiệu suất lớn nếu bạn đang vẽ phức tạp trong chế độ xem cuộn.

Tùy chọn thứ hai là để "Sao chép trên cuộn" được bật và sau đó tạo một cửa sổ không viền có chứa chế độ xem phủ của bạn. Điều này thực sự không phải là hackish vì nó có thể âm thanh như bạn thực sự có thể thêm một ví dụ NSWindow như là một đứa trẻ của cửa sổ hiện tại của bạn để nó tự động di chuyển cùng với cửa sổ chính khi di chuyển.

Mẫu RoundTransparentWindow sẽ cung cấp cho bạn một ví dụ tuyệt vời để làm theo trong việc tạo cửa sổ chứa lớp phủ của bạn. Sau đó, chỉ cần sử dụng số addChildWindow của NSWindow để đính kèm nó vào cửa sổ chính của bạn.

Lưu ý rằng với phương pháp này, bạn sẽ cần xử lý thời gian của bản trình bày và ẩn cửa sổ lớp phủ. Nó cũng có vẻ là trường hợp khi bạn tối đa hóa cửa sổ cha mẹ mà vị trí cửa sổ con không tự động điều chỉnh. Vì vậy, bạn sẽ phải xử lý điều đó. Nhưng, đó là một giải pháp tuyệt vời nếu bạn không muốn hy sinh đôi khi một cải tiến hiệu suất lớn khi sử dụng "Copy on Scroll".

+1

Cảm ơn giải pháp của bạn, trong khi chờ đợi tôi đã giải quyết được vấn đề. Lúc đầu, tôi đã có bạn giải pháp là tốt, tuy nhiên, như bạn nói phiên bản subwindow có một số hạn chế. Một cách dễ dàng hơn để thực hiện nó là phân lớp NSScrollView và thêm subview ở đó. Bây giờ tôi chỉ có thể điều chỉnh vị trí của subview của tôi trong thực hiện reflectScrolledClipView được ghi đè của tôi, et voilà, làm việc hoàn hảo :) – Robin

+1

Ah, giải pháp rất tốt đẹp. Đó chắc chắn là giải pháp tốt nhất cho trường hợp sử dụng của bạn. Trong trường hợp của tôi, tôi cần một cái nhìn mà chỉ một phần chồng chéo scrollview vì vậy tôi không thể vẽ nó bên trong. Tôi đã phải đi với cách tiếp cận subwindow thay thế. –