2009-06-09 31 views
6

Tôi cần hiểu cách NSView tự động hóa lượt xem của NSView. Tôi đã thiết lập tất cả mọi thứ trong IB và subviews của tôi thay đổi kích thước độc đáo (khi tôi thay đổi kích thước cửa sổ của tôi xung quanh với một con chuột). Tuy nhiên, nếu tôi làm [myMainView setFrame:] với khung hình mới của tôi, không có gì xảy ra. Tất cả các chế độ xem phụ của tôi vẫn là kích thước ban đầu (mặc dù chế độ xem chính có kích thước chính xác). Trẻ em được gọi là resizeWithOldSuperviewSize: nhưng vẫn không được định kích thước phù hợp.Hành vi tự động hóa của NSView

Tôi có đầy đủ các thành phần ca cao trên màn hình (màn hình # 1), nhãn, hình ảnh, video. Có một bố cục được xác định rõ ràng cho các yếu tố này. Tôi đã thiết lập hành vi tự động hóa thông qua Trình tạo giao diện hoạt động rất tốt. Thay đổi kích thước cửa sổ chính thay đổi kích thước các yếu tố một cách thỏa mãn.

Bây giờ, người dùng nhấp vào nút "tiếp theo", trong đó một màn hình thứ hai của các phần tử (màn hình # 2) sẽ được vẽ. Bố trí của tôi được xây dựng dựa trên một màn hình chính tắc (ví dụ: 800x600). Nhưng bây giờ cửa sổ lớn hơn (hoặc nhỏ hơn) bởi vì nó đã được thay đổi kích thước trong màn hình # 1. Vì vậy, các yếu tố hiện nay chỉ lấy một khu vực nhỏ trong cửa sổ, thay vì được kích thước thích hợp để lấp đầy không gian có sẵn. Tôi muốn mở rộng các yếu tố này.

Tôi có hiểu lầm về cách hoạt động của tính năng tự động hóa không? Làm thế nào tôi có thể kích hoạt máy móc tự động hóa bên dưới NSView theo cách thủ công?

Có hai điều tôi có thể làm:

  1. thủ thay đổi kích thước các yếu tố dựa trên kích thước màn hình hiện tại tương đối so với kích thước ban đầu. Tùy chọn này không phải là yêu thích của tôi vì dường như, tôi buộc phải viết lại mã đã hoạt động trong NSView (hành vi tự động hóa
  2. Tùy chọn thứ hai của tôi là gọi phép thuật tự động hóa của NSView đã đề cập ở trên. Điều tôi đã thử là, thay đổi kích thước nội dung của tôi thành màn hình gốc (800x600), hiển thị các phần tử của tôi và sau đó thay đổi kích thước của nó thành kích thước cửa sổ hiện tại. dường như không được. Một lần nữa, tùy chọn này là một lợi thế vì nó giảm thiểu số lượng mã mà đã te được viết và duy trì.
+0

Thử [resizeSubviewsWithOldSize:] (http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/resizeSubviewsWithOldSize :) hoặc [setAutoresizesSubviews:] (http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/occ/instm/NSView/setAutoresizesSubviews :). –

+0

Tôi không chắc chắn những gì bạn có ý nghĩa ở đây. Parent's resizeSubviewsWithOldSize được gọi, setAutoresizesSubviews được đặt thành có. Bạn có thể cung cấp thêm một số hướng dẫn không? – EightyEight

+0

Trước đây là vì sau này - nếu autoresizesSubviews được đặt thành YES, sau đó resizeSubviewsWithOldSize: sẽ được gọi tự động. Vì bạn có nó để thiết lập và đó là xảy ra, tôi cũng stumped. Lấy làm tiếc. –

Trả lời

3

Hóa ra cách tiếp cận của tôi là chính xác. Tôi đã đặt kích thước khung thành giá trị không chính xác, do đó tôi không nhận được hành vi mong đợi. Doh.

+6

Tại sao các downvotes? – Chetan

+0

Tôi có cùng một vấn đề. Mọi đề xuất khác ... – Sunkas

20

mã này

NSView* superView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; 
NSView* subView = [[NSView alloc] initWithFrame:NSMakeRect(0, 0, 100, 100)]; 
[superView addSubview:subView]; 

[superView setAutoresizesSubviews:YES]; 
[subView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]; 

NSLog(@"subview's frame before resizing: %@", NSStringFromRect([subView frame])); 
[superView setFrame:NSMakeRect(0, 0, 200, 100)]; 
NSLog(@"subview's frame after resizing: %@", NSStringFromRect([subView frame])); 

không cho kết quả mong đợi:

[...] subview's frame before resizing: {{0, 0}, {100, 100}} 
[...] subview's frame after resizing: {{0, 0}, {200, 100}}

Vấn đề của bạn là ở nơi khác. Tôi hy vọng rằng một trong các chế độ xem vùng chứa của bạn không phải là một phần của cấu trúc phân cấp chế độ xem của cửa sổ tại thời điểm xảy ra thay đổi kích thước.

Một giải pháp tốt cho vấn đề của bạn có thể là sử dụng NSTabView không có tab, vì tất cả các chế độ xem của bạn luôn ở trong cửa sổ (có thể ẩn) và tabview sẽ xử lý thay đổi kích thước.

Một giải pháp khác là đặt một số chế độ xem lên trên nhau và sử dụng setHidden: để chỉ hiển thị một.

+0

Đó là một ý tưởng thú vị, về việc hiển thị tất cả các khung nhìn. Thật không may một số quan điểm đòi hỏi khá nhiều chế biến, đủ để được tốn kém. Ý tưởng tuyệt vời nghĩ! – EightyEight

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