将图像视图动画向上滑动

8

我正在尝试让一个图片视图(如下的logo)向上滑动100像素。我使用了以下代码,但是没有任何反应:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3];
logo.center = CGPointMake(logo.center.x, logo.center.y - 100);
[UIView commitAnimations];

这段代码位于viewDidLoad方法中。具体来说,logo.center = ...这行代码没有起作用。其他的操作(比如改变透明度)是可以的。也许我没有使用正确的代码将其向上滑动?


在viewDidLoad方法中。对此感到抱歉! - Wes Cossick
1
你正在使用自动布局吗? - Rob
同意Rob的观点,从你提供的代码示例中可以看出这似乎是Auto Layout妨碍了你的动画。如果你正在使用Auto Layout,你将不得不动画化约束而不是显式地设置框架。 - sudo rm -rf
我认为我是,虽然我不确定如何表达。如果是这样,我该如何对约束进行动画处理? - Wes Cossick
2个回答

41

对于非自动布局的storyboard/NIB,你的代码没问题。顺便说一下,现在一般建议使用blocks来进行动画:

[UIView animateWithDuration:3.0
                 animations:^{
                     self.logo.center = CGPointMake(self.logo.center.x, self.logo.center.y - 100.0);
                 }];

或者,如果你想更加掌控选项等内容,可以使用:

[UIView animateWithDuration:3.0
                      delay:0.0
                    options:UIViewAnimationCurveEaseInOut
                 animations:^{
                     self.logo.center = CGPointMake(self.logo.center.x, self.logo.center.y - 100);
                 }
                 completion:nil];

但如果您不使用自动布局,您的代码应该可以正常工作。只是上述语法更适用于 iOS 4 及以后的版本。

如果您正在使用自动布局,您需要 (a) 为垂直间距约束创建一个 IBOutlet(如下所示),然后 (b) 您可以执行以下操作:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    static BOOL logoAlreadyMoved = NO; // or have an instance variable

    if (!logoAlreadyMoved)
    {
        logoAlreadyMoved = YES; // set this first, in case this method is called again

        self.imageVerticalSpaceConstraint.constant -= 100.0;
        [UIView animateWithDuration:3.0 animations:^{
            [self.view layoutIfNeeded];
        }];
    }
}

要为约束添加 IBOutlet,只需从约束到您的 .h 文件中助手编辑器中拖动 control-drag:

add IBOutlet for vertical constraint

顺便提一下,如果您正在对约束进行动画处理,请注意您可能已经链接到该图像视图的任何其他约束。通常,如果您将某些内容放在图像下方,它将其约束链接到图像,因此您必须确保没有其他带有对图像的约束的控件(除非您也希望它们移动)。

您可以通过打开您的 storyboard 或 NIB,然后选择“文件检查器”(右侧最右边面板的第一个选项卡,或者按option+command+1(数字“1”)来拉起它),来判断是否使用自动布局:

autolayout on

请记住,如果您计划支持 iOS 6 之前的版本,请确保关闭 “autolayout”。 Autolayout 是 iOS 6 的功能,不适用于早期版本的 iOS。


使用-50的常量将把视图放在屏幕顶部之外。你想要的是原始常量值减去50。 - rdelmar
另外,更奇怪的是,如果视图中有另一个我没有进行动画处理的按钮,它的标题也会发生动画效果。看起来按钮标题可能从按钮框架中的0,0位置开始,就像它失去了原点一样。如果我将您的代码放在viewDidAppear中,则不会发生这种情况。 - rdelmar
@rdelmar同意。是的,那很奇怪。我同意将代码移动到viewDidLoad更符合预期,所以我又调整了我的代码。基于约束的操作有时会违反直觉... - Rob
对于像我这样的新手,我需要添加所有自动布局约束,然后上面的答案就非常好用了(当我只添加垂直空间约束时,UIView没有动画效果,代码也没有显示错误,但是Storyboard会显示约束的错误/警告)。 - tmr
这似乎也适用于“Center Y Alignment”(垂直居中)约束,而不仅仅是“Vertical Space”(距顶部的常量)。谢谢!此外,由于某种原因,在iOS 7中似乎不存在这个问题:动画帧而不是约束,并且不调用layoutIfNeeded()似乎完美地工作(即使在具有自动布局的视图上也是如此)。 - Nicolas Miari
显示剩余5条评论

-1

你试过了吗

logo.frame = CGRectMake(logo.frame.origin.x, logo.frame.origin.y - 100,logo.frame.size.width,logo.frame.size.height)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接