2011-01-15 13 views
5

Tôi đã có một đồng nghiệp của tôi đến gặp tôi hôm nay với vấn đề làm sao anh ta có thể tải hoặc hoán đổi documentView của một NSScrollView. sửa sang góc trên cùng bên trái thay vì góc dưới cùng.Đặt NSScrollView Nội dung ở trên cùng bên trái thay vì dưới cùng bên trái khi hoán đổi tài liệu

Ông đã dành thời gian tìm kiếm trên web và lúng túng và không có giải pháp mặc dù đọc tài liệu tại Apple, trên StackOverflow và nhiều địa điểm khác.

Đây là vấn đề mảnh-by-piece:

Trong Interface Builder kéo một NSScrollView vào dự án. Cũng trong giao diện Builder kéo hai quan điểm tùy chỉnh vào dự án và thêm một số textfields, các nút, vv

Tạo một lớp điều khiển (ví dụ MyController) với IBOutlet s sau:

  • IBOutlet NSScrollView * myScrollView
  • IBOutlet NSView * myCustomView1
  • IBOutlet NSView * myCustomView2

Kết nối cửa hàng với điều khiển trong Trình tạo giao diện.

Tạo một NSView lớp con để lật documentView:

@implementation myFlippedView 

-(id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
    } 
    return self; 
} 

-(void)drawRect:(NSRect)dirtyRect { 
    // Drawing code here. 
} 

-(BOOL)isFlipped { 
    return YES; 
} 

Chọn documentView của NSScrollView trong Interface Builder và làm cho nó một lớp con của myFlippedView. Trong giao diện Builder bạn sẽ chọn NSScrollView và sau đó bấm vào nó một lần nữa để có được các documentView, hoặc thay đổi Thư viện IB để hiển thị một cái nhìn cây và chọn xem tùy chỉnh con của NSScrollView.

Trong hoán đổi lớp myController quan điểm với các phương pháp sau:

-(void)awakeFromNib { 

    [myScrollView setDocumentView:myCustomView1]; 
} 

-(IBAction)swapViews:(id)sender { 

    if ([myScrollView documentView] == myCustomView1) { 

     [myScrollView setDocumentView:myCustomView2]; 

    } else { 

     [myScrollView setDocumentView:myCustomView1]; 

    } 
} 

Cuối cùng treo lên một nút trong dự án của mình vào hành động swapViews, xây dựng và chạy.

Vấn đề là tọa độ không được giải quyết như mong đợi với isFlipped.

Trả lời

7

Có một lý do đơn giản nhưng rõ ràng thường bị bỏ qua cho việc này.

Mặc dù isFlipped là phân lớp chế độ xem tùy chỉnh trong Trình tạo giao diện, tài liệuView được thay thế trên trao đổi chế độ xem, lần đầu tiên được sử dụng trên awakeFromNib.

Giải pháp là phân lớp myCustomClass1 và myCustomClass2 thành lớp myFlippedView.

Thực hiện việc này và kiểm tra và bạn sẽ nhận thấy rằng các chế độ xem giờ đây xuất hiện ở trên cùng bên trái của chế độ xem cuộn. Tuy nhiên, nó đã tạo ra một vấn đề mới. Tất cả nội dung trong chế độ xem tùy chỉnh hiện được đặt từ dưới lên trên (vì theo mặc định, tất cả các bố cục NSView đều từ dưới cùng bên trái, do đó, lật cũng lật các tọa độ của chúng).

May mắn thay có một sửa chữa dễ dàng khác cho vấn đề này. Đọc trên :-)

Trong bộ dựng giao diện, đánh dấu tất cả các điều khiển trong myCustomView1 và từ menu Layout, chọn Nhúng đối tượng trong -> Chế độ xem tùy chỉnh. Thay đổi kích thước như bạn cần, làm tương tự cho myCustomView2 và xây dựng lại.

Thì đấy. An NSScrollView với chế độ xem nội dung hoán đổi và xuất hiện ở trên cùng bên trái của chế độ xem cuộn thay vì dưới cùng bên trái.

+1

Hoặc bạn có thể đi theo tuyến đường đơn giản hơn và chỉ thực hiện các giao diện hoán đổi một chế độ xem phụ của myFlippedView thay vì đặt chúng ở chế độ xem tài liệu. – ughoavgfhw

+0

Điều đó bạn có thể. Điểm tốt. – Hooligancat

+0

Tuy nhiên, việc này giới thiệu một vấn đề mới. Nếu bạn thực hiện chế độ xem cuộn nhỏ hơn chế độ xem tài liệu bằng cách đổi kích thước cửa sổ, chế độ này sẽ ghim vào cuối chế độ xem thay vì ở trên cùng. Là một người sử dụng bạn thà mong đợi sau này. –

0

Để thực hiện một cách chính xác các documentView ban đầu sắp xếp để phía trên cùng của scrollview AND để cũng pin nó lên đỉnh khi documentView nhỏ hơn nó clipview, đây là những gì làm việc cho tôi:

1 - Trong Trình tạo giao diện bao gồm tất cả các điều khiển trong tài liệu của bạn Xem trong một ví dụ tùy chỉnhNSView. (KHÔNG một cái nhìn lộn)

2 - Tạo một lớp con NSView được sử dụng cho các documentView, và ghi đè lên các phương pháp:

- (BOOL)isFlipped { 
    return YES; 
} 
- (void)resizeWithOldSuperviewSize:(NSSize)oldSize { 
CGFloat superViewHeight = self.superview.frame.size.height, height = self.frame.size.height; 
    if(superViewHeight>height) { 
     [self setFrameOrigin:NSMakePoint(self.frame.origin.x, superViewHeight-height)]; 
    } 
} 

Quan điểm subclassed nên là scrollViews documentView chứa thứ hai (bình thường) NSView chứa tất cả các điều khiển.