斯威夫特模仿动画:动画

时间:2015-08-07 11:12:41

标签: ios objective-c iphone xcode swift

我正在使用self.navigationController?.setNavigationBarHidden(true, animated: true)

我想知道在哪里可以看到代码中是如何构建动画的? 我想用另一个自定义UIView模仿它的行为

2 个答案:

答案 0 :(得分:1)

简短的回答:你做不到。没有提供Apple框架的来源。但是,他们的大部分动画都建立在我们第三方开发人员使用的相同Core Animation框架之上。

这会产生什么影响?我不确定我是否已经将视图控制器上的导航栏动画了。你可以发布动画的GIF吗?如果我知道它是什么样的话,我可能会告诉你它是如何完成的。

答案 1 :(得分:1)

动画只是一个向上滑动,因此创建了一个动画,可以更改动画视图的y原点。

如果使用自动布局,则应该有一个顶部约束,指定视图的顶部y位置等于superview的顶部y位置。您可以像使用NSLayoutConstraint一样使用其他故事板元素引用这些@IBOutlet,因此在视图控制器中:

class MyViewController {
    @IBOutlet var viewToAnimate: UIView!
    @IBOutlet var topConstraint: NSLayoutConstraint!
}

您会注意到NSLayoutConstraint具有constant属性,该属性仅指定在使用该约束计算结果布局框架时要添加到第二个约束属性的值。因此,对于topConstraint,您要添加-viewToAnimate.bounds.height *,以便视图的底部位于超级视图顶部的视线之外。

您使用UIView类方法animateWithDuration(_:animations:)为更改设置动画 - 在UIView闭包内更改的任何可设置动画的animation属性都将在指定的{{1}上设置动画}。但是当您更改约束的duration属性时,视图属性不会更改,直到对视图执行另一个布局传递。您可以使布局无效,并使用constant隐式地在下一个通道中进行布局,但我们需要布局传递内部视图的动画块中,以使动画生效。因此,您可以使用view.setNeedsLayout()强制子视图立即布局。

放在一起,你的animate方法看起来像这样:

layoutIfNeeded()

实际上,您可能会指定一种方法,允许您在显示/隐藏状态之间切换,但上面的代码应该让您开始。


* N.B。检查指定约束的方向!如果约束是根据您的超级视图指定的,那么否定class MyViewController { // ... func animateViewUp() { UIView.animateWithDuration(0.3) { self.topConstraint.constant = -self.viewToAnimate.bounds.height self.view.layoutIfNeeded() } } } 会将子视图向下移动!