如何在iPhone中自定义uitableView分隔符

时间:2009-09-03 18:02:10

标签: iphone uitableview

默认情况下,uitableview中有一个单行分隔符。

但我想将自定义行作为分隔符。

有可能吗?怎么样?

12 个答案:

答案 0 :(得分:82)

如果您想要使用separatorColorUITableView属性更改分隔符的颜色,则可以将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];

这假设您的手机背景颜色是透明的。


上述解决方案来自一些广泛的实验。以下是关于我的发现的一些注意事项,我肯定会帮助别人:

处于正常的“未选择”状态

  • 内容视图(除非您以其他方式编码,否则在您的XIB中是什么)通常是
  • selectedBackgroundView是HIDDEN
  • backgroundView是可见的(因此,如果您的contentView是透明的,您会看到backgroundView或(如果您还没有定义backgroundView,您将看到UITableView本身的背景颜色)

选择了一个单元格,随后出现以下任何动画:

  • contentView中的所有视图/子视图都将其backgroundColor清除(或设置为透明),标签等文本颜色更改为所选颜色
  • selectedBackgroundView变得可见(此视图始终是单元格的完整大小(如果需要,将忽略自定义框架,使用子视图)。另请注意,由于某些原因,子视图的backgroundColor不会显示,也许它们是'重新设置像contentView一样透明。如果你没有定义selectedBackgroundView,那么Cocoa将创建/插入蓝色(或灰色)渐变背景并为你显示它)
  • backgroundView未更改

取消选择单元格后,将开始删除突出显示的动画:

  • selectedBackgroundView alpha属性从1.0(完全不透明)动画到0.0(完全透明)。
  • backgroundView再次保持不变(因此动画看起来像selectedBackgroundView和backgroundView之间的交叉渐变)
  • 只有动画完成后,才会在“未选中”状态下重新绘制contentView,并且其子视图backgroundColor再次可见(这可能会导致您的动画看起来很糟糕,因此建议您不要使用UIView。您的contentView中的backgroundColor)

答案 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

如何使用该课程:

  1. 将UITableView对象的分隔符样式设置为UITableViewCellSeparatorStyle.None

    tableView.separatorStyle = .None
    
  2. 创建MPSTableViewCell

  3. 的子类
  4. awakeFromNib()内的某处设置单元格的分隔符样式
  5. 注意:下面的代码假定单元格是从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)
    }
}