使用图像为 UIView 的位置和大小设置动画的正确方法(此方法在 Xcode 6 中中断)?

Posted

技术标签:

【中文标题】使用图像为 UIView 的位置和大小设置动画的正确方法(此方法在 Xcode 6 中中断)?【英文标题】:Correct way to animate position and size of a UIView with image (this method breaks in Xcode 6)? 【发布时间】:2014-10-02 18:39:56 【问题描述】:

我有一个应用程序,我通过在 animateWithDuration 中调用 setFrame 来同时为 UIView 的位置和大小设置动画,因此:

UIImage *image = [UIImage imageNamed: imageName];    
[_faceView setImage: image];
[_faceView setFrame: CGRectMake(-40.0, 0.0, 40.0, 40.0)];
  [UIView animateWithDuration:0.5 animations:^
    [_faceView setFrame: CGRectMake(80.0, 140.0, 160, 160)];

completion:^(BOOL finished) 

当在 Xcode 5 中编译并在 ios 7 或 iOS 8 中运行时,我使用上述方法获得了正确的行为。

现在,在 Xcode 6 中编译(因此针对 SDK 8.0,我认为这是决定性的区别?),并在 iOS 7 或 iOS 8 中运行,此代码没有达到正确的结果:似乎发生的是图像被动画到它的“自然”大小而不是 CGRect 中指定的大小。

所以:(a) 有人知道为什么会这样吗? (b) 无论哪种方式,我做错了什么是基本问题吗? -- 有没有更“正确”的方法来实现 UIView 中图像位置/大小的动画,从而达到预期的效果?

【问题讨论】:

你不能只为约束设置动画吗?还是必须明确不使用自动布局? 这并不是说它必须明确,只是它是我在 Xcode 6 之前设置的一个项目,我试图以最小的努力更新它的一些位,而不必重新编写整个宇宙……! 这是一个example,我用 Xcode 6 创建了它,它工作正常。 我认为没有任何标志可以在视图上设置说“请将此视图完全从自动布局中排除,并将其放在我告诉您放置的位置并在决定放置位置时忽略它放置其他视图”...? 我相信你可以使用translatesAutoresizingMaskIntoConstraints 【参考方案1】:

默认情况下,即使您没有与视图关联的任何约束,在 Xcode6 中 - IB 也会创建默认约束。这就是为什么在设置框架视图后重新定位到原始框架的原因。

你可以添加一行

_faceView.translatesAutoresizingMaskIntoConstraints = YES;

这基本上会打破现有的限制,但你会得到适当的动画。

但是,我建议重新制作此动画以使用自动布局约束,而不是使用严格的帧设置。

【讨论】:

所以我使用了这个选项,然后动画是正确的,但是一旦动画视图移动,它会扰乱视图中其他元素的位置/大小。这是精神错乱!!!!那么......我如何使用自动布局约束来简单地在屏幕上移动视图而不弄乱其他东西? 如果你用自动布局约束更新了你的视图,那么动画就很容易了。只需将所需的约束暴露为出口(例如与顶部的距离和视图的宽度)并在动画块内更改这些约束。【参考方案2】:

我认为你可以尝试开始使用 Autolayout 来制作动画。我记得,它在 WWDC 会议上被推荐过。

作为一个最简单的例子,如果你想在动画中向右移动一个视图 40 点,你可以在左边添加一个约束,使用 Interface Builder 将它链接到一个IBOutlet like

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *leftConstraint;

动画代码如下:

- (IBAction)animatinoButtonPressed:(id)sender 
    self.leftConstraint.constant = self. leftConstraint.constant + 40.f;
    [UIView animateWithDuration:3.f animations:^
        [self.view layoutIfNeeded];
    ];

layoutIfNeeded 方法将强制视图立即重新排列子视图,从而移动目标视图并制作动画。

我认为您可以根据自己的情况创建合适的约束并制作正确的动画。

【讨论】:

以上是关于使用图像为 UIView 的位置和大小设置动画的正确方法(此方法在 Xcode 6 中中断)?的主要内容,如果未能解决你的问题,请参考以下文章

UIView 子视图没有动画

在位置之前为 UILabel 尺寸设置动画

动画父 UIView 的框架(大小)时自动调整 UILabel 的框架

如何使用 ViewWillLayoutSubview 为 UIView 框架设置动画

UIView动画中的UIButton字体大小问题

来自 UITableView 的动画 UIView