删除自定义 UITableViewCell 框架问题的行

Posted

技术标签:

【中文标题】删除自定义 UITableViewCell 框架问题的行【英文标题】:Delete Rows of custom UITableViewCell frame issue 【发布时间】:2016-11-07 18:19:22 【问题描述】:

我对 Xcode 和 Swift 编程比较陌生,在我的第一个应用程序中,它由一个带有自定义 TableViewCell 的 tableview 组成,它覆盖变量 frame 以不覆盖视图的整个宽度:

override var frame: CGRect 
        get 
            return super.frame
        

        set 
            var frame = newValue
            frame.origin.x += 175
            frame.size.width -= 350
            super.frame = frame
        
    

一切都按预期工作,但是当我使用self.tableView.deleteRows(at: [path], with: .automatic) 删除 Tableview 单元格时,单元格出现了一个奇怪的问题;看起来单元格再次获得了比旧的新(更小)帧,但只有可见单元格;如果细胞重新加载,问题就消失了。所以它只是在删除之后发生;如果单元格离开屏幕然后再次出现,它会恢复到正常大小。 我的猜测是`newValue 已经是一个自定义框架,然后再次被自定义,这使得它变得更小;但我不知道如何解决这个问题!

以下是 iPad 版的截图:

Normal tableview

After deleting

任何帮助将不胜感激!如果您需要更多信息,请在 cmets 中告诉我!谢谢!

【问题讨论】:

【参考方案1】:

我建议你不要像你那样干涉细胞的框架

    将单元格的backgroundColor 设置为UIColor.clear 在单元格的 contentView 上创建自定义视图,水平居中,比单元格本身窄 350 点。

或者

    使整个tableView的width比屏幕宽度小350点 忘记更改单元格的width

对于第一个建议视图层次结构和自动布局约束将如下所示:

问题在于自定义视图我会遇到更多麻烦 因为每个单元格的高度都不一样

这完全是另一个话题。您应该使用动态单元格高度,在此 RayWenderlich tutorial

中有详细描述

基本上,您需要正确设置自动布局约束并在viewDidLoad中执行此操作:

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140

不鼓励的做法:

我的猜测是`newValue 已经是一个自定义框架,然后得到 再次定制,使其更小;但我不知道怎么做 解决这个问题!

如果您仍想使用您的方法,不要只是减少值,使用UIScreen's 或tableView's width从头计算它

不是这个

frame.origin.x += 175
frame.size.width -= 350

这样做:

frame.origin.x = 175
frame.size.width = UIScreen.main.bounds.size.width - 350

【讨论】:

好的,感谢您的详细解答!从我的角度来看,第一个建议对我来说最有意义,但是您能否提供一些起始代码,如何以及在何处在 contentview 上制作此自定义视图?我有一段时间没有这样做了...谢谢! @EliasDatler 你在使用自动布局吗? 是的,只要我可以。 @alexburtnik 哦,我明白了,您最后建议的方法非常有效!所以问题可能是我没有从头开始计算视图宽度......非常感谢你!我真的很感激 不客气。有关第一种方法的更多详细信息,请参阅更新的答案。

以上是关于删除自定义 UITableViewCell 框架问题的行的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 UITableViewCell 时,imageview 框架为零

使用自定义 UIButton 删除 UITableViewCell

自定义 UITableViewCell 删除子视图

编辑自定义 UITableViewCell 时不出现插入/删除编辑控件

出现删除按钮时重新计算自定义 UITableViewCell 的高度

在 UITableViewCell 中添加自定义编辑和删除按钮