NSSPlitView의 일부를 프로그래밍 방식으로 확장하고 붕괴시키는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/925020

  •  06-09-2019
  •  | 
  •  

문제

교체하고 싶습니다 RBSplitView ~와 함께 NSSplitView 내 기존 프로젝트에서. 응용 프로그램은 이제 표범 전용이며 교체하고 싶습니다. RBSplitView 이랑 새로운 NSSplitView 표범과 함께 배송되었습니다.

그러나 나는 실종된다 RBSplitView편리한 방법 expand 그리고 collapse 안에 NSSplitView. NSSPlitView의 일부를 프로그래밍 방식으로 확장하고 붕괴하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

방금 프로그래밍 방식의 확장과 무너졌습니다 NSSplitView 일하다. 나는 또한 내 구성을 구성했다 NSSplitView 분배기를 두 번 클릭 할 때마다 하위 뷰를 확장/축소하려면 해당 기능으로 훌륭하게 연주하기를 원했습니다. 이것이 내가 한 일입니다.

(이 예에서 splitView 입니다 NSSplitView 그 자체, splitViewSubViewLeft 확장/붕괴하고 싶은 하위 뷰입니다. lastSplitViewSubViewLeftWidth 유형의 인스턴스 변수입니다 CGFloat.)

// subscribe to splitView's notification of subviews resizing
// (I do this in -(void)awakeFromNib)
[[NSNotificationCenter defaultCenter]
 addObserver:self
 selector:@selector(mainSplitViewWillResizeSubviewsHandler:)
 name:NSSplitViewWillResizeSubviewsNotification
 object:splitView
 ];

// this is the handler the above snippet refers to
- (void) mainSplitViewWillResizeSubviewsHandler:(id)object
{
    lastSplitViewSubViewLeftWidth = [splitViewSubViewLeft frame].size.width;
}

// wire this to the UI control you wish to use to toggle the
// expanded/collapsed state of splitViewSubViewLeft
- (IBAction) toggleLeftSubView:(id)sender
{
    [splitView adjustSubviews];
    if ([splitView isSubviewCollapsed:splitViewSubViewLeft])
        [splitView
         setPosition:lastSplitViewSubViewLeftWidth
         ofDividerAtIndex:0
         ];
    else
        [splitView
         setPosition:[splitView minPossiblePositionOfDividerAtIndex:0]
         ofDividerAtIndex:0
         ];
}

다른 팁

붕괴하려는 서브 뷰를 숨기기 만하면됩니다.

[aSubViewToCollapse setHidden:YES];

또한 대의원 메소드를 구현할 수도 있습니다 -(bool) splitview : thuthhidedivideratindex : audrapsed시 분할을 숨기려면 예를 돌려보십시오.

위의 솔루션을 시도했는데 IssubViewCollapsed가 예를 반환하지 않았기 때문에 작동하지 않는 것으로 나타났습니다.

제안의 조합은 작동하는 결과를 산출했습니다.

if ([splitViewTop isHidden]) {
    [splitViewTop setHidden:NO];
    [split
     setPosition:previousSplitViewHeight
     ofDividerAtIndex:0];
}
else {
    [splitViewTop setHidden:YES];
}
[split adjustSubviews];

제안을 실험 한 후 이것은 내가 찾은 가장 쉬운 해결책이었습니다.

-(void)toggleCollapsibleView:(ib)sender {
   [collapsibleView setHidden:![splitView isSubviewCollapsed:collapsibleView]];
   [splitView adjustSubviews];
}

이 함수는 사용자 정의 된 일류 응답 조치입니다. 메뉴 항목 (또는 키 스트로크)에 의해 트리거됩니다. 가단식 View는 분할 뷰의 하위 뷰입니다. 둘 다 IB에 속성과 연결되어 있습니다.

El Capitan에서 이것은 나를 위해 속임수를 썼습니다.

splitViewItem.collapsed = YES;

NSSplitView 실제로 개인 방법 -(void)_setSubview:(NSView *)view isCollapsed:(BOOL)collapsed 그렇게합니다. 개인 방법 사용에 대한 모든 경고를 무시하고 싶은 사람들 : 보라 :

