我有一个以编程方式创建的分组UITableview。我也有一个带有xib文件的单元格,也以编程方式填充在tableview中。到现在为止还挺好。但是我只想删除外部分隔线。我使用下面的代码,但是这次删除了所有分隔线。
self.tableView.separatorColor = [UIColor clearColor];
这不是我的情况的好选择。这是我想做的屏幕截图;
<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9uTlVUUS5wbmcifQ==” alt =“在此处输入图像描述”>
我刚刚制定了一个解决方案,因为该单元格的contentView
是UIView
,所以我认为您可以只关注contentView
的底线。
这是我的代码:
首先,必须清除分隔符
tableView.separatorColor = UIColor.clear
其次,在cellForRowAt
功能中:
let bottomBorder = CALayer()
bottomBorder.frame = CGRect(x: 0.0, y: 43.0, width: cell.contentView.frame.size.width, height: 1.0)
bottomBorder.backgroundColor = UIColor(white: 0.8, alpha: 1.0).cgColor
cell.contentView.layer.addSublayer(bottomBorder)
在这里您将看到这样的用户界面:
基于cell.separatorInset = UIEdgeInsetsMake()
解决方法尝试了各种解决方案,但都无法正常工作。
基于库克的答案,但没有计时器:
我有一个类似的问题,我有一个带有自定义单元格的分组UITableView,它们都以Interface Build设计为.xib文件。这些单元格具有白色背景,删除了默认的分隔符,并添加了我自己的分隔符。我还为每个部分定制了标题视图。我将这些“标题视图”的高度设置为44(可以是任何...)。我的部分之间有一个1点高度的视图,这看起来很奇怪。显然,即使我们将自定义高度指定为44,并且我们返回的自定义页眉视图具有白色(或某些具体的背景颜色),系统也会在各节之间添加一些清晰的背景视图。我们在透明视图后面看到的颜色实际上是表格视图背景的颜色。就我而言,表格视图和单元格都必须为白色,并且将表格视图的背景设置为白色可以解决此问题(至少在视觉上是这样,但这还是我想要的)。第二种解决方案是保持Table View的样式简单,但是实现UITableView委托方法以返回2个或更多部分,并在需要时创建自定义标头。但这将使标题视图在滚动时一直停留在顶部一段时间(直到滚动),直到下一节的标题视图离它越来越近,然后它也开始上升(这可能并不是您真正想要的,但是在那里可能是解决此问题的简便方法,但不确定)。
您可以使用以下方式访问视图
尝试此操作将删除顶部的分隔线。
这是可在iOS 8和9上使用的Swift解决方案。
您甚至可以在带有静态单元格的分组UITableView中删除分隔符:
class CustomCell: UITableViewCell {
override func layoutSubviews() {
super.layoutSubviews()
for view in subviews where view != contentView {
view.removeFromSuperview()
}
}
即使在2018年,Google仍将此页面作为此问题的最高结果。使用提供的任何答案,我在iOS 11中都没有运气,所以这是我想到的:
extension UITableViewCell {
func removeSectionSeparators() {
for subview in subviews {
if subview != contentView && subview.frame.width == frame.width {
subview.removeFromSuperview()
}
}
}
}
现在在任何UITableViewCell实例上调用.removeSectionSeparators()都会解决此问题。至少就我而言,节分隔符是唯一与单元格宽度相同的分隔符(因为其他分隔符都缩进了)。
剩下的唯一问题是从哪里调用它。您可能会认为willDisplayCell是最佳选择,但是我发现最初的调用发生在分隔符视图本身生成之前,因此没有骰子。
我最终在返回重新加载的单元格之前将其放入cellForRowAtIndexPath方法中:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyReusableIdentifier", for: indexPath)
Timer.scheduledTimer(withTimeInterval: 0.15, repeats: false) { (timer) in
cell.removeSectionSeparators()
}
return cell
}
感觉不那么优雅,但是我还没有遇到任何问题。
EDIT:看起来我们也需要这个(对于重复使用的单元格:
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
cell.removeSectionSeparators()
}
这里是此代码之前/之后的屏幕截图:
检查视图层次结构后,似乎每个UITableViewCell仅具有三个子视图:内容视图(UITableViewCellContentView
)和两个分隔符视图(_UITableViewCellSeparatorView
)。我不喜欢NSStrings中的动态类实例化(Apple😉也不喜欢)。但是,由于无需使用私有API即可访问contentView
的UITableViewCell
,因此该解决方案非常简单。
这个想法只是迭代UITableViewCell
的子视图,并删除所有不是contentView
的视图:
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
let subviews = cell.subviews
if subviews.count >= 3 {
for subview in subviews {
if subview != cell.contentView {
subview.removeFromSuperview()
break
}
}
}
}
tableView(:willDisplayCell:forRowAtIndexPath:)
在表视图呈现期间被多次调用,因此以上内容通过检查单元格具有多少个子视图来跟踪状态。如果它具有三个子视图,则两个分隔符均保持不变。它还仅删除其中一个分隔符,但是您可以通过删除break
来删除两个分隔符。您还可以通过检查子视图的框架来指定是删除顶部分隔符还是底部分隔符。如果框架的y轴原点为0
,则为顶部分隔符。如果不是0
,则为底部。
希望这会有所帮助!
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let subviews = cell.subviews
guard subviews.count >= 3 else {
return
}
for subview in subviews where NSStringFromClass(subview.classForCoder) == "_UITableViewCellSeparatorView" {
subview.removeFromSuperview()
}
}
这是一个非常老的问题,当搜索如何删除每个部分的顶部和底部分隔符时,它仍然是Google上的第一批条目之一。
经过一番调查后,我发现,如果没有愚蠢的视图层次结构复杂的黑客攻击,苹果公司将无能为力地做到这一点。
幸运的是,有一种绝对简单的方法来获得这种外观:
我说的很简单,但对于初学者来说,这可能很困难,因为缺乏对UITableView
的工作方式以及如何实现自己的单元的了解。让我尝试解释一下:
UITableViewCell
子类@IBOutlet weak var separatorView: UIView!
属性UITableView
的Separator Style
设置为None
以隐藏默认的分隔符UIView
拖动到单元格上并调整其大小,使其位于单元格的底部(或顶部)。使用Size Inspector
的Autoresizing
将其固定到开始/结束/底部,并为其提供可弯曲的宽度(或自动布局,但在这种情况下,那只是在顶部)UITableViewDataSource
的cellForRowAtIndexPath:
中,根据isHidden
是该部分的最后一行(或者如果您的视图位于顶部,则基于第一行),设置自定义分隔符的indexPath.row
属性这里有一些示例代码:
class MyCell: UITableViewCell { @IBOutlet weak var separatorView: UIView! } class ViewController: UITableViewController { override func numberOfSections(in tableView: UITableView) -> Int { return 3 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 3 } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! MyCell cell.separatorView.isHidden = indexPath.row == 2 return cell } }
还有一些屏幕截图:
是的,这是一些工作,但是编码时没有免费的方法。最后,我们是程序员,编写代码取决于我们。花5到10分钟来进行设置总比只复制粘贴一些骇人的代码更好,后者在将来苹果决定更改视图层次结构时可能无法继续工作。
写这个答案实际上比实现分隔符要花更多的工作。我也一直在寻找一种简单快捷的解决方案,但最终没有一个值得我使用的好的解决方案。
我希望您也能看到for循环在单元的子视图上迭代以在运行时从视图层次结构中隐藏或什至删除视图时感到怀疑,当苹果为您提供简便,通用,稳定和面向未来的解决方案时,角落。只需要做7个小步骤,它们就很容易理解。
这是我最终想出的:
用于删除每个部分的分隔线的顶部和底部。将此添加到您的静态单元格。
这里是解决方案。这是针对静态单元格的。如果要动态,则只需重写“ count”。希望对您有所帮助。