gpt4 book ai didi

ios - 交互式关闭模态时出现故障

转载 作者:可可西里 更新时间:2023-11-01 03:34:09 27 4
gpt4 key购买 nike

我们在通过 UIPercentDrivenInteractiveTransition 实现模态视图 Controller 的交互式关闭(向下拖动模态应该关闭它)时遇到了这个问题。

设置:

  1. 设置 UIViewController 嵌入到 UINavigationController 中,在 UINavigationBar 中至少有一个按钮>
  2. 模态呈现嵌入 UINavigationController 中的另一个 UIViewController,在 UINavigationBar 中至少有一个按钮>
  3. 设置 UIPanGestureRecognizer 模态呈现 UINavigationController 以驱动 UIPercentDrivenInteractiveTransition
  4. UINavigationBar 上按点“按住”它向下拖动模态

问题:

  • 缓慢向下拖动时,动画故障导致模态视图上下跳动

  • 故障仅在以下情况出现:

    1. 两个 UINavigationBar 上至少有一个按钮
    2. 您通过 UINavigationBar 上的点“按住”模态

可以从github repo 下载最小示例.

有人遇到过这样的问题吗?有什么解决方法吗?我们的设置有什么缺陷吗?

更新

问题已在 iPhone 5 模拟器上模拟运行上述项目,使用 iOS 9.3OSX 10.11.4,使用 Xcode 7.3.1 编译>.

更新 2

进一步的调查表明,这个问题可能不在动画中:由于某些原因,在给定的设置中 pan.translationInView(view) 正在返回导致动画跳转的意外值。

部分解决方法

根据 Vladimir 的想法,我们通过覆盖 UINavigationBarhitTest 方法部分解决了这个问题:

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
}
}

最佳答案

非常有趣的故障。几天前我找到了这个问题的部分解决方案,但由于没有人找到完整的解决方案,所以我会发布这个,也许会有帮助。

如果您重写 UINavigationBarhitTest 方法,您可以通过按住 UINavigationBar 拖动模式来解决此问题:

extension UINavigationBar {

override public func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {

guard let view = super.hitTest(point, withEvent: event) else { return nil }

if view.isKindOfClass(UIControl) {
return super.hitTest(point, withEvent: event)
} else {
return nil
}
}
}

不幸的是,如果您通过按住 UINavigationBar 上的 UIBarButtonItem 来拖动模态,问题仍然存在。

您也可以尝试另一种方法。

如您所见,pan.translationInView(view) 返回不正确的值,导致动画跳转。在拖动过程中,您需要将此值与模态视图的 y 坐标进行比较。您可以通过检查模态视图 Controller 的表示层来获取此值:

...

let translation = pan.translationInView(view)

if let layer = view.layer.presentationLayer() {
print(layer.frame.origin.y)
}

...

你可以看到,当 pan.translationInView(view) 开始显示错误值时,layer.frame.origin.y 在那一刻仍然是正确的。您可以比较这两个值并在值不正确时找到模式,并通过向 translation.y 值添加几个点来更改它以更正。

关于ios - 交互式关闭模态时出现故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37203706/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com