没有完成块的iOS同步动画

时间:2013-12-05 23:53:08

标签: ios objective-c cocoa core-animation objective-c-blocks

我有一个带有标准工具栏的视频播放器。通过向下滑动手势解除工具栏。我还有一个视图(一个真正的面板)可以直接出现在工具栏上方,也可以通过向下滑动手势来解除。当面板和工具栏都打开时,一个向下滑动手势应该关闭面板,第二个将关闭工具栏。问题是,当滑动手势背靠背快速发生时(在面板动画完成之前),工具栏动画会抖动。

- (void)handleSwipe:(UISwipeGestureRecognizer *)gestureRecognizer
{
    UISwipeGestureRecognizerDirection direction = [gestureRecognizer direction];

    if (direction == UISwipeGestureRecognizerDirectionDown) {
        if (![toolbar isHidden]) {
            // Only dismiss the bottom panel if it is open
            if (_selectedSegmentIndex != UISegmentedControlNoSegment) {
                _selectedSegmentIndex = UISegmentedControlNoSegment;
                [bottomPanelView dismissPanel];
            } else {
                CGRect tempRect = CGRectMake(0, self.view.frame.size.height, toolbar.frame.size.width, toolbar.frame.size.height);
                [UIView animateWithDuration:0.25f
                                 animations:^{
                                    // Move the toolbar off the screen.
                                    toolbar.frame = tempRect;
                                 }
                                 completion:^(BOOL finished) {
                                     [toolbar setHidden:YES];
                                 }];
            }
        }
    }
}

[bottomPanelView dismissPanel]位于一个单独的类中,并且不知道调用它的类。它有跟随动画...

[UIView animateWithDuration:self.panelAnimationDuration
                      delay:0.0
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     // slideOutLocation is off the screen 
                     self.view.frame = slideOutLocation;
                 }
                 completion:^(BOOL finished) {
                     [self.view removeFromSuperview];
                     [self removeFromParentViewController];
                     self.panelActive = NO;
                 }];

基本上,当关闭工具栏的动画开始时,dismissPanel动画仍在运行。在模拟器中以慢动作执行双击时,第一个动画看起来很好,但工具栏动画却很抖动。

我知道如何在完成块中嵌套动画,但这不能在这里完成,因为解雇面板和工具栏并不总是想要的。此外,dismissPanel代码在别处处理,不受工具栏的控制。

有没有办法允许多个动画块同时运行而不放置完成块?如果需要澄清,请告诉我!谢谢!

1 个答案:

答案 0 :(得分:1)

我想知道问题是否与自动布局有关(在自动布局打开时设置框架会导致问题)。我尝试了一个简单的测试,通过动画他们的约束常量来动画一个视图和工具栏离开屏幕底部,动画看起来很好。我将IBOutlets设置为各自的底部约束(称为viewBottomCon和toolBarBottomCon)。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.isFirstSwipe = YES;
}

-(IBAction)downSwipe:(UISwipeGestureRecognizer *)sender {
    if (self.isFirstSwipe) {

        self.viewBottomCon.constant = -52;
        self.isFirstSwipe = NO;
        [UIView animateWithDuration:5 animations:^{
            [self.view layoutIfNeeded];
        } completion:nil];

    }else if (!self.isFirstSwipe) {

        self.toolBarBottomCon.constant = -44;
        [UIView animateWithDuration:3 animations:^{
            [self.view layoutIfNeeded];
        } completion:nil];
    }
}

这是一个比你更简单的设置,但我认为它也适用于你的情况。