Swift 3,iOS 10,macOS 10.12.4
我正在构建一个可在iOS和Mac上运行的应用。在iOS方面,我已成功动画UIView
。当用户点击某个东西时,会出现一个弹出窗口并将其设置为动画。这是我在点按事件中的代码:
self.popupConstraintX.constant = x
self.popupConstraintY.constant = y
UIView.animate(withDuration: 0.25 , delay: 0.0, options: .curveLinear, animations: {
self.graphPopup.alpha = 1.0
self.layoutIfNeeded()
}, completion:nil)
在这种情况下,self
是指包含UITableViewCell
的{{1}}。
我在Mac方面已经构建了同样的东西,但我试图动画graphPopup
,现在是graphPopup
。这是我目前在点击事件中所拥有的内容:
NSView
此处self.popupConstraintX.constant = x
self.popupConstraintY.constant = y
self.view.layoutSubtreeIfNeeded()
NSAnimationContext.runAnimationGroup({_ in
self.graphPopup.alphaValue = 1.0
//Indicate the duration of the animation
NSAnimationContext.current().duration = 0.25
NSAnimationContext.current().allowsImplicitAnimation = true
self.view.updateConstraints()
self.view.layoutSubtreeIfNeeded()
}, completionHandler:nil)
指的是包含self
。没有任何动画 - 不是NSViewController
的位置或alpha
。它只是在1985年的Atari上出现并消失了。
知道我在graphPopup
动画中做错了什么吗?
更新
为了后人,这里是BJ建议的工作代码(略微调整使用隐式动画上下文:
NSView
答案 0 :(得分:9)
在您启用隐式动画之前,alphaValue
的修改正在发生,因此不会对alpha进行动画处理。我不清楚这是否是故意的。
视图不是popupConstraint
给出的位置的动画,因为你实际上并没有在动画块中做任何会导致视图框架发生变化的事情。为了触发隐式动画,您不仅必须更新约束;您还必须确保视图的frame
在动画块中发生更改。如果您使用的是AutoLayout,通常可以通过调用layoutSubtreeIfNeeded
来完成。
然而,因为您更新了约束并在动画块之前调用了layoutSubtreeIfNeeded()
,所以在块内部没有剩余的帧更改(除非在{中发生了某些事情) {1}}你没有向我们展示过。)
您应该删除对updateConstraints()
的第一次通话,或者如果仍然需要,请将其置于layoutSubtreeIfNeeded()
修改之上。然后,当您在动画块中调用popupConstraint
时,将根据这些更改的约束设置新帧,您应该看到动画正在发生。
答案 1 :(得分:5)
快捷键5
animator()
是关键。
您可以这样做:
NSAnimationContext.runAnimationGroup({_ in
//Indicate the duration of the animation
NSAnimationContext.current().duration = 0.25
self.popupConstraintX.animator().constant = x
self.popupConstraintY.animator().constant = y
self.graphPopup.animator().alphaValue = 1.0
}, completionHandler:nil)