2016-07-28 54 views
2

我已经使用自动布局来构建我的所有应用布局以适应所有iPhone和iPad模型。所以我得到这个自动布局很重要。但是,现在我有一个关键帧自动化,视图需要动画到不同的位置。动画:使用Autolayout,Frame.Origin&Broken Constraints或第三选项?

let last_Pos = destinationImg.superview?.convertPoint(destinationImg.frame.origin, toView: nil) 

,然后做一个关键帧动画,其中在帧我设定的新坐标,例如:

myView.frame.origin.x = targetViews_lastPos!.x 

这是打破自动布局我通过获取其他视图的位置实现了这一约束虽然。我读过关于这个,知道很多人建议在自动布局约束(而不是框架位置)上改变动画。但是没有更好的方法吗?这样做将是一个梦魇的的UIView我有动画的一组复杂的约束都设置得恰到好处:

enter image description here

而且谁的位置,我的定位目标是完全无关的看法(他们嵌套在完全不同的超级视图中)。这不需要大量的代码来创建一个动画,我可以用frame.origin做几行代码?另外请注意,我会在视线到达目的地后消失,因此无论如何它只是一个临时位置。为了做到这一点,用15个约束来搞定似乎很困难。

如何大多数人动画处理具有复杂的自动布局约束UIViews的梦魇?

+0

很少有人有这种复杂的自动布局限制。我不知道你为什么如此复杂。显然我没有看到你的观点,但这似乎是矫枉过正。一种选择是完全丢弃自动布局并使用类似LayoutKit的东西,但这会是一个巨大的痛苦 –

回答

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 

希望这会有所帮助。

0

你不会喜欢我的回答,但是如果你只想动画一件事,那么使用外部库是不值得的,这可以使它非常容易。我所做的是重新思考该动画的布局。 这基本上意味着我尝试进行布局,以便我只需更改一个约束的一个常量即可使其动画效果很好。所以这意味着你必须研究如何使视图独立并且不依赖于其他视图。其实它现在是我习惯的东西。我想到了我想要的动画,然后用约束条件设计布局。在结束它的生命的限制做动画更简单了,如果你做的事情做好,你不会有用手每一个视图中移动,计算,他们应该是,然后把一些魔术数字,汽车布局会替你。