2010-10-10 13 views
8

Tôi muốn một NSView có thể được thay đổi kích cỡ bằng cách kéo góc dưới bên phải của nó xung quanh, giống như một NSWindow. Tôi muốn có thể nhúng NSView này vào NSView chính. Có một thành phần như thế này trong Cocoa hay bất kỳ phần mở rộng nào của nó?Ca cao: Có tồn tại NSView với khả năng thay đổi kích thước của người dùng không?

+1

Bạn có thể muốn xem Bản trình diễn ca cao tự động ca cao http://developer.apple.com/library/mac/#samplecode/Cocoa_Autolayout_Demos/Introduction/Intro.html Cụ thể là ứng dụng "DraggingAndWindowResize" –

Trả lời

7

Nếu bạn cụ thể hơn với câu hỏi của mình, tôi có thể cụ thể hơn với câu trả lời. :-)

Không có gì giống như điều này có sẵn mà tôi biết, nhưng nó không phải là khó khăn khủng khiếp để tạo ra. Quyết định đưa ra là "ai xử lý việc vẽ các cái kẹp thay đổi kích thước và thay đổi kích thước/kéo logic?"

Lần Xử lý của họ riêng

Nếu xem người dùng thay đổi kích thước của bạn xử lý vẽ nắm và ứng phó với những thay đổi kích thước/kéo hành động riêng của mình, sau đó bạn phải chọn nếu bạn muốn nắm vẽ trên đỉnh điểm của nội dung hoặc "xung quanh bên ngoài". Nếu bạn muốn nắm "bên ngoài", "khu vực có thể sử dụng" giảm vì nội dung của bạn phải đủ nhỏ để rời khỏi phòng để bạn vẽ các điều khiển thay đổi kích thước, điều này có thể làm phức tạp việc vẽ và định kích thước. Nếu bạn vẽ cái nắm "trên đỉnh" nội dung, bạn có thể tránh được vấn đề này.

container Xem Xử lý Tất cả subviews

Cách khác là để tạo ra một "Cảnh chứa thay đổi kích thước" thu hút sự nắm bắt thay đổi kích thước xung quanh chu vi bất kỳ subviews' và xử lý kéo/thay đổi kích thước logic bằng cách "chỉ huy được các subviews xung quanh "khi nó (container) nhận được kéo các sự kiện trên một trong các lĩnh vực grip của nó. Đặt logic ở đây cho phép bất kỳ loại subview nào có thể kéo/resizable và mang lại cho bạn lợi ích bổ sung chỉ có một thể hiện của view nặng hơn một chút (so với nhiều trường hợp subviews có logic phức tạp hơn).

Cơ chế cơ bản

Khi bạn đã quyết định rằng, nó thực sự chỉ là vấn đề của việc tạo ra subview của bạn, mà không vẽ, quản lý NSTrackingArea trường (đối với khu vực grip), và đáp ứng các phương pháp chuột thích hợp (xuống, di chuyển, v.v.). Trong trường hợp của mỗi subview xử lý riêng của mình, họ sẽ quản lý các khu vực theo dõi riêng của họ, nắm vẽ, và di chuyển chuột, thiết lập khung của riêng mình trong phản ứng. Trong trường hợp một khung nhìn container xử lý tất cả điều này cho các subviews của nó, nó sẽ quản lý tất cả các vùng theo dõi của subviews và vẽ grip của chính nó, và thiết lập khung nhìn của subview (và subview là blissfully ignorant của toàn bộ điều).

Tôi hy vọng điều này giúp cung cấp cho bạn ít nhất một ý tưởng chung về các cơ chế có thể có. Nếu tôi không chỉ thức dậy và bắt đầu cà phê buổi sáng của mình, tôi có lẽ sẽ có thể viết gọn gàng hơn, nhưng bạn có nó.:-)


EDIT 7 năm sau

