2013-02-26 44 views
7

Tôi đang cố gắng tạo giao diện người dùng giống như Reeder/Sparrow để xử lý nội dung ứng dụng của tôi. Hiện tại tôi sử dụng NSSplitView với hai NSView bên trong (một bên trái là danh sách nội dung và bên kia là bên phải là "thanh tra").NSSplitView chia trên thanh tiêu đề INAppStoreWindow

Điều tôi muốn biết là cách tạo dải phân cách trên thanh tiêu đề cũng đóng vai trò là dải phân cách của chế độ xem chia tách. Tôi đã sử dụng lớp con INAppStoreWindow.

Bất kỳ ý tưởng nào? Thanx trước

+0

Vui lòng đăng ảnh chụp màn hình của hiệu ứng bạn đang cố gắng đạt được. – trojanfoe

Trả lời

8

Con đường tôi đã làm điều này là thêm một lớp con NSSplitView như là một subview của tileBarView của INAppStoreWindow:

// This code comes from the INAppStoreWindow readme 
INAppStoreWindow *appStoreWindow = (INAppStoreWindow *)[self window]; 

// self.titleView is a an IBOutlet to an NSView that has been configured in IB with everything you want in the title bar 
self.windowTitleBarView.frame = appStoreWindow.titleBarView.bounds; 
self.windowTitleBarView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; 
[appStoreWindow.titleBarView addSubview:self.windowTitleBarView]; 

Hai phần khó khăn đang nhận được cái nhìn chia này cư xử giống như một thanh tiêu đề (tức là vẫn cho phép bạn kéo cửa sổ xung quanh) và đồng bộ hóa chế độ xem chia tách trong thanh tiêu đề với chế độ xem chia nhỏ chính trong cửa sổ, vì vậy chúng có vẻ giống với điều đó đối với người dùng.

Để giải quyết câu hỏi đầu tiên, bạn phải làm nhiều hơn là chỉ trả lại YES từ -mouseDownCanMovewWindow trong thanh tiêu đề NSSplitView của bạn. Nếu bạn làm như vậy, không có phần nào trong số các bản xem trước của thanh gạch sẽ phản hồi sự kiện chuột. Thay vào đó, hãy thực hiện việc này:

@implementation MyTitleBarSplitView 

- (BOOL)mouseDownCanMoveWindow 
{ 
    return NO; 
} 

// Code below adapted from http://www.cocoabuilder.com/archive/cocoa/219261-conditional-mousedowncanmovewindow-for-nsview.html 
- (void)mouseDown:(NSEvent*)theEvent 
{ 
    NSWindow *window = [self window]; 
    NSPoint mouseLocation = [theEvent locationInWindow]; 
    NSRect dividerRect = NSMakeRect(NSMaxX([[[self subviews] objectAtIndex:0] frame]), 
            NSMinY([self bounds]), 
            [self dividerThickness], 
            NSHeight([self bounds])); 
    dividerRect = NSInsetRect(dividerRect, -2, 0); 
    NSPoint mouseLocationInMyCoords = [self convertPoint:mouseLocation fromView:nil]; 
    if (![self mouse:mouseLocationInMyCoords inRect:dividerRect]) 
    { 
     mouseLocation = [window convertBaseToScreen:mouseLocation]; 
     NSPoint origin = [window frame].origin; 
     // Now we loop handling mouse events until we get a mouse up event. 
     while ((theEvent = [NSApp nextEventMatchingMask:NSLeftMouseDownMask|NSLeftMouseDraggedMask|NSLeftMouseUpMask untilDate:[NSDate distantFuture] inMode:NSEventTrackingRunLoopMode dequeue:YES])&&([theEvent type]!=NSLeftMouseUp)) 
     { 
      @autoreleasepool 
      { 
       NSPoint currentLocation = [window convertBaseToScreen:[theEvent locationInWindow]]; 
       origin.x += currentLocation.x-mouseLocation.x; 
       origin.y += currentLocation.y-mouseLocation.y; 
       // Move the window by the mouse displacement since the last event. 
       [window setFrameOrigin:origin]; 
       mouseLocation = currentLocation; 
      } 
     } 
     [self mouseUp:theEvent]; 
     return; 
    } 

    [super mouseDown:theEvent]; 
} 

@end 

Đơn đặt hàng thứ hai là đồng bộ hóa hai chế độ xem chia tách. Làm cho lớp điều khiển của bạn (có thể là bộ điều khiển cửa sổ, nhưng bất kỳ điều gì có ý nghĩa trong mã của bạn), đại biểu của cả chế độ xem nội dung chính và chế độ xem chia tách thanh tiêu đề. Sau đó, triển khai hai phương thức ủy quyền NSSplitView bên dưới:

@implementation MyController 
{ 
    BOOL updatingLinkedSplitview; 
} 

- (CGFloat)splitView:(NSSplitView *)splitView constrainSplitPosition:(CGFloat)proposedPosition ofSubviewAt:(NSInteger)dividerIndex 
{ 
    // If already updating a split view, return early to avoid infinite loop and stack overflow 
    if (updatingLinkedSplitview) return proposedPosition; 

    if (splitView == self.mainSplitView) 
    { 
     // Main splitview is being resized, so manually resize the title bar split view 
     updatingLinkedSplitview = YES; 
     [self.titleBarSplitView setPosition:proposedPosition ofDividerAtIndex:dividerIndex]; 
     updatingLinkedSplitview = NO; 
    } 
    else if (splitView == self.titleBarSplitView) 
    { 
     // Title bar splitview is being resized, so manually resize the main split view 
     updatingLinkedSplitview = YES; 
     [self.mainSplitView setPosition:proposedPosition ofDividerAtIndex:dividerIndex]; 
     updatingLinkedSplitview = NO; 
    } 

    return proposedPosition; 
} 

- (void)splitView:(NSSplitView *)splitView resizeSubviewsWithOldSize:(NSSize)oldSize 
{ 
    // This is to synchronize the splitter positions when the window is first loaded 
    if (splitView == self.titleBarSplitView) 
    { 
     NSRect leftFrame = NSMakeRect(NSMinX([self.leftTitleBarView frame]), 
             NSMinY([self.leftTitleBarView frame]), 
             NSWidth([self.leftMainSplitView frame]), 
             NSHeight([self.leftTitleBarView frame])); 
     NSRect rightFrame = NSMakeRect(NSMaxX(leftFrame) + [splitView dividerThickness], 
             NSMinY([self.rightTitleBarView frame]), 
             NSWidth([self.rightMainSplitView frame]), 
             NSHeight([self.rightTitleBarView frame])); 

     [self.leftTitleBarView setFrame:leftFrame]; 
     [self.rightTitleBarView setFrame:rightFrame]; 
    } 
} 
+0

Thanx! Đó chỉ là những gì tôi đang tìm kiếm! – psicosis

+0

@Andrew, tuyệt vời! Bạn đã làm cho ngày của tôi :) Cảm ơn rất nhiều. – siekfried

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