动画 NSSplitview 和窗口大小
Posted
技术标签:
【中文标题】动画 NSSplitview 和窗口大小【英文标题】:Animate NSSplitview and window size 【发布时间】:2012-08-13 09:34:55 【问题描述】:我想要实现的是,当用户按下按钮时,窗口会变大,额外的空间被NSSplitview
面板占用,该面板会展开并增长以填充空间。
我可以轻松地为窗口调整大小和拆分视图独立增长设置动画,但是当我尝试将这两个动画放在一起时,不可避免地会在另一个之前或逐步发生。首先窗口部分调整大小,然后拆分视图调整大小,然后窗口完成调整大小,最后拆分视图也完成。关于为什么会发生这种情况的任何想法?
这是我使用的代码:
- (IBAction)helpButtonPressed:(id)sender
if ([sender isKindOfClass:[NSMenuItem class]]) [sender setState:![sender state]];
NSWindow *window = [[[self windowControllers] objectAtIndex:0] window];
NSRect oldFrame = [window frame];
CGFloat windowWidthAdd;
if ([sender state]) windowWidthAdd = HELP_WIDTH; else windowWidthAdd = -HELP_WIDTH;
NSRect newFrame = NSMakeRect(oldFrame.origin.x, oldFrame.origin.y,oldFrame.size.width+windowWidthAdd, oldFrame.size.height);
[[NSAnimationContext currentContext] setDuration:0.3f];
[NSAnimationContext beginGrouping];
[[window animator] setFrame:newFrame display:YES];
if ([sender state]) [self uncollapseRightView]; else [self collapseRightView];
[NSAnimationContext endGrouping];
-(void)collapseRightView
NSView *right = [[self.splitView subviews] objectAtIndex:1];
NSView *left = [[self.splitView subviews] objectAtIndex:0];
NSRect leftFrame = [left frame];
NSRect overallFrame = [self.splitView frame];
[right setHidden:YES];
[[left animator] setFrameSize:NSMakeSize(overallFrame.size.width,leftFrame.size.height)];
-(void)uncollapseRightView
NSView *left = [[self.splitView subviews] objectAtIndex:0];
NSView *right = [[self.splitView subviews] objectAtIndex:1];
[right setHidden:NO];
CGFloat dividerThickness = [self.splitView dividerThickness];
// get the different frames
NSRect leftFrame = [left frame];
// Adjust left frame size
leftFrame.size.width = (leftFrame.size.width-HELP_WIDTH-dividerThickness);
NSRect rightFrame = [right frame];
rightFrame.origin.x = leftFrame.size.width + dividerThickness;
rightFrame.size.width = HELP_WIDTH;
[[left animator] setFrameSize:leftFrame.size];
[[right animator] setFrame:rightFrame];
【问题讨论】:
【参考方案1】:如果您仔细查看NSSplitView
的类引用,您会发现它符合NSAnimatablePropertyContainer
。这意味着NSSplitView
将为您提供“自身的动画代理”。如果您在NSSplitView
上调用animator
,您将获得此代理,您应该能够在其上以动画方式更改属性。
要调整动画持续时间和计时功能,请使用NSAnimationContext
,方法与之前相同。
最后但同样重要的是:你认出NSSplitView's
minPossiblePositionOfDividerAtIndex:
和maxPossiblePositionOfDividerAtIndex:
了吗?
【讨论】:
以上是关于动画 NSSplitview 和窗口大小的主要内容,如果未能解决你的问题,请参考以下文章
重新渲染 HTML 元素定位在 Javascript 幻灯片动画内的窗口调整大小