我正试图找到一种以编程方式调整NSSplitViewItems大小的方法。
假设NSWindow帧大小为500x500px。masterViewItem的宽度为100 of,而subViewItem的宽度为400 of。
当FOO时,我希望masterViewItem折叠到0px (向左),而subViewItem则展开以填充整个窗口(500 0px)。
当BAR时,我希望masterViewItem扩展回100 to,而subViewItem则折叠回原来的400 to。
- (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
}
}但没有效果。有什么建议吗?
发布于 2015-06-30 14:36:44
您必须使用[NSSplitView setPosition:ofDividerAtIndex:]来调整窗格的大小。
我不知道NSSplitViewController是什么,但想必您可以通过它的view属性或其他类似的属性访问NSSplitView。
发布于 2015-07-01 05:49:09
与其将其视为调整大小,不如尝试折叠/取消主视图项。您只需使用NSSplitViewItem的collapsed属性及其animator代理触发崩溃:
if (FOO) {
// Expand subViewItem (collapse the master view item)
masterViewItem.animator.collapsed = YES;不塌陷:
} else if (BAR) {
// Expand masterViewItem while shrinking subViewItem
masterViewItem.animator.collapsed = NO;
}
}在10.11中,有API将主视图项指定为“侧栏”,它对该项具有额外的折叠/未折叠行为(例如覆盖)。
https://stackoverflow.com/questions/31141121
复制相似问题