如何使用比例和图层位置为UIView设置动画。
为什么?
iOS开发人员迟早需要在视图之间使用自定义动画。 这通常是位置变化和缩放的混合,主要是将一个视图的框架缩放到另一个视图的框架动画。 您可能首先尝试这样的事情:
有时这会起作用,但如果myView
有任何子视图,则不会myView
。 例如,如果myView
内部有标签,则myView
视图的框架将更改,但标签将保持不变。 相反,我们需要标签与超级视图一起缩放。 我们可以将框架动画应用于标签的框架,但是虽然这会更改标签的大小,但字体不会缩放。 我们需要更好的方法。 我将向您展示如何使用视图的transform
属性和图层的position
来实现目标。
位置和锚点
在iOS中,每个UIView都有一个带有两个有趣属性的层,用于我们的目的: anchorPoint
和position
。 这两个属性已连接,更改anchorPoint
或图层的position
将更改其在父视图中的位置。
position
属性是anchorPoint
在超级视图中的位置,因此更改anchorPoint
或position
将影响子视图在其容器超级视图中的位置。 position
值代表屏幕上的点,因此设置x = 1会将视图向右移动一个点。 anchorPoint
值不同。 对于anchorPoint
,设置x = 1将在视图的右边缘设置anchorPoint,而x = 0会将其设置在视图的左边缘。
让我们看动画
让我们用一些动画来阐明所有这些。 从视图和子视图开始:
让我们将初始正方形从
至
让我们分解一下,从位置开始,使smallSquare最终在容器内部居中。
好的,那很容易。 现在,我们将smallSquare移到中心时将其缩放到其大小的两倍。
很好,看起来不错。 现在,我们可以以此为基础来创建新功能,该功能会将视图从其初始框架移至新框架。
现在我们可以将上面的转换写为
现在为anchorPoint
我们假设anchorPoint始终设置为x:0.5和y:0.5。 这是默认位置,但是有人可能将anchorPoint移到了其他位置,我们需要考虑到这一点。 我们需要从
至
现在,无论anchorPoint的位置如何,视图都将正确移动和缩放。 出于缩放和位置更改的目的,我们不需要移动图层的anchorPoint,我们可以仅依靠layer.position
和transform
来实现源自视图中任何点的动画效果。
摘要
我创建的方法可以使您的生活更轻松,应用程序更流畅。 下面是完整功能,作为对UIView的扩展。 我还将附上一个游乐场文件,以便您可以尝试。