1

我尝试在动画完成中设置背景图像,基本上它可以防止动画发生。这是动画的代码:

    [UIView animateWithDuration: 0.5f animations: ^
                {
                //[buttonPanel setBackgroundImage: [UIImage imageNamed: imageName] forState: UIControlStateNormal];
                CGFloat yOrigin = buttonFrame.origin.y - (self.bounds.size.height - buttonFrame.size.height);
                yOrigin -= buttonFrame.size.height;
                buttonPanel.frame = CGRectMake(buttonFrame.origin.x, yOrigin, buttonFrame.size.width, buttonFrame.size.height);
                }
                completion: ^(BOOL finished)
                    {
                    [UIView animateWithDuration: 0.5f animations:^
                        {
[buttonPanel setBackgroundImage: [UIImage imageNamed: imageName] forState: UIControlStateNormal];
                        [self setAlpha: 1.0f];
                        }];
                    }];

如果我删除 setBackgroundImage: 消息,它只会正确地动画到新的帧位置。为什么?

谢谢你。

4

3 回答 3

2

好的,新的答案!你的评论给了我需要的线索。你说:

使按钮返回初始帧是有原因的。基本上任何操作,例如从此 UIViewController 调用模态 UIViewController 将按钮设置为初始 Fram 位置

正确的。因为显示模态控制器然后关闭它会导致您的视图出现,并导致布局发生。您必须使用自动布局!自动布局会导致这种情况发生。所以这里的问题是您不了解在使用自动布局时如何更改视图的位置/大小(在动画或任何其他时间)。

规则很简单。为束缚而活的人,因束缚而死。如果您使用自动布局,则不得更改任何内容的框架。您必须通过更改约束来进行所有位置/大小调整。

奇妙的是,这通常比改变框架更容易和简单!您不必获取框架、更改框架并分配框架;相反,您通常可以constant直接更改约束。

在此示例中,我为 UITextView 的收缩设置动画,以便当键盘从屏幕底部(iPhone)升起时,整个 UITextView 将可见:

[UIView animateWithDuration:duration.floatValue
                 animations:
 ^{
     self.bottomConstraint.constant = -r.size.height;
     [self.view layoutIfNeeded];
 } completion:nil];

这就是如何为约束设置动画:当您更改 时constant,您还必须在动画的每个瞬间调用layoutIfNeeded以获取新布局。

所以,我并不是说你不使用自动布局是错误的。它是“选择加入”;您可以在需要时开始使用,可以在某些笔尖中使用它,而不是在其他笔尖中使用,等等。但它比旧的布局方式强大得多,并且在许多方面它会导致更简单的代码 - 一旦你知道如何使用它。

于 2012-11-27T01:58:07.830 回答
1

backgroundImage不是可动画的属性,那么为什么要将它设置在动画块中?尝试在所有动画之前设置它。只是一个猜测,但值得一试。

编辑:我刚试过这个:

[UIView animateWithDuration:0.4 animations:^{
    CGRect r = self.otherButton.frame;
    r.origin.y += 100;
    self.otherButton.frame = r;
    [self.otherButton setBackgroundImage:[UIImage imageNamed:@"car.jpg"] 
                                forState:UIControlStateNormal];
}];

它工作得很好。所以我无法重现您的问题。您的代码中是否还有其他事情您没有告诉我们?换句话说,试着把它简化为一个更简单的情况,然后重新构建它,这样你就会发现事情出错的地方。

于 2012-11-25T18:08:17.757 回答
0

好的,

我发现了这个疯狂的问题,我有一个 UIViewController,使用 Autolayout 检查它弄乱了我所有的动画。即使您选中了 UIViewController 使用 Autolayout,它也会弄乱所有控制器,可能是因为我不使用 UINavigationController,而且 segues 是模态的。

这是。

于 2012-11-26T20:33:56.670 回答