2

我有一个MAAttachedWindow(的子类NSWindow),它包含一个空白视图(contentView)和一些任意子视图(现在是一个NSImageView)。在加载时,我试图以动画方式将窗口垂直调整 100 像素。

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

_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];

现在这一切都(几乎)按预期工作,但是如本视频所示,动画不可靠、摇晃和跳跃。我似乎无法确定我的代码中是什么导致了这种情况,或者如何将图像视图锁定到位。

4

1 回答 1

1

我认为问题在于您正在使用新的(ish)动画代理来为窗口的框架设置动画,同时还使用了更旧的animate:参数NSWindow's setFrame:display:animate:,它使用了旧的NSViewAnimationAPI。

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

如果您希望动画是同时的,[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];

动画上下文分组将确保一切同时发生。

于 2011-09-14T22:15:41.397 回答