动画 UIView 帧更改而不移动动画(即位置之间的交叉溶解)

Posted

技术标签:

【中文标题】动画 UIView 帧更改而不移动动画(即位置之间的交叉溶解)【英文标题】:Animate UIView frame change without move animation (i.e. cross dissolve between locations) 【发布时间】:2015-03-03 01:53:23 【问题描述】:

我有四个UIViews,位于我全视图的四个侧面,例如

        View 3
View 4          View 2
      View 1

(注意底视图有一点偏移)

它们都是 44x44 像素,看起来完全一样。

我让视图逆时针移动到下一个视图的位置(即视图 1 移动到视图 2,视图 2 移动到视图 3,等等),视图 4 移动到视图 1,但是不偏移。这部分工作正常,代码如下:

[UIView animateWithDuration:0.5 animations:^
    [view1 setFrame:view2.frame];
    [view2 setFrame:view3.frame];
    [view3 setFrame:view4.frame];
    [view4 setFrame:centerFrame];
 completion:^(BOOL finished) 
    [self reloadData];
];

centerFrame 是 view1 的框架没有偏移。

reloadData 方法中,帧被移回原来的位置,并且,因为它们看起来都一样,用户应该看到的唯一的事情是底部视图的移动回到它的偏移位置(虽然它确实从 view4 变为 view1)。这个变化看起来有点突然,我想为它制作动画,但我不希望视图向后移动,只需交叉溶解,这样只有底部视图看起来发生了变化。我试过了:

[UIView transitionWithView:self.view duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^
    // Reset frames
 completion:nil];

[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^
    // Reset frames
 completion:nil];

但两者都会移动视图。所以我的问题,

如何使用交叉溶解动画为 UIView 帧更改设置动画,而不是在点之间移动?

提前致谢!

【问题讨论】:

明显的建议,但你试过玩 alpha 吗? @MendyK 这将涉及制作具有相同属性的另一个视图、更改一些视图的 alpha 值以及移动框架,我希望有一个更简单的解决方案。 【参考方案1】:

您可以为alpha = 0 设置动画,更新完成块中的帧,然后为alpha = 1 设置动画。将每个动画块的持续时间设为通常的 1/2,这样它们一起将花费与旋转事件相同的时间。

如果您想同时溶解然后复制所有视图,设置它们的alpha = 0,更新它们的帧,然后为两个组的 alpha 设置动画: old views'.alpha = 0new views'.alpha = 1

第三种解决方案 - 将所有视图分组到一个子视图中,复制整个层次结构,然后使用 options:UIViewAnimationOptionTransitionCrossDissolve 为它们之间的过渡设置动画

【讨论】:

以上是关于动画 UIView 帧更改而不移动动画(即位置之间的交叉溶解)的主要内容,如果未能解决你的问题,请参考以下文章

使用自动调整子视图大小为 UIView 帧大小更改动画

UIView 动画未在值更改事件上设置动画

UIView 帧动画“摆动”

ImageView 的 UIView 动画帧

使用动画更改 CollectionView 位置,但在第一次滚动时向后移动

将 CALayer 更改应用到 UIView