【问题标题】:Pan gesture used for popping view controller crashing on iOS 7用于弹出视图控制器在 iOS 7 上崩溃的平移手势
【发布时间】:2013-09-19 20:20:43
【问题描述】:

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

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

此时,应用尚未崩溃。

然后,当我尝试再次滑回上一级时,它会崩溃。我只是想弄清楚为什么这个错误在 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];
        }
    }
}

【问题讨论】:

    标签: iphone ios objective-c ios7


    【解决方案1】:

    我怀疑问题出在您的状态。通过对 UIGestureRecognizerStateBegan 和 UIGestureRecognizerStateChanged 的​​测试,委托触发了许多 pop(它们是动画的,因此下一个 pop 被触发,而前一个 pop 仍在动画中)。

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

    另外,当 NavVC 已经处于根目录时,不要担心突然出现在任何地方。不弹出root就足够聪明了。

    (至于为什么这仅在 os7 中表现不佳,我只能推测

    【讨论】:

    • 完美答案。这是解决方案,详细的回复很有帮助。
    • 很高兴它很有用。我在想,如果您希望在识别出手势后立即开始弹出,您可以对此进行测试,然后设置 pan.delegate = nil,或者将其从视图中删除,这样您就不会收到更多消息。不确定这是否会在您的 UI 中看起来更好。 (很容易尝试)。
    • 嗯,我在显示 pdf 的 WebView 上使用了相同的手势,并且出现了与前面提到的相同的崩溃,尽管改变了手势状态,对此有什么想法吗?
    • UIWebView 内置的平移识别器会干扰我的吗?
    • 哎呀。没有把握。看看这个关于让你的 GR 与网络视图很好玩的答案。希望能解决它。 stackoverflow.com/questions/7487182/…
    【解决方案2】:

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

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

    我知道您的问题是您添加了手势识别器以允许用户在任意位置滑动以返回,但(希望)iOS7 用户会很快熟悉从屏幕左边缘滑动。

    【讨论】:

    • 感谢您的评论,但我没有使用 iOS 提供的股票 V 形箭头样式的后退按钮。这不是很好,也不适用于案例。
    【解决方案3】:

    当速度达到 1000 时,它会在每次调用函数时弹出视图控制器,当它的动画为 YES 时,它会在弹出视图控制器之前被调用几次,我认为这会给你带来崩溃。

    【讨论】:

    • 那么为什么iOS 7不喜欢它,而其他版本却不介意呢?最后,关于如何解决这个问题的任何想法先生?谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多