为什么我的UIView动画在iOS 5中可以正常工作,但没有iOS 4?

为什么我的UIView动画在iOS 5中可以正常工作,但没有iOS 4?,uiview,ios4,ios5,objective-c-blocks,uiviewanimation,Uiview,Ios4,Ios5,Objective C Blocks,Uiviewanimation,我有一个自定义UIView,其中包含UIImageView、UILabel和UIButton类型的嵌套视图。视图是在如下代码中创建的: - (void)setupView { popupView = [[UIView alloc] initWithFrame:CGRectMake(-116, -61, 247, 59)]; popupView.autoresizingMask = 63; UIImageView *bgImageView = [[UIImageView a

我有一个自定义UIView,其中包含UIImageView、UILabel和UIButton类型的嵌套视图。视图是在如下代码中创建的:

- (void)setupView
{
    popupView = [[UIView alloc] initWithFrame:CGRectMake(-116, -61, 247, 59)];
    popupView.autoresizingMask = 63;
    UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bubble.png"]];
    bgImageView.autoresizingMask = 63;
    [popupView addSubview:bgImageView];
    [bgImageView release];

    textLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 8, 180, 20)];
    textLabel.autoresizingMask = 63;
    textLabel.font = [UIFont fontWithName:@"DefaultNormal" size:16];
    textLabel.text = @"DYNAMIC TEXT";
    [popupView addSubview:textLabel];

    popupButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];
    [rightAccessoryButton setImage:[UIImage imageNamed:@"btn-tick.png"] forState:UIControlStateNormal];
    popupButton.frame = CGRectMake(208, 8, 32, 32);
    popupButton.autoresizingMask = 63;
    [popupView addSubview:rightAccessoryButton];
}
我已经将他们所有的
自动重定大小键设置为63,这基本上就是所有东西都处于ON位置(除了将所有常量放在一行巨大的代码上之外,我不知道更好的方法!)。然后,当他们需要设置弹出窗口的动画时,我会执行以下操作:

- (void)animateIn
{   
    float pw = 247;
    float ph = 59;

    // set the view's initial position
    popupView.frame = CGRectMake(-pw*0.005+8, -ph*0.01-2, pw*0.01, ph*0.01);
    [self addSubview:popupView];

    [UIView animateWithDuration:0.12 delay:0.0 options:UIViewAnimationOptionCurveEaseOut|UIViewAnimationOptionLayoutSubviews animations:^(void) {
        popupView.frame = CGRectMake(-pw*0.55+8, -ph*1.1-2, pw*1.1, ph*1.1);
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.1 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^(void) {
            popupView.frame = CGRectMake(-pw*0.475+8, -ph*0.95-2, pw*0.95, ph*0.95);
        } completion:^(BOOL finished) {
            [UIView animateWithDuration:0.075 delay:0.0 options:UIViewAnimationOptionLayoutSubviews animations:^(void) {
                popupView.frame = CGRectMake(-round(pw/2-8), -ph-2, pw, ph);
            } completion:nil];
        }];
    }]; 
}
看起来有点复杂,但实际上这是与mapview详图索引视图动画相同的动画

唯一的问题是,它在iOS 5设备上运行得非常好,但在iOS 4设备上,一切都是错的!标签根本不显示,按钮出现,然后飞到右上角的录像机,背景图像延伸到错误的大小和位置

其他人对iOS 4中的动画有任何问题吗?我是否必须以不同于当前的方式来完成工作?

(1)您是否在UIView子类的
布局子视图实现中进行手动布局?如果不是,则不应在选项位掩码中使用
UIViewAnimationOptionLayoutSubview
。我不知道这是否是问题所在,但没有必要添加额外的可能错误源

(2) 如有疑问,请使用核心动画。您可以非常方便地将动画序列描述为一个漂亮的动画组。

(1)您是否在UIView子类的
布局子视图实现中进行手动布局?如果不是,则不应在选项位掩码中使用
UIViewAnimationOptionLayoutSubview
。我不知道这是否是问题所在,但没有必要添加额外的可能错误源


(2) 如有疑问,请使用核心动画。您可以非常轻松地将您的动画序列描述为一个很好的动画组。

我目前正在进行另一个项目,但我会尽快尝试。。。谢谢我已经删除了UIViewAnimationOptionLayoutSubviews标志,并且它在iOS 5中仍然可以正常工作,因此非常感谢。我想我需要它来确保正确设置子视图的动画。我将尝试使用核心动画现在,希望它的工作-将报告回来!勾选点#2-最终使用了核心动画,并对内容进行了排序。谢谢您应该在它周围使用括号来显示或显示这2个动画。。(UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionLayoutSubview)@user1518182不正确。如果Objective-C不明白x | y是这里的一个表达式,需要先求值,那么这行代码甚至不会编译。我现在正在做另一个项目,但我会尽快尝试。。。谢谢我已经删除了UIViewAnimationOptionLayoutSubviews标志,并且它在iOS 5中仍然可以正常工作,因此非常感谢。我想我需要它来确保正确设置子视图的动画。我将尝试使用核心动画现在,希望它的工作-将报告回来!勾选点#2-最终使用了核心动画,并对内容进行了排序。谢谢您应该在它周围使用括号来显示或显示这2个动画。。(UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionLayoutSubview)@user1518182不正确。如果Objective-C不明白x | y在这里是一个表达式,需要先求值,那么该行甚至不会编译。