我有一个默认隐藏了多个标签的自定义单元格(用户在单击单元格时会看到所有内容)。我正在更改单元格的高度,而cell.clipToBounds = true则隐藏标签。但这对可编辑细胞不起作用。当我开始向左滑动单元格时,会出现隐藏的内容。我注意到,如果我首先展开单元格,折叠和滑动,它会起作用,但如果我刷另一个单元格则停止工作。 有什么建议如何在刷细胞时隐藏它?
答案 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()
,cellForRowAtIndexPath
和didSelectRowAtIndexPath
时,我都会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
正如您所看到的,当didSelectRowAtIndexPath
,heightForRowAtIndexPath
被多次调用时,周期性地,直到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