Bởi vì không có nhiều chi tiết về những gì OP muốn, tôi đã đưa ra một câu trả lời rất chung chung, nhưng tôi nên thực hiện một vài điểm:

  • Luôn thích NSSplitView nếu nó có thể được thực hiện để làm việc cho bạn (ví dụ: nếu chế độ xem phù hợp với nhau và chia không gian của chế độ xem vùng chứa chung). Chế độ xem chia nhỏ cho phép bạn tùy chỉnh các khu vực cầm nắm, v.v. và thực hiện tất cả điều này với chế độ xem phụ của bạn miễn phí.
  • AutoLayout không tồn tại khi tôi viết câu trả lời này và nó rất nhiều phức tạp đưa giải pháp của riêng bạn cho kịch bản xem-xử lý nhiều kích thước phụ.
  • Nếu bạn thực sự cần phần tử giao diện người dùng có thể được kéo/thay đổi kích thước trong một số vùng chứa, hãy cố gắng hết sức để sử dụng CALayers bên trong chế độ xem chính xử lý tất cả logic bố cục/định cỡ nếu bạn có thể.
  • Nếu bạn không thể thực hiện ở trên (ví dụ, chế độ xem có thể thay đổi kích thước chứa các điều khiển và bố cục phức tạp, có NSViewController, v.v.), hãy thử phương pháp lai (sử dụng lớp để hiển thị hình ảnh được lưu trong bộ nhớ cache của chế độ xem không được chọn và chỉ thêm một subview tương đối đầy đủ, tương đối cho các mục đã chọn (hoặc subviews cho các mục)
  • Vì sự phức tạp của AutoLayout, tôi thực sự không thể đề nghị cách tiếp cận subview kéo thực sự ở tất cả trừ khi nó không thể tránh khỏi. Ví dụ: một ứng dụng đồ họa có nhiều hình dạng nên có chế độ xem Canvas đại diện cho các hình dạng (và bất kỳ trang trí GUI nào có kích thước)/kéo kẹp, vv) sử dụng CALayers. Điều này tận dụng lợi thế của đồ họa acc eleration và là đến nay hiệu quả hơn một nhóm (rất tài nguyên nặng) NSView các bản xem trước. Tất cả logic di chuyển/kích thước/chọn được xử lý bởi "Chế độ xem Canvas" và chỉ có thể là các kiểm soát chồng chéo (mặc dù nếu chính Canvas của bạn cần được bao bọc trong chế độ xem cuộn, tốt nhất là sử dụng máy móc NSScrollView để cho phép chế độ xem lớp phủ cố định vì mục đích này).
  • Nếu thiết kế chế độ xem vẽ nhiều thứ (bạn nên sử dụng lớp để đại diện cho những thứ đó) nhưng chỉ cho phép chọn một điều, cách tiếp cận thêm một chế độ xem phụ có thể quản lý được ngay cả với Tự động điền. Nếu điều "được chọn để chỉnh sửa" có nhiều điều khiển phức tạp có thể hiển thị khi chỉnh sửa, "trình xem phụ của trình chỉnh sửa" với bộ điều khiển xem kèm theo có ý nghĩa và là sự cân bằng tốt về tính bảo trì (vì bộ điều khiển xem ngăn cách tất cả chức năng chỉnh sửa/xử lý giao diện người dùng) container view complexity (vì một subview sẽ không phá vỡ ngân hàng tài nguyên và duy trì các ràng buộc AutoLayout tạm thời để giữ vị trí của nó trong khung nhìn container thay đổi kích thước & tương tác biên tập không quá phức tạp).
  • Tất cả điều này giả định macOS; nếu thiết kế cho iOS, chắc chắn uốn cong trên mặt sau để sử dụng các lớp và máy móc kéo và thả mới (bằng văn bản này), trong đó tôi biết chút ít quý giá hiện tại.

Tóm lại, câu trả lời không đầy đủ cũng như phần nào đã lỗi thời, vì vậy tôi cảm thấy lời khuyên ban đầu của tôi không tốt bằng những ngày này.

+0

Cảm ơn lời khuyên về Joshua. Có vẻ như tôi sẽ tự nướng. – Max

0

Thay vì sử dụng chế độ xem, bạn có thể sử dụng cửa sổ và đặt mặt nạ kiểu của cửa sổ thành NSResizableWindowMask.

Tùy chọn khác đang sử dụng NSSplitView, nếu bạn có hai bản xem lại có thể thay đổi kích thước, tiếp giáp.

Các vấn đề liên quan