animateWithDuration 在升级到 xcode 4.6 后导致 ios4 上的触摸事件出现问题

Posted

技术标签:

【中文标题】animateWithDuration 在升级到 xcode 4.6 后导致 ios4 上的触摸事件出现问题【英文标题】:animateWithDuration causing problems with touch events on ios4 after upgrade to xcode 4.6 【发布时间】:2013-02-24 23:57:44 【问题描述】:

在升级到 xcode 4.6 之前,我有一个运行良好的应用程序。升级 xcode 4.6 后,在 ios4 上运行时没有收到触摸事件(在 ios5 和 ios6 上运行良好)。我尝试在 IB 中添加一个开关(未连接,只是添加)。我可以在 ios5 和 ios6 设备上切换模拟器中的开关,但在 ios4 上我什至无法移动开关。

我有一个在计时器上运行的小动画:

- (void)setFoamSize:(float)foamSize
    
    // foamSize is a number between 0 - 100.  0 is min foam size; 100 is max foam size

    // NSLog(@"setFoamSize %f", foamSize);

    float centerX, centerY;
    float minHeight, minWidth;
    float maxHeight, maxWidth;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    
        centerX     = 70.0;
        centerY     = 102.0f;

        minWidth    = 51.0f;
        minHeight   = 37.0f;

        maxWidth    = 111.0f;
        maxHeight   = 86.0f;
    
    else
    
        centerX     = 158.0f;
        centerY     = 151.0f;

        minWidth    = 74.0f;
        minHeight   = 64.0f;

        maxWidth    = 320.0f;
        maxHeight   = 271.0f;
    


    float height = ((maxHeight - minHeight) * foamSize + minHeight);
    float width  = ((maxWidth  - minWidth)  * foamSize + minWidth);

    float x = centerX - width / 2;
    float y = centerY - height / 2;

    float alpha  = MIN(1.0, ((1.0 - 0.7) * foamSize + 0.7));

    @autoreleasepool 

        [UIView animateWithDuration:1.0
                              delay:0.0
                            options: UIViewAnimationOptionCurveLinear
                         animations:^
                             imageViewFoam.frame = CGRectMake(x, y, width, height);
                             imageViewFoam.alpha = alpha;
                         
                         completion:^(BOOL finished)
                         ];
    


如果我注释掉这个动画,那么在 ios 4 中会接收到触摸事件。该动画适用于所有 iOS,并占据屏幕的一小部分(即不与任何按钮或开关重叠)。

为什么这个动画会干扰触摸事件?

更新

如果我将图像更改移到 animateWithDuration 之外,一切正常(即,在 ios4 中接收到触摸事件)

imageViewFoam.frame = CGRectMake(x, y, width, height);
imageViewFoam.alpha = alpha;


@autoreleasepool 

    [UIView animateWithDuration:1.0
                          delay:0.0
                        options: UIViewAnimationOptionCurveLinear
                     animations:^
                        //imageViewFoam.frame = CGRectMake(x, y, width, height);
                        //imageViewFoam.alpha = alpha;
                     
                     completion:^(BOOL finished)
                     ];

更新 2

动画每 1 秒启动一次(因此,持续时间也为 1 秒,我得到了相对平滑的图像增长。它有点锯齿状,但这就是我想要的效果)。

在任何情况下,如果我将持续时间更改为 0.5 秒,那么如果在动画之间触摸对象(但在动画期间触摸对象则不会),触摸事件就会起作用。

所以,看起来虽然 animationWithDuration 实际上是在为某些东西设置动画,但在 iOS4 中触摸事件被忽略了。

【问题讨论】:

【参考方案1】:

我添加了选项 UIViewAnimationOptionAllowUserInteraction

@autoreleasepool 

    [UIView animateWithDuration:1.0
                          delay:0.0
                        options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
                     animations:^
                        imageViewFoam.frame = CGRectMake(x, y, width, height);
                        imageViewFoam.alpha = alpha;
                     
                     completion:^(BOOL finished)
                     ];

感谢mmc的回答here

根据 Apple docs 的说法,动画应该只禁用 imageViewFoam 的用户交互

在动画期间,用户交互被暂时禁用 动画中涉及的所有视图,无论 this 中的值如何 财产。您可以通过指定 配置时的 UIViewAnimationOptionAllowUserInteraction 选项 动画。

所以我不确定为什么事情不正常。在任何 案例,添加选项解决了我的问题。

【讨论】:

以上是关于animateWithDuration 在升级到 xcode 4.6 后导致 ios4 上的触摸事件出现问题的主要内容,如果未能解决你的问题,请参考以下文章

在 navigationItem 中停止 animateWithDuration

animateWithDuration 不可用

Swift UIView.animateWithDuration [重复]

UIView animateWithDuration 动画块之外的动画自动布局视图

UiView.animateWithDuration 不为 Swift3 设置动画

尝试使用 animateWithDuration 时找不到方法 '+animateWithDuration:delay:options:animations:'