如何使用比例和图层位置为UIView设置动画。

为什么?

iOS开发人员迟早需要在视图之间使用自定义动画。 这通常是位置变化和缩放的混合,主要是将一个视图的框架缩放到另一个视图的框架动画。 您可能首先尝试这样的事情:

有时这会起作用,但如果myView有任何子视图,则不会myView 。 例如,如果myView内部有标签,则myView视图的框架将更改,但标签将保持不变。 相反,我们需要标签与超级视图一起缩放。 我们可以将框架动画应用于标签的框架,但是虽然这会更改标签的大小,但字体不会缩放。 我们需要更好的方法。 我将向您展示如何使用视图的transform属性和图层的position来实现目标。

位置和锚点

在iOS中,每个UIView都有一个带有两个有趣属性的层,用于我们的目的: anchorPointposition 。 这两个属性已连接,更改anchorPoint或图层的position将更改其在父视图中的位置。

position属性是anchorPoint在超级视图中的位置,因此更改anchorPointposition将影响子视图在其容器超级视图中的位置。 position值代表屏幕上的点,因此设置x = 1会将视图向右移动一个点。 anchorPoint值不同。 对于anchorPoint ,设置x = 1将在视图的右边缘设置anchorPoint,而x = 0会将其设置在视图的左边缘。

让我们看动画

让我们用一些动画来阐明所有这些。 从视图和子视图开始:

让我们将初始正方形从

让我们分解一下,从位置开始,使smallSquare最终在容器内部居中。

好的,那很容易。 现在,我们将smallSquare移到中心时将其缩放到其大小的两倍。

很好,看起来不错。 现在,我们可以以此为基础来创建新功能,该功能会将视图从其初始框架移至新框架。

现在我们可以将上面的转换写为

现在为anchorPoint

我们假设anchorPoint始终设置为x:0.5和y:0.5。 这是默认位置,但是有人可能将anchorPoint移到了其他位置,我们需要考虑到这一点。 我们需要从

现在,无论anchorPoint的位置如何,视图都将正确移动和缩放。 出于缩放和位置更改的目的,我们不需要移动图层的anchorPoint,我们可以仅依靠layer.positiontransform来实现源自视图中任何点的动画效果。

摘要

我创建的方法可以使您的生活更轻松,应用程序更流畅。 下面是完整功能,作为对UIView的扩展。 我还将附上一个游乐场文件,以便您可以尝试。