UIButton not interacting during animation

后端 未结 5 1916
滥情空心
滥情空心 2020-12-11 15:26

I\'m trying to animate a UIButton. But during it\'s animation, there is no interaction with the UIButton. Expected behavior is to be able to click on the button while it\'s

相关标签:
5条回答
  • 2020-12-11 16:03

    There were some questions here recently about this. The animation is purely visual. You can tap the button in it'd old frame until the animation is complete, when it finishes, the actual button jumps.

    EDIT:

    This answer is what I was referring to. You need to manually move the button with an NSTimer, apparently. See the linked question/answer for more.

    Other folks suggest passing UIViewAnimationOptionAllowUserInteraction as a UIViewAnimation option.

    0 讨论(0)
  • 2020-12-11 16:03

    Try setting the animation option to UIViewAnimationOptionAllowUserInteraction.

    [UIView animateWithDuration:.2
                          delay: 0
                        options: UIViewAnimationOptionAllowUserInteraction
                     animations:^{ 
                         // animation logic
                     }
                     completion:^(BOOL completed) { 
                         // completion logic
                     }
     ];
    
    0 讨论(0)
  • 2020-12-11 16:03

    This problem is caused by large animations per block. I made an NSTimer based solution, like the one suggested above, and it worked... yet the movement was jerky (unless I inserted animation within every timer event trigger).

    So, since animation was required anyway, I found a solution which requires no timer. It animates only a short distance and thus the button click is still accurate, with only a small error which is my case is very unnoticeable in the UI, and can be reduced depending on your params.

    Note below that the error at any given time is < 15.0, which can be reduced for more accuracy depending on your animation speed requirements. You can also reduce the duration time for more speed.

    - (void)conveyComplete:(UIView*)v
    {
        [self convey:v delay:0];
    }
    
    - (void)convey:(UIView*)v delay:(int)nDelay
    {
        [UIView animateWithDuration:.5 
                              delay:nDelay
                            options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)  
                         animations: ^
                        {
                            CGRect rPos = v.frame; 
                            rPos.origin.x -= 15.0;
                            v.frame = rPos;
                        }
                        completion: ^(BOOL finished)
                        {
                            [self conveyComplete:v];
                        }];
    
    }
    
    0 讨论(0)
  • 2020-12-11 16:05

    For swift 4 this code works,

    UIView.animate(withDuration: 2, delay: 0, options: [.autoreverse, .repeat, .allowUserInteraction],
                       animations: {
                        self.btnCashGame?.frame.origin.y -= 15
    
    
    
        },completion:  { (finished: Bool) in
            self.btnCashGame?.frame.origin.y += 15
    
        })
    
    0 讨论(0)
  • 2020-12-11 16:08

    Another option is to add a transparent button over the button you are animating. In your particular case you might not be able to use this, as you are moving the button, but you might be able to create an overlay button big enough to cover from the start position to the final one.

    I had this problem, and in my case using UIViewAnimationOptionAllowUserInteraction didn't work. I was animating the alpha of a UIButton inside a UIBarButtonItem (created with initWithCustomView:) to make a pulsating effect, and that option wouldn't work. I don't like the NSTimer option either (not smooth), so in the end I just added an overlay button, which I don't like, but works flawlessly.

    0 讨论(0)
提交回复
热议问题