- (void)toggleSubview:(NSView *)view {
    SEL selector = @selector(_setSubview:isCollapsed:);
    NSMethodSignature *signature = [NSSplitView instanceMethodSignatureForSelector:selector];
    NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    invocation.target = self;
    invocation.selector = selector;
    [invocation setArgument:&view atIndex:2];
    BOOL arg = ![self isSubviewCollapsed:view];
    [invocation setArgument:&arg atIndex:3];
    [invocation invoke];
}

나는 이것을 범주로 구현했다 NSSplitView. 유일한 문제는 Xcode가 경고를한다는 것입니다. _setSubview:isCollapsed: 선언되지 않은 ... 나는 그 점을 어떻게 해결 해야할지 잘 모르겠습니다.


El Capitan 업데이트

나는 ~ 2 년 동안 OS X에 대한 코드를 작성하지 않았으므로 이것을 확인할 수 없었지만 레몬 모조 아래 의견에서 _setSubview:isCollapsed: El Capitan에서 이름이 바뀌 었습니다 _setArrangedView:isCollapsed:.

Macos Sierra에서 collapsed 속성이 변경됩니다 isCollapsed. 속성을 설정하는 것만으로 간단합니다 true 또는 false. 다음 코드는 내 것입니다 WindowController, 내가 두 사람이있는 곳 SplitViewItem에스.

@IBAction func toggleMap(_ sender: Any) {
    if let splitViewController = contentViewController as? NSSplitViewController {
        let splitViewItem = splitViewController.splitViewItems
        if splitViewItem.first!.isCollapsed {
            splitViewItem.first!.isCollapsed = false
        } else if splitViewItem.last!.isCollapsed {
            splitViewItem.last!.isCollapsed = false
        } else {
            if splitViewItem.first!.isCollapsed {
                splitViewItem.first!.isCollapsed = false
            }
            splitViewItem.last!.isCollapsed = true
        }
    }
}

신속 하게이 효과가 있습니다

func togglePanel() {
    let splitViewItem = self.mySplitView.arrangedSubviews

    if mySplitView.isSubviewCollapsed(outline.view){
        splitViewItem[0].hidden = false
    } else {
        splitViewItem[0].hidden = true
    }

IBACTION에서 이것을 호출하십시오. 개요는 자체 XIB가있는 개요 ViewController입니다. 따라서보기가 필요합니다. 따라서 개요는 간단하지만 간단하게 유지하지만 아이디어를 얻을 수 있기를 바랍니다.

@IBAction func segmentAction(sender: NSSegmentedControl) {
    splitVC?.togglePanel(sender.selectedSegment)
}

그리고

func togglePanel(segmentID: Int) {
    let splitViewItem = self.mySplitView.arrangedSubviews

    switch segmentID {

    case segmentID:
        if mySplitView.isSubviewCollapsed(splitViewItem[segmentID]) {
            splitViewItem[segmentID].hidden = false
        } else {
            splitViewItem[segmentID].hidden = true
        }
    default:
        break
    }

}

대의원을 구현하십시오

func splitView(splitView: NSSplitView, shouldHideDividerAtIndex dividerIndex: Int) -> Bool {
    return true
}

그리고 10.11과 함께 토글 사이드 바 액션 방법 만 사용할 수 있습니다.nssplitview subview + pane splitter divider의 가시성을 전환하는 방법은 무엇입니까? https://github.com/dis3buted/splitviewcontroller

사용하는 것이 좋습니다 NSSplitViewController 대신, 그리고 NSSplitViewItem.isCollapsed 그들을 통제하기 위해. 이것은 그냥 작동합니다.

let item: NSSplitViewItem = ...
item.isCollapsed = true

이를 제대로 작동 시키려면 주로 뷰 제어기로 분할 UI 구성 요소를 구성해야합니다. 그렇지 않으면 깨질 수 있습니다.

Brandon Walkin 's를 시도해 볼 수 있습니다 Bwtoolkit.

bwsplitview 클래스에는 메소드가 있습니다

- (IBAction)toggleCollapse:(id)sender;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top