UITableView分隔符奇怪的行为

时间:2014-03-23 10:55:51

标签: ios objective-c uitableview uikit

我有一个简单的样式表,有多个部分。

症状:首次加载表时,每个单元格都有正常的分隔符,但每个部分中的最后一个单元格除外(即"在#34;标题之前)。但是,当滚动时,在某些单元格上会出现分隔符。此外,如果选择了一个单元格,然后取消选择,则会出现分隔符。

打印视图层次结构显示,在干净启动时,隐藏了每个部分中最后一个单元格的分隔符视图,因此我认为这将是正常行为:

<_UITableViewCellSeparatorView: 0x145b1990; 
    frame = (0 47.5; 320 0.5); 
    hidden = YES; 
    layer = <CALayer: 0x145b2950>>

有时滚动;并选择细胞;此隐藏属性将被删除,因此分隔符将显示。

首先假设我做错了事;但这也发生在最基本的hello world应用程序中:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView reloadData];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 4;
}

- (NSInteger)tableView:(UITableView *)tableView 
    numberOfRowsInSection:(NSInteger)section {
    return 2;
}

- (NSString *)tableView:(UITableView *)tableView 
    titleForHeaderInSection:(NSInteger)section {
    return @"test";
}

- (UITableViewCell *)tableView:(UITableView *)tableView 
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *reuseIdentifier = @"TestCell";
    UITableViewCell *cell = [tableView 
        dequeueReusableCellWithIdentifier:reuseIdentifier];
    return cell;
}

屏幕(左:开始后;右:选择单元格后):

start after selecting a cell

这是苹果公司的一个错误,还是我错过了什么?此外,例如,在iOS Contacts应用程序中,分隔符永远不会隐藏在节标题上方...

**更新:**

能否在库存音乐应用中重现此内容:例如歌曲标签,没有语言。选择然后取消选择任何部分的第一个单元格;分隔符出现。

额外信息:iOS 7.1

4 个答案:

答案 0 :(得分:9)

由于这是一个iOS 7.1错误,作为一种解决方法,我建议隐藏内置分隔符,并在每个单元格的底部显示您自己的一个。

隐藏内置分隔符:

[self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

显示自定义分隔符:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *reuseIdentifier = @"TestCell";
    XXYourCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    cell.customSeparatorView.hidden = (indexPath.row == ([self numberOfRowsInSection:indexPath.section] - 1));
    return cell;
}

答案 1 :(得分:3)

就我而言,它是自定义UITableViewCell上的Clip To Bounds。意外地从故事板中取消选择它。然后再次将Clip To Bounds设置为true来解决此问题。

enter image description here

答案 2 :(得分:2)

从iOS 7开始,我建议遵循一些棘手的步骤,以避免这种情况。

将tableView的默认单元格分隔符隐藏为

    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

将自定义视图添加到自定义单元格

CustomCell.h
@property (nonatomic,strong) UIView* cellSeperatorView;

CustomCell.m
@synthesize cellSeperatorView;


-(UIView *)cellSeperatorView{
      if (!cellSeperatorView) {
          self.cellSeperatorView = [[UIView alloc]    initWithFrame:CGRectZero];
        [self.cellSeperatorView setBackgroundColor:[UIColor lightGrayColor]];
         [self addSubview:self.cellSeperatorView];
      }
      return cellSeperatorView;
 }

-(void)prepareForReuse{

     self.cellSeperatorView = nil;

 }

-(void)layoutSubviews{
    [super layoutSubviews];
    [self.cellSeperatorView setFrame:CGRectMake(0, 100, self.width, 1)];
}

答案 3 :(得分:0)

我有一个不同的情况,但是我的单元格处于编辑模式,但这并不重要。在我的情况下,我不希望在选择一个单元格后显示底部_UITableViewCellSeparatorView,所以在查看了我看到的单元格NSLog(@"%@", [cell.subviews[0] subviews]);的子视图后

(
    "<_UITableViewCellSeparatorView: 0x9df7f30; frame = (0 99; 280 1); layer = <CALayer: 0x9dfb800>>",
    "<UITableViewCellContentView: 0x9d65950; frame = (38 0; 242 99.5); opaque = NO; gestureRecognizers = <NSArray: 0x9d2e0d0>; layer = <CALayer: 0x9de8290>>",
    "<_UITableViewCellSeparatorView: 0x9dfab90; frame = (0 99.5; 280 0.5); layer = <CALayer: 0x9dfb7d0>>",
    "<UITableViewCellEditControl: 0x9df3f60; frame = (0 0; 47 100); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9d91370>>",
    "<UIView: 0x9df4470; frame = (0 98; 280 3); layer = <CALayer: 0x9df44d0>>",
    "<UIView: 0x9d35f10; frame = (0 98; 280 3); layer = <CALayer: 0x9d39e20>>"
)

使用此

更容易找到并摆脱恼人的分隔符视图
[[[cell.subviews[0] subviews] objectAtIndex:2] setBackgroundColor:[UIColor clearColor]];

出于某种原因,我对顶部分隔符视图没有问题,很可能是因为我的每个部分中的标题都有一个隐藏分隔符视图的深色背景颜色,但是如果你想覆盖它们,你可能会添加这个代码

[[[cell.subviews[0] subviews] firstObject] setBackgroundColor:[UIColor clearColor]];

请注意,我将此代码放在我的didHighlightRowAtIndexPath委托中。此外,我的单元格selectionStyle设置为默认值。希望这有助于那里的人!