NSSPlitView의 일부를 프로그래밍 방식으로 확장하고 붕괴시키는 방법은 무엇입니까?
-
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;