【问题标题】:UITableView separator strange behaviorUITableView 分隔符奇怪的行为
【发布时间】:2014-04-30 15:48:13
【问题描述】:

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

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

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

<_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;
}

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

这是 Apple 方面的错误,还是我遗漏了什么?此外,例如,在 iOS 联系人应用程序中,分隔符永远不会隐藏在部分标题上方...

**更新:**

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

额外信息:iOS 7.1

【问题讨论】:

  • 你是如何隐藏分隔符的?
  • 我没有;表格显示时,分隔符隐藏在每个部分的最后一个单元格中。
  • 嗯,我当然没有见过这种行为。您可以向我们展示一个示例项目来证明这一点吗?放在 GitHub 或 Dropbox 中?
  • 我刚刚发现,我可以在股票音乐应用程序中重现这个。歌曲标签,我滚动到一个部分标题(例如字母 E)。节标题上方没有分隔符。我长按 E 部分中的第一个单元格足够长的时间以突出显示,然后滑下以取消选择。分隔符出现在 E 部分上方。iOS 7.1
  • 啊,我明白你的意思了。这可能是苹果的错误。然后尝试将其登录到雷达中。

标签: ios objective-c uitableview uikit


【解决方案1】:

由于这是一个 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;
}

【讨论】:

  • 这是一个很好的解决方法。我必须在代码中创建自定义分隔符视图;界面生成器无法正确处理 0.5pt 视图高度...看不到任何性能问题。
  • 避免使用分数作为视图大小/位置,想想应该如何在非视网膜显示器上呈现...
  • 幸运的是,这个项目仅适用于 iOS 7.0+ 和 iPhone;所以所有需要支持的设备都有视网膜屏。虽然是合法的警告。
【解决方案2】:

不过,我在另一种情况下遇到了这个问题,我的单元格处于编辑模式,但这无关紧要。就我而言,我不希望在选择单元格后显示底部 _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 设置为默认值。希望这可以帮助那里的人!

【讨论】:

    【解决方案3】:

    从 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)];
    }
    

    【讨论】:

    • @ShahzaibMaqbool 这是我的荣幸.. :)
    【解决方案4】:

    就我而言,它是自定义 UITableViewCell 上的 Clip To Bounds。不小心从情节提要中取消选择它。然后再次将Clip To Bounds 设置为true 即可解决此问题。

    【讨论】:

    • 太棒了.. 非常感谢它对我有用,你节省了我的时间 :)
    • 它对我有用我不明白剪辑到绑定的意思你能解释一下吗?为什么这对我有用。?
    • clipsToBounds 的官方文档。在一般场景中,当设置为true 时,如果子视图超出父视图,它将剪切子视图。
    • 好的,谢谢@shad
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多