默认情况下,uitableview中有一个单行分隔符。
但我想将自定义行作为分隔符。
有可能吗?怎么样?
答案 0 :(得分:82)
如果您想要使用separatorColor的UITableView属性更改分隔符的颜色,则可以将separatorStyle属性设置为UITableViewCellSeparatorStyleNone,然后之一:
例如,如果您的表当前显示5行,则可以将其更新为显示9行,而索引1,3,5,7处的行将是分隔符单元格。
有关如何创建自定义Subclassing UITableViewCell的详细信息,请参阅Table View Programming Guide中的UITableViewCell。
答案 1 :(得分:34)
更好的解决方案是使用单元格的当前宽度和高度。像这样:
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height - 1.0, cell.contentView.frame.size.width, 1)];
lineView.backgroundColor = [UIColor darkGrayColor];
[cell.contentView addSubview:lineView];
答案 2 :(得分:31)
如果您需要不同行的不同分隔符颜色,或者您希望分隔突出显示行时分隔符保持可见,请尝试以下操作:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
// We have to use the borderColor/Width as opposed to just setting the
// backgroundColor else the view becomes transparent and disappears during
// the cell's selected/highlighted animation
UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake(0, 43, 1024, 1)];
separatorView.layer.borderColor = [UIColor redColor].CGColor;
separatorView.layer.borderWidth = 1.0;
[cell.contentView addSubview:separatorView];
这假设您的手机背景颜色是透明的。
上述解决方案来自一些广泛的实验。以下是关于我的发现的一些注意事项,我肯定会帮助别人:
处于正常的“未选择”状态
选择了一个单元格,随后出现以下任何动画:
取消选择单元格后,将开始删除突出显示的动画:
答案 3 :(得分:13)
这些答案会导致突出显示的rect被您添加到单元格的分隔符覆盖(至少在iOS 6上进行测试)。您需要将separatorColor
设置为[UIColor clearColor]
,以便单元格仍然以1px分隔,然后您可以在间隙中绘制分隔符:
- (void)viewDidLoad {
self.tableView.separatorColor = [UIColor clearColor];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// snip
CALayer *separator = [CALayer layer];
separator.backgroundColor = [UIColor redColor].CGColor;
separator.frame = CGRectMake(0, 43, self.view.frame.size.width, 1);
[cell.layer addSublayer:separator];
return cell;
}
答案 4 :(得分:8)
添加tableView的以下代码cellForRowAtIndexPath
委托,为每个单元格创建1px高度和200px宽度的自定义图像视图
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 200, self.view.bounds.size.width, 1)];
lineView.backgroundColor = [UIColor blackColor];
[cell.contentView addSubview:lineView];
注意:我不知道它在性能上有多重。
答案 5 :(得分:4)
我不知道这是否可以通过一些设置“自动”完成。但建议将行分隔符设置为none,并在单元格的边框中实际绘制您想要的行分隔符。
答案 6 :(得分:3)
如果您在Swift中使用自定义单元格:另一种方法是使用可以在该单元格顶部绘制线条的函数来扩展UITableViewCell。
import UIKit
extension UITableViewCell {
func addSeparatorLineToTop(){
let lineFrame = CGRectMake(0, 0, bounds.size.width, 1)
let line = UIView(frame: lineFrame)
line.backgroundColor = UIColor.myGray_300()
addSubview(line)
}
}
然后,您可以将此行添加到任何自定义单元格,例如在awakeFromNib
中override func awakeFromNib() {
super.awakeFromNib()
addSeparatorLineToTop()
}
这个解决方案很不错,因为它不会弄乱你的故事板并将你的额外代码限制在1行。
答案 7 :(得分:1)
在视网膜显示器上,由于抗锯齿,即使绘制0.5单位线也会产生双像素线。要在两个显示器上将其渲染为单个像素,请将其向上移动四分之一单位:
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentView.frame.size.height - (1.0 - 0.25), self.contentView.frame.size.wi
lineView.backgroundColor = [UIColor colorWithRed:(230.0/255.0f) green:(233/255.0f) blue:(237.0/255.0f) alpha:1.0f];
[self.contentView addSubview:lineView];
答案 8 :(得分:1)
在iOS 7(GM)上测试:
@implementation MyTableViewController
- (void)viewDidLayoutSubviews {
for (UIView *view in self.view.subviews) {
if ([view isKindOfClass:NSClassFromString(@"_UITableViewCellSeparatorView")])
view.backgroundColor = [UIColor redColor];
}
}
@end
注意:在某些配置中看起来UITableView 将分隔符移动到单元格,这会使此代码无效,除非您也进入所有UITableViewCells。
答案 9 :(得分:1)
下面的gist中的单元格是UITableViewCell的子类,其中每个单元格可以有自己的多个样式的分隔符(目前仅支持.None和.Default)。 它是用Swift编写的,并假定使用Autolayout。
https://gist.github.com/evgeniyd/fa36b6f586a5850bca3f
如何使用该课程:
将UITableView对象的分隔符样式设置为UITableViewCellSeparatorStyle.None
tableView.separatorStyle = .None
创建MPSTableViewCell
awakeFromNib()
内的某处设置单元格的分隔符样式注意:下面的代码假定单元格是从xib / storyboard
加载的 class FASWorkoutCell: FASTableViewCell {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func awakeFromNib() {
super.awakeFromNib()
separatorType = .Default
}
// ...
}
答案 10 :(得分:0)
如果您使用自定义的UITableViewCell,您只需在UItableViewCell.xib的底部添加UIView,并将背景颜色设置为您想要的颜色。
例如,在xib上我在底部添加一个UIView并将高度设置为1.使用autolayout,我将左约束设置为12,将底部约束设置为0,将右约束设置为0,将高度设置为1.
答案 11 :(得分:0)
Swift版本:
private let kSeparatorTag = 123
private let kSeparatorHeight: CGFloat = 1.5
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)
{
if cell.viewWithTag(kSeparatorTag) == nil //add separator only once
{
let separatorView = UIView(frame: CGRectMake(0, cell.frame.height - kSeparatorHeight, cell.frame.width, kSeparatorHeight))
separatorView.tag = kSeparatorId
separatorView.backgroundColor = UIColor.redColor()
separatorView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
cell.addSubview(separatorView)
}
}