应用进入前景时,UITableViewCells的底部边缘闪烁

时间:2018-08-19 15:39:01

标签: ios swift xcode uitableview

我已经构建了一个包含带有一组单元格的UITableView的应用程序。在单元格内部,我有一个视图,该视图填充了整个单元格。我已经像这样配置了tableview:

tableView.separatorStyle = .none
tableView.backgroundColor = UIColor(red: 24/255.0, green: 34/255.0, blue: 41/255.0, alpha: 100)
tableView.separatorColor = UIColor(red: 26/255.0, green: 34/255.0, blue: 40/255.0, alpha: 100)

每当应用程序进入前台时,我都会看到这些细线闪烁0.5秒左右。明确一点,我不要那些。

enter image description here

这是应用程序完全进入前台时的外观,以及它的外观:

enter image description here

任何想法如何摆脱它们?

编辑1:

我开始怀疑闪烁与分隔符有关,因为它仅发生在部分中的单元格之间,而不发生在部分单元格和部分中的第一个单元格之间。我已经抓取了一些视图层次结构的屏幕快照以及与在单元格中显示的视图(前景视图)相关的约束。

enter image description here enter image description here

编辑2:

如果将顶部和底部约束设置为-2而不是0,则根本没有闪烁,但是并不是我想要的。因此,闪烁根本与分隔符无关。

13 个答案:

答案 0 :(得分:2)

删除单元格分隔符的技巧。

Objective-C

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.tableFooterView = [UIView new];
}

迅速

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.tableFooterView = UIView()
}

答案 1 :(得分:1)

当您返回错误的heightForRowAtIndexPath时,通常会发生闪烁。
就您而言,您返回的位置要比单元格的实际高度小一些。
因此,请尝试将单元格的“ clipToBounds”设置为“ true”,然后检查其是否有效。

答案 2 :(得分:1)

请尝试在info.plist中将“具有边缘抗锯齿效果的渲染”设置为“是”。

答案 3 :(得分:1)

我认为这是您的UITableViewStyle问题。目前,您正在使用UITableViewStyle Grouped。因此,单元格之间的行不是UITableViewCellSeparator,而是Group Table 1像素页眉和页脚空间。所以,

我有两种解决方法:

  • 使用UITableView背景颜色与单元格背景颜色相同。
  • UITableView的样式更改为Plain

GroupTable SS

enter image description here

普通表SS

enter image description here

希望它能对您有所帮助。并解决您的问题:)

答案 4 :(得分:1)

我认为它与分隔符无关,因为分隔符不能覆盖整个屏幕,它必须与您的约束有关,请尝试更改BackgroundContainerViewDepartureCell的背景颜色和TableView,这3个视图之一应具有深灰色作为背景色。

答案 5 :(得分:1)

是否可以从另一个视图继承表视图,并且可以在超类中将 seperatorStyle 设置为不同?然后,您需要覆盖它。

答案 6 :(得分:0)

尝试设置具有完全透明性的tableview分隔符颜色

tableView.separatorColor = UIColor(red: 26/255.0, green: 34/255.0, blue: 40/255.0, alpha: 0)

在viewWillAppear中执行此操作

如果这样不能帮助检查视图层次结构,则可能是

中的单元格渲染存在问题
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)

选中此post及其快速更新4

或尝试将此扩展添加到您的ViewController

extension UITableViewCell {
func removeCellSeparators() {
    for subview in subviews {
        if subview != contentView && subview.frame.width == frame.width {
            subview.removeFromSuperview()
        }
    }
  }
}

然后尝试在返回单元格之前调用它

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath)

    cell.removeSeparators()

return cell
}

如果这没有帮助,请发布更多有关您的设置,代码的信息,或者使用gitHub上存在问题的tableView托管您的应用程序的最低版本,以便我提供帮助。

编辑1:

如果要解决您的问题,请尝试将rowHeight / cellHeight设置为比当前值高15像素,而不是cellHeight需要调整的地方可能是它只需要高2-4像素即可。可能是因为应用程序进入前景时,自动布局正在尝试做它可以显示的所有内容,但是有些约束是模棱两可的,因此从背景进入时,视图会在系统中显示动画,大约半秒钟,并且您的闪烁也是如此。

答案 7 :(得分:0)

在viewDidLoad()中设置

tableView.separatorStyle = .none

答案 8 :(得分:0)

您可以按照以下步骤从情节提要中执行此操作,以避免从UITableView中分离该分隔符。

Do it like this

答案 9 :(得分:0)

如果您设置

tableView.separatorStyle = .none

viewDidLoad()上,它将闪烁

您需要先完成操作,例如在viewWillAppear()或情节提要中

答案 10 :(得分:0)

您是否可以使用Xcode“调试视图层次结构”查找问题视图,并使用“ KVC”删除该视图。 ps。我的英语不好,希望我能帮到你

答案 11 :(得分:0)

  1. 从情节提要中选择表视图分隔符,将其设置为“无”。
  2. 在“分隔符插入”中,选择“ custom”并删除左值,使其从15变为0。
  3. 立即构建并再次运行它。

enter image description here

答案 12 :(得分:0)

使tableView的{​​{1}}和backgroundColor与以下内容完全相同:

separatorColor