我正在尝试找到一种以编程方式调整NSSplitViewItems
的方法。
假设NSWindow
帧大小为500x500px。
masterViewItem
的宽度为100px,而subViewItem
的宽度为400px。
当FOO
时,我希望masterViewItem
折叠到0px(向左),
而subViewItem
扩展以填充整个窗口(500px)。
当BAR
时,我希望masterViewItem
扩展回100px,而subViewItem
折叠回原来的400px。
- (IBAction) onTapOnSomeButton:(NSButton *)sender {
NSWindow *window = [[NSApplication sharedApplication] mainWindow];
NSSplitViewController *splitViewController = (NSSplitViewController *)[window contentViewController];
NSSplitViewItem *masterViewItem =[splitViewController.splitViewItems firstObject];
NSSplitViewItem *subViewItem = [splitViewController.splitViewItems lastObject];
if (FOO) {
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
// Expand subViewItem
} completionHandler:^{
}];
} else if (BAR) {
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
// Expand masterViewItem while shrinking subViewItem
} completionHandler:^{
}];
}
}
我能够为每个项目设置动画,使其看起来像是折叠/展开, 即。
subViewItem.viewController.view.animator.frame = CGRectMake(0, 0, window.frame.size.width, subViewItem.viewController.view.frame.size.height);
但是分隔符不会移动,使两个项目单独移动,并且看起来整个屏幕都不会崩溃/扩展。
我该如何实现?提前谢谢。
更新
所以我做了一些研究,发现了这个:
How to animate the NSSplitView while resizing?
所以我做了这样的代码:
- (IBAction) onTapOnSomeButton:(NSButton *)sender {
NSWindow *window = [[NSApplication sharedApplication] mainWindow];
NSSplitViewController *splitViewController = (NSSplitViewController *)[window contentViewController];
NSSplitViewItem *masterViewItem =[splitViewController.splitViewItems firstObject];
NSSplitViewItem *subViewItem = [splitViewController.splitViewItems lastObject];
if (FOO) {
NSMutableDictionary *collapseMainAnimationDict = [NSMutableDictionary dictionaryWithCapacity:2];
[collapseMainAnimationDict setObject: subView forKey:NSViewAnimationTargetKey];
NSRect newRightSubViewFrame = subView.frame;
newRightSubViewFrame.size.width = splitViewController.splitView.frame.size.width;
[collapseMainAnimationDict setObject:[NSValue valueWithRect:newRightSubViewFrame] forKey:NSViewAnimationEndFrameKey];
NSMutableDictionary *collapseInspectorAnimationDict = [NSMutableDictionary dictionaryWithCapacity:2];
[collapseInspectorAnimationDict setObject: masterView forKey:NSViewAnimationTargetKey];
NSRect newLeftSubViewFrame = masterView.frame;
newLeftSubViewFrame.size.width = 0.0f;
newLeftSubViewFrame.origin.x = splitViewController.splitView.frame.size.width;
[collapseInspectorAnimationDict setObject:[NSValue valueWithRect:newLeftSubViewFrame] forKey:NSViewAnimationEndFrameKey];
NSViewAnimation *collapseAnimation = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects: collapseMainAnimationDict, collapseInspectorAnimationDict, nil]];
[collapseAnimation setDuration:0.3f];
[collapseAnimation startAnimation];
[splitViewController.splitView adjustSubviews];
[splitViewController.splitView setNeedsDisplay: YES];
} else if (BAR) {
// Not yet implemented
}
}
但没有效果。有什么建议吗?
答案 0 :(得分:0)
您必须使用[NSSplitView setPosition:ofDividerAtIndex:]
调整窗格大小。
我不知道NSSplitViewController
是什么,但可能您可以通过其NSSplitView
媒体或其他类似地访问view
。
答案 1 :(得分:0)
而不是将其视为调整大小,听起来您只是试图折叠/取消主视图项目。您可以使用NSSplitViewItem
的{{1}}属性及其collapsed
代理来触发崩溃:
animator
并解开:
if (FOO) {
// Expand subViewItem (collapse the master view item)
masterViewItem.animator.collapsed = YES;
使用10.11,可以使用API将主视图项指定为“侧边栏”,该项目具有该项目的其他折叠/解折叠行为(例如叠加层)。