【问题标题】:White space before separator line into my TableView分隔线之前的空白进入我的 TableView
【发布时间】:2013-10-30 05:32:54
【问题描述】:

我有一个关于 UITableView 的问题... 我有一个 UITableViewController 并创建了一个自定义单元格。 当我可视化 tableView 时,我看到分隔线之前有一点空白,正如您在此屏幕截图中看到的那样:

为什么?它是默认可视化吗? 我可以改变一些东西来移除这个白色的左边填充吗?

【问题讨论】:

  • 这是按设计完成的。查看 iOS 7 Notes 应用程序以在他们的应用程序中查看它。我同意这很烦人:)
  • [查看适用于 iOS 8 的解决方案][1] [1]:stackoverflow.com/a/25788003/4014757
  • [此解决方案适用于 iOS 8][1] [1]:stackoverflow.com/a/25788003/4014757
  • 如果您关心这一点,请在错误报告器上输入增强“错误”。我刚做了。
  • Apple 刚刚回复我 - 这不是一个错误,它对如何设置颜色有很大的误解。分隔符左侧的像素颜色实际上是单元格背景颜色的一部分(不是 cell.contentsView)。请参阅我的新答案。

标签: iphone ios uitableview interface-builder


【解决方案1】:

iOS 7 中默认提供前导空格,即使对于自定义单元格也是如此。

签出 UITableviewCell 的 separatorInset 属性以删除/添加单元格行分隔符两端的空白间距。

// 删除空格

cell.separatorInset = UIEdgeInsetsZero;

或者,在 UITableView 级别,您可以使用此属性 -

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {  // Safety check for below iOS 7 
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}

更新 - 以下代码适用于 iOS 7 和 iOS 8:

-(void)viewDidLayoutSubviews
{
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

【讨论】:

  • @kozla13 感谢您的指出。现在我更新了上面的答案以使用最近发布的 iOS 8 sdk / Xcode 6。
  • @Ashok 没有空格 - 请参阅我的答案。
  • 这可以直接应用到整个表,因为这个 self.tableView.separatorInset = UIEdgeInsetsZero;
  • 请注意,整个 tableView 解决方案也会相应地移动节标题。
  • 在 Swift 5 中,UIEdgeInsetsZero 已重命名为 UIEdgeInsets.zero
【解决方案2】:

或者,您也可以在界面生成器 (IB) 中进行编辑:

  1. 转到 IB。
  2. 选择表格视图。
  3. 打开右侧的“属性检查器”。
  4. 将“分隔符插入”从默认更改为自定义。
  5. 将“Left”属性从 15 更改为 0。

这与@Ashok 的回答效果相同,但不需要编写任何代码。

更新适用于 iOS 7 和 8

更新适用于 iOS 9

【讨论】:

  • 这适用于 Xcode 7、iOS 9。赞成。这是一个比通过代码更简洁的解决方案。
  • 此解决方案不适用于静态表格视图单元格
  • 这不起作用。具体来说,它会在左侧边距上留下 3 或 4 pts/pxs 的空间。
【解决方案3】:

使用以下代码删除 UITableView 中不需要的填充。它适用于 IOS 8 和 7

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell     forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
    {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    } 

    if ([tableView respondsToSelector:@selector(setLayoutMargins:)])
    {
        [tableView setLayoutMargins:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)])
    {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

【讨论】:

  • 有趣的是,这对我有用,而其他建议却没有。
  • 此线程中的所有其他答案均无效,但这个可以解决问题!我认为大多数其他代码所需的答案缺乏的是这个答案setLayoutMargins 即使在单元格上也是如此! :-) 干杯!
【解决方案4】:

没有空白!我对此输入了一个错误,Apple 只是将其关闭为“不是错误”,但告诉我为什么它不是错误。我写了一个simple project 为应用程序中每个可能的视图设置颜色。我看到的是,这些像素的颜色实际上是单元格本身的背景颜色(不是 contentView!),正如 Apple 告诉我的那样。

cell.contentView.backgroundColor 为绿色,cell.background 颜色为红色(用 Pixie 拍摄):

最后,在没有分隔符的情况下,cell.contentView 完全填满了单元格。使用分隔符,底部有一个或两个像素的间隙。分隔符在插入时填充了大部分间隙,但随后单元格的一些像素会显示出来。

谜团解开!

编辑:似乎根据您配置情节提要的方式, contentView.backgroundColor 会“丢失”或设置为白色。如果您在提供细胞时越过它,您可以获得您想要的行为:

    let cell = tableView.dequeueReusableCellWithIdentifier("FOO", forIndexPath: indexPath) as UITableViewCell

    cell.backgroundColor = UIColor.redColor()
    cell.contentView.backgroundColor = UIColor.greenColor()

【讨论】:

  • 有同样的经历!什么是雷达#?
  • 临时修复是将单元格颜色与 contentView 相同,为 iphone 修复它,但在 ipad 上仍然看到 1 px 分隔符。
  • @allaire,你为什么要看bug号。最后它被关闭为“不是错误”,因为这些像素是您可以控制的视图(cell.backgroundColor)的像素。使它们清晰,然后使颜色与内容视图相同-您可以选择!
  • 由于某种原因,我还设置了单元格的背景以匹配 contentView 的背景,并且这条白线仍然显示在 iPad 上(但不是在 iPhone 上)。
  • @allaire 您一直说它不起作用 - 您是否尝试过我在回答中引用的上传项目?它是一个 iPad 项目。我只是在我自己的 iPad 上运行它并猜猜是什么——这条线是红色的,就像上面的快照一样。下载并自己尝试。玩转视图颜色。
【解决方案5】:

斯威夫特

cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.frame.size.width, 0)
if (cell.respondsToSelector("preservesSuperviewLayoutMargins")){
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
   }

这个对我有用

谢谢

【讨论】:

    【解决方案6】:

    对于那些想要在 Swift 中保留 UIEdgeInsetSettings 并且不使用 Storyboard 的人:

    之前:(默认行为)

    添加以下代码:

    tableView.separatorInset.right = tableView.separatorInset.left
    

    【讨论】:

    • 你不能直接在seperatorInset中分配right或left属性,而是作为整体分配
    • @REALFREE 是的,你可以
    • 看看能不能用self.tableView.separatorInset.right = 0;编译
    【解决方案7】:

    这对我有用:

    cell?.layoutMargins = UIEdgeInsetsZero;
    cell?.preservesSuperviewLayoutMargins = false
    

    【讨论】:

      【解决方案8】:

      这是 swift 3 及更高版本的 UITableViewCell 类的扩展

      extension UITableViewCell
      {
          func removeSeparatorLeftPadding() -> Void
          {
              if self.responds(to: #selector(setter: separatorInset)) // Safety check
              {
                  self.separatorInset = UIEdgeInsets.zero
              }
              if self.responds(to: #selector(setter: layoutMargins)) // Safety check
              {
                  self.layoutMargins = UIEdgeInsets.zero
              }
          }
      }
      

      用法:

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
      {
          let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "menuCellID")!
          // .. Your other code
          cell.removeSeparatorLeftPadding()
          return cell
      }
      

      希望这对某人有所帮助!

      纳雷什。

      【讨论】:

        猜你喜欢
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多