我有一个MAAttachedWindow
(NSWindow
的子类),其中包含一个空白视图(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所示,动画不可靠,不稳定和跳跃。我似乎无法确定代码中的原因是什么,或者如何将图像视图锁定到位。
答案 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];
动画上下文分组将确保所有内容同时发生。