【问题标题】:UITableViewCellAccessoryCheckmark and AutoLayout constraintsUITableViewCellAccessoryCheckmark 和 AutoLayout 约束
【发布时间】:2014-05-20 21:59:47
【问题描述】:

我有自定义 UITableViewCell 并管理我的单元格的选择。 When the cell is selected and the checkmark is presented, the cell Content View width shrinks and my labels with trailing constraints move to the left.如何有效避免内容移动?

我不想将约束设置为前导,因为我有灵活的 tableview 宽度并且它们是右对齐的。当我想通过IBOutlets 在代码中更新标签的约束时,我遇到了麻烦,因为我在cellForRow: 中返回了UITableViewCell 的多个子类,并且在尝试在代码中设置约束时didSelectRowAtIndexPath: 出现无法识别的选择器错误。任何优雅的解决方案?谢谢。

【问题讨论】:

    标签: ios objective-c uitableview autolayout


    【解决方案1】:

    我有一个类似的(实际上是确切的)问题,复选标记会将所有内容推向左侧。

    - 编辑:

    在我最初回答几个小时后,我意识到这是一个非常简单的问题。

    这种向左的推动是推动单元格的contentView的约束。所以?

    将约束从右侧项目(如 i 按钮)连接到单元格本身,而不是其 contentView。



    - 原始答案(实际答案在上面,这是为了记录):

    我刚刚意识到有一个非常简单的解决方案。当复选标记打开时,我有一个向左推的按钮,我必须保持约束以将其保持在适当的位置(这样“取消选中”不会将按钮移动到右侧)。这是从右侧硬编码的“宽度”,总体而言只是不好的做法。没关系,我无法“获取”该复选标记“宽度”来动态执行此操作。

    解决方案?

    从左边保持一个约束。

    就是这样。我也有一个标签,所以在我的情况下:从左侧按钮到标签(因此它们不会重叠)以及从左侧按钮到左侧内容视图的约束。基本上,右侧的任何移动都不会真正“到达”左侧(而是让所有东西都“坐在”右侧)。

    【讨论】:

    • 两个很好的答案,而且比公认的解决方案简单得多!
    • 这不适用于 Xcode 9、Swift 4、iOS 9.3。自动布局抱怨,并打破了约束。确实,它应该这样做。基本问题是 Apple 的设计缺陷:UITableViewCell 很烂,就像 UITableView 一样。它已经有十年历史了,已经准备好被废弃了。
    • 最近再次使用了这个设置,这里仍然有效(Xcode 9.2)。如果存在约束问题,可能是以前的约束与之冲突。
    【解决方案2】:

    这种行为是设计使然。

    获得所需行为的最简单方法是在每个单元格上设置一个空的附件视图,这会将所有内容向左移动与复选标记相同的距离。

    【讨论】:

    • 别忘了accessoryView优先于accessoryType。如果您有非零的附件视图,则附件类型不会显示。
    • 在 iPhone Xs 模拟器 (12.4) 上运行它时,空的 UIView 会导致附件视图偏离几个像素,从而在显示/隐藏复选标记时造成轻微间隙。使用此解决方案,使其正常工作的唯一方法是使用与复选标记按钮相同的宽度,这不是一个非常灵活的解决方案。
    • 如果使用 Apple 内置的UITableViewCellAccessoryCheckmark,这种方法的挑战是弄清楚“与复选标记相同的距离”是多少距离
    • George,一个空的附件视图将插入与复选标记相同的数量。至少在 2014 年是这样。
    【解决方案3】:

    如何一直把复选标记放在那里,只玩阿尔法/透明度?

        if checked
        {
            cell.accessoryType = .checkmark
            cell.tintColor = cell.tintColor.withAlphaComponent(1)
        }
        else
        {
            cell.accessoryType = .checkmark
            cell.tintColor = cell.tintColor.withAlphaComponent(0)
        }
    

    【讨论】:

    • 好主意。但如果您使用外观代理,则无法使用。例如,UIButton.appereance().tintColor = .red 将导致 cell.tintColor 被忽略。
    • ...但如果您不使用外观代理 (?),这很好用! ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2015-04-02
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多