用于在iOS 7上弹出视图控制器崩溃的平移手势

时间:2013-09-19 20:20:43

标签: iphone ios objective-c ios7

我有一个平移手势,我在我的应用程序的根视图控制器上添加了第一级,让用户可以在任何地方滑动以转到导航堆栈中的上一级别(手势不在0级别以防止进入变成黑洞:))。这已经奏效,并且在7之前的iOS版本上仍能完美运行。

当我尝试使用iOS 7向后滑动时,我在控制台中收到以下消息: [11050:a0b]嵌套的弹出动画可能导致导航栏损坏 [11050:a0b]在意外状态下完成导航过渡。导航栏子视图树可能已损坏。

此时,应用程序尚未崩溃。

然后,当我再次向后滑动一次时,它会崩溃。我只想弄清楚为什么这个bug在iOS 7中出现了,以及我如何解决它。任何帮助都是适当的,非常感谢!

这是我的代码:

RootViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pop:)];

    pan.delegate = self;

    [self.view addGestureRecognizer:pan];
}

- (void)pop:(UIPanGestureRecognizer*)pan
{
    if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged)
    {
        CGPoint vel = [pan velocityInView:self.view];

        if (vel.x > 1000)
        {
            [self.navigationController popViewControllerAnimated:YES];
        }
    }
}

3 个答案:

答案 0 :(得分:1)

我怀疑问题是你的状态。通过测试UIGestureRecognizerStateBegan和UIGestureRecognizerStateChanged,委托正在触发许多弹出窗口(这些弹出窗口是动画的,因此下一个弹出窗口会在前一个弹出窗口仍然是动画时触发)。

相反,请测试if (pan.state == UIGestureRecognizerStateEnded)以获得您需要的那个。

此外,当NavVC已经在root时,不要担心突然冒出来。它足够聪明,不会弹出根。

(至于为什么这只是在os7中行为不端,我只能推测< ios7逻辑会在弹出过程的早期阶段删除手势识别器。)

答案 1 :(得分:1)

如果在UINavigationController的堆栈中有当前控制器可见的后退按钮,则用户将能够从屏幕的左边缘向右滑动以返回。如果应用程序在iOS7上运行,您可能需要考虑不添加平移手势识别器。

您可以使用[UIDevice currentDevice].systemVersion检查iOS版本。

我意识到你的问题表明你添加了手势识别器以允许用户在任何地方滑动以返回,但是(希望)iOS7用户将很快熟悉屏幕左边缘的滑动。

答案 2 :(得分:0)

当速度达到1000时发生的事情,每次调用函数时都会弹出viewcontroller,当它的动画为YES时,它会在弹出viewcontroller之前多次被调用,我认为它会让你崩溃。