【发布时间】:2016-05-13 07:22:37
【问题描述】:
我们在通过UIPercentDrivenInteractiveTransition 实现模态视图控制器的交互解除(向下拖动模态应该解除它)时遇到了这个问题。
设置:
- 设置
UIViewController嵌入在UINavigationController中,在UINavigationBar中至少有一个按钮 - 模态呈现另一个嵌入在
UINavigationController中的UIViewController,并在UINavigationBar中至少有一个按钮 - 设置
UIPanGestureRecognizer在模态上呈现UINavigationController驱动UIPercentDrivenInteractiveTransition - 在
UINavigationBar上按点将模态向下“按住”
问题:
在缓慢向下拖动时,动画故障导致模态视图上下跳跃
-
故障仅在以下情况出现:
-
UINavigationBars 都至少有一个按钮 - 你在
UINavigationBar点上“持有”模式
-
小例子可以从github repo下载。
有人遇到过这样的问题吗?有什么解决方法吗?我们的设置有什么缺陷吗?
更新
问题已在 iPhone 5 模拟器上运行上面的项目模拟,iOS 9.3,OSX 10.11.4,用 Xcode 7.3.1 编译。
更新 2
进一步调查表明,该问题可能不在动画中:由于某种原因,在给定的设置中 pan.translationInView(view) 正在返回导致动画跳转的意外值。
部分解决方法
根据 Vladimir 的想法,我们通过覆盖 UINavigationBar 的 hitTest 方法部分解决了这个问题:
class DraggableNavigationBar: UINavigationBar {
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
guard let view = super.hitTest(point, withEvent: event) else { return nil }
if view is UIControl || pointIsInsideNavigationButton(point) {
return view
} else {
return nil
}
}
private func pointIsInsideNavigationButton(point: CGPoint) -> Bool {
return subviews
.filter { $0.frame.contains(point) }
.filter { String($0.dynamicType) == "UINavigationItemButtonView" }
.isEmpty == false
}
}
【问题讨论】:
-
为我工作。在我的 iPhone 6 或 iPhone 6 的 iOS 模拟器中看不到任何故障。
-
上面的代码没有问题。像魅力一样工作
-
可以与我分享确切的问题。哪个操作系统类型和 xCode 版本和部署目标等。
-
我已经能够重现故障。只有从
UINavigationBar启动锅时才会发生这种情况。向下拖动,动画跳回到 0%,然后回到预期的 1-2%。取消解雇时也会发生相同的模式,在您达到 0% 后,它会跳回 1-2%,然后又回到 0%。消除故障的事情: 1. 从模态 VC 中删除UIBarButtonItem2. 从呈现的 VC 中删除UIBarButtonItem2. 注释掉modalPresentationStyle分配 -
@bsmith11 是的,这就是我所描述的故障。不幸的是,您提到的解决方案都不适用于我们的案例:注释掉
modalPresentationStyle会导致背景视图控制器消失,我们需要在两个导航栏上都有按钮。
标签: ios uinavigationcontroller modalviewcontroller