在滑动单元格时,clipToBounds不起作用

时间:2015-04-19 14:30:30

标签: uitableview swift swipe

我有一个默认隐藏了多个标签的自定义单元格(用户在单击单元格时会看到所有内容)。我正在更改单元格的高度,而cell.clipToBounds = true则隐藏标签。但这对可编辑细胞不起作用。当我开始向左滑动单元格时,会出现隐藏的内容。我注意到,如果我首先展开单元格,折叠和滑动,它会起作用,但如果我刷另一个单元格则停止工作。  有什么建议如何在刷细胞时隐藏它?

clipToBounds not working for editable cells

4 个答案:

答案 0 :(得分:1)

将标签添加到数组中。

hidden设为true

let labels = [firstLabel, secondLabel, etc.…]
for label in labels {
    label.hidden = true
}

答案 1 :(得分:1)

我认为这是动态和编辑过程中setEditing覆盖或忽略clipsToBounds的错误。

解决方案:

您应该隐藏表格“关闭”时不应出现的所有元素,并在表格展开时取消隐藏它们。

1)创建一个UITableViewCell方法来隐藏/取消隐藏所需的所有元素:

func hideAll(hide: Bool) {
        myLabel.hidden = hide
        myUISwitch.hidden = hide
}

2)初始化单元格时调用上述方法。通常会在单元格内部,初始化程序中调用,或者在cellForRowAtIndexPath上调用。我检查cell.bounds.height以确定是否扩展了单元格:

//cell init code

//I'm calling this method from inside the cell, so I use self here.
//If you're calling this method from your controller you should
//target the cell with cell.bounds.height, as well as targeting the
//cell to call the method: cell.hideAll(Bool)
var hidden = (self.bounds.height < 80) //change this number depending on your collapsed and expanded cell heights
hideAll(hidden)

3)此时(如果在cellForRowAtIndexPath内或在单元初始化程序中调用上述方法),将在创建单元格时以及每次单元格扩展时调用您的方法。但不是当细胞收缩时(更多关于这一点)。因此,在editingStyleForRowAtIndexPath中添加一些代码:

override func tableView(tableView: UITableView,
        editingStyleForRowAtIndexPath indexPath: NSIndexPath)
        -> UITableViewCellEditingStyle{
            if let cell = tableView.cellForRowAtIndexPath(indexPath) as? CustomTableViewCell {
                cell.hideAll(cell.bounds.height < 80) //calls hideAll with a Bool argument, depending on height of cell
            }
            return .Delete
    }

editingStyleForRowAtIndexPath仅在您滑动的单元格上调用,并且不会调用任何委托方法,例如heightForRowAtIndexPath,因此我认为这是隐藏查看项目的最佳位置。< / p>

好的,这就是解决方案。现在为什么:

当您要隐藏这些单元格时,真正的问题是 时隐藏它们。首先,您必须了解快速通过tableViewCell s。

的周期

我假设您正在扩展/收缩heightForRowAtIndexPath上的单元格。从语义上讲,这是完全有道理的。但是假设你有3个细胞(全部可扩展)。每当调用println()cellForRowAtIndexPathdidSelectRowAtIndexPath时,我都会heightForRowAtIndexPath。在下面的例子中,我点击了第一行,然后是第二行,然后是第三行。在控制台上观察结果:

>>>> called didSelectRow at index 0
???? called heightForRow at index 0
???? called heightForRow at index 1
???? called heightForRow at index 2
???? called heightForRow at index 0
==== called cellForRow at index 0
???? called heightForRow at index 0

>>>> called didSelectRow at index 1
???? called heightForRow at index 0
???? called heightForRow at index 1
???? called heightForRow at index 2
???? called heightForRow at index 1
==== called cellForRow at index 1
???? called heightForRow at index 1

>>>> called didSelectRow at index 2
???? called heightForRow at index 0
???? called heightForRow at index 1
???? called heightForRow at index 2
???? called heightForRow at index 2
==== called cellForRow at index 2
???? called heightForRow at index 2

正如您所看到的,当didSelectRowAtIndexPathheightForRowAtIndexPath被多次调用时,周期性地,直到swift确定它具有正确的所有高度。同时,cellForRow在您选择的单元格中仅被称为

因此,如果您选择另一个单元格时单元格会自动折叠,您必须意识到它们在崩溃时没有运行任何代码(例如隐藏元素的方法),因为cellForRowAtIndexPath仅在敲击的细胞。

可以隐藏/取消隐藏heightForRow代码,但该代码被调用了很多次,以至于它真的不是最佳的。代码应该只在您需要时调用一次。因此,IMO的最佳解决方案是在editingStyleForRowAtIndexPath

中调用它

答案 2 :(得分:1)

在您的UITableViewCell子类中,覆盖willTransitionToState(state: UITableViewCellStateMask)方法并将contentView.clipToBounds设置为true,如下所示:

override func willTransitionToState(state: UITableViewCellStateMask) {
    super.willTransitionToState(state)

    contentView.clipsToBounds = true
}

从现在开始,它会正确剪辑单元格的子视图。

答案 3 :(得分:0)

尝试将contentView clipsToBounds属性设置为true。 通常你不应该把这个细胞弄得一团糟。

<强>夫特

cell.contentView.clipsToBounds = true

<强>的OBJ-C

cell.contentView.clipsToBounds = YES