NSView调整大小不稳定

时间:2011-09-14 15:53:08

标签: cocoa animation nsview autoresize subviews

我有一个MAAttachedWindowNSWindow的子类),其中包含一个空白视图(contentView)和一些任意子视图(现在是NSImageView)。 在加载时,我试图以动画的方式垂直调整窗口大小100px。

此代码块初始化我的窗口和视图:

_popoverContentView = [[NSView alloc] initWithFrame: aFrame];
NSImageView *img = [[NSImageView alloc] initWithFrame: aFrame];
[img setImage: [NSImage imageName: "@my_debug_image"]];
[img setAutoresizingMask: NSViewHeighSizable];
[_popoverContentView setAutoresizesSubviews: YES];
[_popoverContentView addSubview: img];
popover = [[MAAttachedWindow alloc] initWithView: _popoverContentView attachedToPoint: aPoint inWindow: nil onSide: MAPositionBottom atDistance: aDist];

此代码块负责动画:

NSRect newPopoverFrame = popover.frame;
NSRect newPopoverContentViewFrame = _popoverContentView.frame;

newPopoverFrame.size.height += 100;
newPopoverContentViewFrame.size.height += 100;

[_popoverContentView animator] setFrame: newPopoverContentViewFrame];
[[popover animator] setFrame: newPopoverFrame display: YES animate: YES];

现在这一切都按预期工作(差不多),但是如this video所示,动画不可靠,不稳定和跳跃。我似乎无法确定代码中的原因是什么,或者如何将图像视图锁定到位。

1 个答案:

答案 0 :(得分:1)

我认为问题在于您正在使用新的(ish)动画制作代理来设置窗口框架的动画,同时还使用animate:的{​​{1}} NSWindow setFrame:display:animate:参数。 ,它使用旧的NSViewAnimation API。

这两种动画方法可能存在冲突,因为它们尝试使用不同的代码路径同时为窗口设置动画。

如果您希望动画同时进行,还需要在[NSAnimationContext beginGrouping][NSAnimationContext endGrouping]中对动画代理进行多次调用。

尝试这样做:

[NSAnimationContext beginGrouping];
[_popoverContentView animator] setFrame: newPopoverContentViewFrame];
[[popover animator] setFrame: newPopoverFrame display: YES animate:NO];
[NSAnimationContext endGrouping];

如果这不起作用,您可以放弃使用有问题的setFrame:display:animate:方法,只是单独设置位置和大小的动画:

[NSAnimationContext beginGrouping];
[_popoverContentView animator] setFrame: newPopoverContentViewFrame];
[[popover animator] setFrameOrigin: newPopoverFrame.origin];
[[popover animator] setFrameSize: newPopoverFrame.size];
[NSAnimationContext endGrouping];

动画上下文分组将确保所有内容同时发生。