iOS 11 中断行选择
iOS 11 breaks row selection
我最近在 iOS 11 中测试了我的应用程序,但出于某种原因,我无法 select 动态填充的 table 视图中的前 12 行之一.这些行甚至不会触发 didSelectRow。其他行工作正常,但即使向下滚动和向上滚动(到那时应该再次重新使用单元格)前 12 行也不起作用。
即使在静态 table 视图中,切换到该视图控制器时出现在屏幕上的所有单元格都不会响应,它们内部的控件也不会响应,即使它们位于不同的部分。最初在屏幕外的单元格再次正常工作。
我将尝试在带有样板代码的应用程序中对此进行测试,但这是已知错误吗?我在网上找不到任何相关信息。
我在将设备更新到 iOS 11 之后测试了这个,然后在不更改代码的情况下从 Xcode 9 beta 6 再次测试,在迁移到 Swift 4 之后再次测试. 模拟器内的行为相同。最多 iOS 10 一切正常,只有 iOS 11 出现问题。
这将在两周内为用户破坏我的应用程序,我需要修复它,非常感谢任何帮助或建议!
更新: 正如 Paulw11 所建议的,确实有另一个视图阻止了这些行。这不是table,因为第 12 行只能 select 在单元格的下部编辑,而不能在上部编辑。
导致此问题的原因是以下代码:
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 以来,此背景图像似乎呈现在单元格前面。不将容器视图插入 table 视图的视图将解决问题。我试过设置容器层的 zPosition 但它没有帮助。如何再次将背景图像移动到单元格后面。
奇怪的是,这种行为会从 iOS 10 变为 11...
更新 2: 在索引 -1 处插入容器修复了问题:
self.view.insertSubview(container, at: -1)
不过,我不明白为什么会这样,这个索引不应该超出范围吗?
更新 3: 正如 Paulw11 在下面指出的那样,容器完全没用,它是测试遗留下来的,删除它可以解决问题。
container
视图似乎出现在其他视图的前面并阻止触摸到达 table 视图。
顺便说一句,我会看看你是否可以重构它以使用约束;当您看到硬编码的屏幕尺寸时,我总是很担心,因为当新设备发布时它可能会崩溃。
我最近在 iOS 11 中测试了我的应用程序,但出于某种原因,我无法 select 动态填充的 table 视图中的前 12 行之一.这些行甚至不会触发 didSelectRow。其他行工作正常,但即使向下滚动和向上滚动(到那时应该再次重新使用单元格)前 12 行也不起作用。
即使在静态 table 视图中,切换到该视图控制器时出现在屏幕上的所有单元格都不会响应,它们内部的控件也不会响应,即使它们位于不同的部分。最初在屏幕外的单元格再次正常工作。
我将尝试在带有样板代码的应用程序中对此进行测试,但这是已知错误吗?我在网上找不到任何相关信息。
我在将设备更新到 iOS 11 之后测试了这个,然后在不更改代码的情况下从 Xcode 9 beta 6 再次测试,在迁移到 Swift 4 之后再次测试. 模拟器内的行为相同。最多 iOS 10 一切正常,只有 iOS 11 出现问题。
这将在两周内为用户破坏我的应用程序,我需要修复它,非常感谢任何帮助或建议!
更新: 正如 Paulw11 所建议的,确实有另一个视图阻止了这些行。这不是table,因为第 12 行只能 select 在单元格的下部编辑,而不能在上部编辑。
导致此问题的原因是以下代码:
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 以来,此背景图像似乎呈现在单元格前面。不将容器视图插入 table 视图的视图将解决问题。我试过设置容器层的 zPosition 但它没有帮助。如何再次将背景图像移动到单元格后面。 奇怪的是,这种行为会从 iOS 10 变为 11...
更新 2: 在索引 -1 处插入容器修复了问题:
self.view.insertSubview(container, at: -1)
不过,我不明白为什么会这样,这个索引不应该超出范围吗?
更新 3: 正如 Paulw11 在下面指出的那样,容器完全没用,它是测试遗留下来的,删除它可以解决问题。
container
视图似乎出现在其他视图的前面并阻止触摸到达 table 视图。
顺便说一句,我会看看你是否可以重构它以使用约束;当您看到硬编码的屏幕尺寸时,我总是很担心,因为当新设备发布时它可能会崩溃。