我使用自动布局来构建我的所有应用布局,以适应所有iPhone和iPad型号。所以我认为自动布局很重要。但是,现在我有一个关键帧自动化,其中视图需要动画到不同的位置。我通过获取另一个视图的位置来实现这一目标:
let last_Pos = destinationImg.superview?.convertPoint(destinationImg.frame.origin, toView: nil)
然后进行关键帧动画,在框架中我设置新坐标,例如:
myView.frame.origin.x = targetViews_lastPos!.x
这打破了自动布局限制。我已经读过这个并且知道很多人建议动画自动布局约束的变化(而不是帧位置)。但是不是有更好的方法吗?这样做会是一场噩梦,因为我正在动画的UIView有一套复杂的约束,设置得恰到好处:
我所定位的位置视图完全不相关(它们嵌套在完全不同的超级视图中)。难道这不需要大量的代码来创建一个我可以用frame.origin在几行中创建的动画吗?还要注意,我让视图在到达目的地后消失,所以无论如何它只是一个临时位置。搞这15个限制做这件事似乎很疯狂。
大多数人如何处理这个具有复杂汽车布局限制的UIViews的噩梦?
答案 0 :(得分:0)
你不会喜欢我的答案,但如果你只想制作一个东西,那么使用外部库是不值得的,这可能非常容易。我所做的是重新思考该动画的布局。 这基本上意味着我尝试制作布局,以便我只需要更改一个约束的一个常量,以使其动画很好。这意味着您将不得不研究如何使您的视图独立而不依赖于其他视图。 实际上它现在是我习惯的东西。我想到了我想要的动画,然后用约束来设计布局。最后通过动画约束更容易做动画,如果你做得好,你不必用手移动每个视图,计算它们应该在哪里,然后放一些魔术数字,自动布局会为你做
答案 1 :(得分:0)
在我看来,最简单的解决方案是保留现有的自动布局限制。如果您投入大量精力来使布局适应各种尺寸等级,那么找到一种替代的自动布局安排会很麻烦。
那么如何让动画不受约束?只要您的视图返回其原始位置,动画离开屏幕,或在动画完成后删除...拍照!
我在另一个帖子中找到了这段代码:
extension UIView {
func takeSnapshot() -> UIImage {
UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.mainScreen().scale)
drawViewHierarchyInRect(self.bounds, afterScreenUpdates: true)
// old style: layer.renderInContext(UIGraphicsGetCurrentContext())
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
您可以这样称呼它:
let picToAnimate = UIImageView(image: originalView.takeSnapshot())
然后使其大小和位置与您拍摄的照片相同:
picToAnimate.frame = CGRectMake(originalView.frame.origin.x, originalView.frame.origin.y, originalView.frame.width, originalView.frame.height)
self.viewToAddItTo.addSubview(picToAnimate)
不要忘记隐藏原文:
originalView.hidden = true
希望这有帮助。