【问题标题】:iOS 11 breaks row selectioniOS 11 中断行选择
【发布时间】:2018-02-04 18:12:39
【问题描述】:

我最近在 iOS 11 中测试了我的应用,但由于某种原因,我无法在动态填充的表格视图中选择前 12 行之一。甚至没有为这些行触发 didSelectRow。其他行工作正常,但即使向下和向上滚动(到那时单元格应该已经被再次使用)前 12 行也不起作用。

即使在静态表格视图上,当切换到该视图控制器时出现在屏幕上的所有单元格都不会响应,它们内部的控件也不会响应,即使它们位于不同的部分。最初不在屏幕上的单元格再次正常工作。

我将尝试在具有样板代码的应用中对此进行测试,但这是一个已知错误吗?我在网上找不到任何关于它的信息。

我在将设备更新到 iOS 11 之后测试了这一点,然后在没有更改代码的情况下从 Xcode 9 beta 6 再次进行了测试,并在迁移到 Swift 4 之后再次进行了测试。模拟器中的行为相同。直到 iOS 10 一切都很好,只有 iOS 11 才会出现问题。

这将在两周内为用户破坏我的应用程序,我需要修复它,因此非常感谢任何帮助或建议!

更新: 正如 Paulw11 所建议的,确实有另一个视图阻塞了这些行。这是值得注意的,因为第 12 行只能在单元格的下部选择,而不能在上部选择。

这个问题的原因是以下代码:

extension UIViewController {

  func setBackgroundImage(forTableView tableView: UITableView) {
    let bgImage = UIImage(named: "Background Image.png")

    let bgImageView = UIImageView(image: bgImage)
    tableView.backgroundView = bgImageView

    let rect = bgImageView.bounds
    let effect = UIBlurEffect(style: UIBlurEffectStyle.dark)
    let blurView = UIVisualEffectView(effect: effect)

    let height: CGFloat

    switch screenSize.height {
    case 480, 568: height = 455
    case 736:      height = 623
    default:       height = 554
    }

    blurView.frame = CGRect(x: 0, y: 0, width: rect.width, height: height)

    let container = UIView(frame: rect)
    bgImageView.addSubview(blurView)

    let bgOverlay = UIImage(named: "Background Overlay.png")
    let bgOverlayImageView = UIImageView(image: bgOverlay)
    bgOverlayImageView.alpha = 0.15
    bgImageView.addSubview(bgOverlayImageView)

    self.view.insertSubview(container, at: 1)

  }
}

不知何故,自 iOS 11 以来,此背景图像似乎呈现在单元格前面。不将容器视图插入表视图的视图将解决该问题。我试过设置容器层的 zPosition 但它没有帮助。如何再次将背景图像移动到单元格后面。 奇怪的是,这种行为会从 iOS 10 更改为 11...

更新 2: 在索引 -1 处插入容器可解决问题:

self.view.insertSubview(container, at: -1)

但我不明白为什么会这样,这个索引不应该超出范围吗?

更新 3: 正如 Paulw11 在下面指出的那样,容器完全没用,它是从测试中遗留下来的,删除它可以解决问题。

【问题讨论】:

  • 检查您的视图层次结构;我的猜测是你有一个错误的视图,它阻止了选择那些第一行,但这只是一个猜测,因为你没有做太多的事情。如果你能创建一个minimal reproducible example 会有所帮助
  • 感谢您的帮助,我将创建一个示例。奇怪的是,它在 iOS 11 之前运行良好,没有任何更改,因此没有任何视图阻塞行。
  • 事实证明你是对的,请看我的更新 Paulw11!
  • container 视图的目的是什么?它似乎没有任何东西
  • 伙计,你让我明白了。该容器是测试的剩余物,它不应该再存在了。它曾经包含 bgImageView 和另一个视图。如果您可以将此作为答案发布,我可以接受。非常感谢!

标签: ios iphone xcode uitableview ios11


【解决方案1】:

container 视图似乎出现在其他视图之前,并阻止了触摸进入表格视图。

顺便说一句,我想看看你是否可以重构它以使用约束;当您看到硬编码的屏幕尺寸时,我总是很担心,因为新设备发布时可能会中断。

【讨论】:

    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    相关资源
    最近更新 更多