iOS 8 UITableView分隔符插入0不起作用

qui_id 发布于 2019-06-02 ios 最后更新 2019-06-02 20:49 105 浏览

我有一个应用程序,其中UITableView的分隔符插图设置为自定义值 - 右0,左0。这在iOS 7.x中完美工作,但是在iOS 8.0中,我发现分隔符插入在右侧设置为默认15。即使在xib文件中它设置为0,它仍然显示不正确。 我如何删除UITableViewCell分隔边距?

已邀请:

laut

赞同来自:

这是我的解决方案。这适用于自定义单元子类,只需将它们添加到子类中。

  1. - (UIEdgeInsets)layoutMargins {    
        return UIEdgeInsetsMake(0, 10, 0, 10);
    }
    
2。
self.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10);
您可以方便地自定义分隔符的位置,而无需要求您的设计师为您绘制一个..........

cet

赞同来自:

以比投票最多的答案更紧凑的方式......

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

ket

赞同来自:

在Swift中它稍微有些烦人,因为layoutMargins是一个属性,所以你必须覆盖getter和setter。

override var layoutMargins: UIEdgeInsets {
  get { return UIEdgeInsetsZero }
  set(newVal) {}
}
这将有效地使layoutMargins只读,这在我的情况下是好的。

iest

赞同来自:

在3楼看到答案后,我试图找出在TableView和&之间设置分隔符的关系。 TableViewCell并做了一些测试。以下是我的结论:

  1. 我们可以认为将单元格的分隔符设置为零必须分两步移动分隔符:第一步是将单元格的separatorinset设置为零。第二步是将单元格的marginlayout设置为零。
  2. 设置TableView的separatorinset,marginlayout可以影响Cell的separatorinset。但是,从测试中我发现TableView的separatorinset似乎没用,TableView的marginlayout实际上可以影响cell的marginlayout。
  3. 设置Cell的PreservesSuperviewLayoutMargins = false,可以切断TableView对Cells的marginlayout效果。
  4. 其中一个解决方案:
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = UITableViewCell()
    cell.preservesSuperviewLayoutMargins = false
        cell.separatorInset = UIEdgeInsetsZero
        cell.layoutMargins = UIEdgeInsetsZero
    return cell
    }
    

wiusto

赞同来自:

我对上述任何解决方案都没有任何好运。我正在为表格单元格使用NIB文件。我通过添加高度为1的标签“固定”了这个。我将标签的背景更改为黑色,将标签固定到笔尖的底部,然后将其余内容的底部固定到添加的标签上。现在我的细胞底部有一个黑色边框。 对我来说,这感觉更像是一个黑客,但它确实有效。 我唯一的另一个选择是完全消除边界。我还在决定我是否会这样做。

frerum

赞同来自:

我相信这是我在这里提出的问题:Remove SeparatorInset on iOS 8 UITableView for XCode 6 iPhone Simulator 在iOS 8中,从UIView继承的所有对象都有一个新属性。因此,在iOS 7.x中设置SeparatorInset的解决方案将无法删除您在iOS 8中的UITableView上看到的空白区域。 新属性称为“layoutMargins”。

@property(nonatomic) UIEdgeInsets layoutMargins
Description   The default spacing to use when laying out content in the view.
Availability  iOS (8.0 and later)
Declared In   UIView.h
Reference UIView Class Reference
iOS 8 UITableView setSeparatorInset:UIEdgeInsetsZero setLayoutMargins:UIEdgeInsetsZero 解决方案:-
-(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];
   }
}
如果您设置cell.layoutMargins = UIEdgeInsetsZero;而不检查layoutMargins是否存在,则应用程序将在iOS 7.x上崩溃。因此,最好的方法是在setLayoutMargins:UIEdgeInsetsZero之前检查layoutMargins是否存在。

tin

赞同来自:

使用Swift 2.2 创建UITableViewCell extension

import UIKit
extension UITableViewCell {
    func removeMargins() {
if self.respondsToSelector(Selector("setSeparatorInset:")) {
            self.separatorInset = UIEdgeInsetsZero
        }
if self.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
            self.preservesSuperviewLayoutMargins = false
        }
if self.respondsToSelector(Selector("setLayoutMargins:")) {
            self.layoutMargins = UIEdgeInsetsZero
        }
    }
} 
现在您可以在cellForRowAtIndex中使用
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
            cell.removeMargins()//To remove seprator inset 
}

nfugit

赞同来自:

在iOS8中: 将其添加到我的UITableViewCell子类:

- (UIEdgeInsets)layoutMargins {
    return UIEdgeInsetsZero;
}
这到“tableView:cellForRowAtIndexPath”或“tableView:willDisplayCell”:
[editCell setSeparatorInset:UIEdgeInsetsZero];
为我工作。

gquia

赞同来自:

在Swift中你可以使用它

    cell.selectionStyle = UITableViewCellSelectionStyle.None
    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

iest

赞同来自:

每次单元格滚动时(使用willDisplayCell)都不会更新preservesSuperviewLayoutMarginslayoutMargins,我建议在cellForRowAtIndexPath:中执行一次:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = super.tableView(tableView, cellForRowAtIndexPath: indexPath)
cell.preservesSuperviewLayoutMargins = false
    cell.layoutMargins = UIEdgeInsetsZero
return cell
}

miste

赞同来自:

使用下面的代码片段可以避免IOS 8中的UITableView出现不必要的填充问题。 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];
    }
}

det

赞同来自:

让我做我的代码:

-(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 ([tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        cell.preservesSuperviewLayoutMargins = NO;
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

mut

赞同来自:

这在iOS 8和iOS 9中对我来说非常适合。 对于OBJ-C

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(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];
        }
         return cell;
    }

xillum

赞同来自:

enter image description here 使用故事板更改分隔符插入自定义左0和右0, 如果要将分隔符隐藏为无 见上图

gcum

赞同来自:

您可以在应用程序启动时(在加载UI之前)使用UIAppearance一次,将其设置为默认全局设置:

// iOS 7:
[[UITableView appearance] setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];
[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];
// iOS 8:
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {
[[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}
这样,您可以保持UIViewController的代码干净,并且可以随时覆盖它。

vet

赞同来自:

Lukasz在Swift中回答:

    // iOS 7:
    UITableView.appearance().separatorStyle = .SingleLine
    UITableView.appearance().separatorInset = UIEdgeInsetsZero
    UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero
// iOS 8:
    if UITableView.instancesRespondToSelector("setLayoutMargins:") {
        UITableView.appearance().layoutMargins = UIEdgeInsetsZero
        UITableViewCell.appearance().layoutMargins = UIEdgeInsetsZero
        UITableViewCell.appearance().preservesSuperviewLayoutMargins = false
    }

lvero

赞同来自:

iOS 8及更高版本。 Swift 2.0及更高版本:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    if #available(iOS 8.0, *) {
        cell.layoutMargins = UIEdgeInsetsZero
    } else {
        // Fallback on earlier versions
    }
}

fet

赞同来自:

添加这个片段,Swift中的简单优雅适用于iOS8 :)

    // tableview single line
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.preservesSuperviewLayoutMargins = false
    cell.layoutMargins = UIEdgeInsetsZero
}

nsunt

赞同来自:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        // ... Get the cell
        cell.separatorInset = UIEdgeInsetsMake(0.f, 20.f, 0.f, [UIScreen mainScreen].bounds.size.width - 20);
        // others
        return cell;
}
对于要隐藏分隔符的任何特定单元格。

met

赞同来自:

简单地将这两行放在cellForRowAtIndexPath方法中

  • 如果您想要所有分隔线都从零开始 [cell setSeparatorInset:UIEdgeInsetsZero]; [cell setLayoutMargins:UIEdgeInsetsZero];
如果你想要特定的分隔线从零开始,假设这里是最后一行是从零开始
if (indexPath.row == array.count-1) 
{
   [cell setSeparatorInset:UIEdgeInsetsZero];
   [cell setLayoutMargins:UIEdgeInsetsZero];
}
else
   tblView.separatorInset=UIEdgeInsetsMake(0, 10, 0, 0);

iest

赞同来自:

至于cdstamper建议的是什么而不是表视图,在单元格的layoutSubview方法中添加以下行对我有用。

- (void)layoutSubviews 
{
    [super layoutSubviews];
if ([self respondsToSelector:@selector(setSeparatorInset:)])
                [self setSeparatorInset:UIEdgeInsetsZero];
if ([self respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)])
        {
            [self setPreservesSuperviewLayoutMargins:NO];;
        }
if ([self respondsToSelector:@selector(setLayoutMargins:)]) 
        {
            [self setLayoutMargins:UIEdgeInsetsZero];
        }
}

sesse

赞同来自:

我这样做是通过这样做的:

tableView.separatorInset = UIEdgeInsetsZero;
tableView.layoutMargins = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;

wqui

赞同来自:

只需添加以下代码即可解决此程序。 祝你好运!

-(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];
       }
}

wet

赞同来自:

iOS 8.0在单元格和表视图上引入了layoutMargins属性。 此属性在iOS 7.0上不可用,因此您需要确保在分配之前进行检查! 此外,Apple已向您的单元格添加了一个属性,以防止它继承您的表格视图的边距设置。设置此属性后,您的单元格可以独立于表视图配置自己的边距。把它想象成一个覆盖。 此属性称为preservesSuperviewLayoutMargins,将其设置为NO将允许单元格的layoutMargin设置覆盖在TableView上设置的任何layoutMargin。它既节省了时间(您不必修改表视图的设置),而且更简洁。有关详细说明,请参阅Mike Abdullah的回答。 注意:以下是针对单元级边距设置的简洁实现,如Mike Abdullah的回答所述。设置单元格的preserveSuperviewLayoutMargins = NO将确保您的表视图不会覆盖单元格设置。如果您确实希望整个表格视图具有一致的边距,请相应地调整您的代码。 设置细胞边距:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Remove seperator inset
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
           [cell setSeparatorInset:UIEdgeInsetsZero];
    }
// Prevent the cell from inheriting the Table View's margin settings
    if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
        [cell setPreservesSuperviewLayoutMargins:NO];
    }
// Explictly set your cell's layout margins
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}
将单元格上的preservesSuperviewLayoutMargins属性设置为NO应该可以防止表视图覆盖单元格边距。在某些情况下,它似乎无法正常运作。 如果全部失败,您可以强制执行表格视图边距:
-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
} 
......你去!这应该适用于iOS 7和8。 编辑:Mohamed Saleh引起我注意iOS 9中可能发生的变化。如果要自定义插图或边距,可能需要将表视图的cellLayoutMarginsFollowReadableWidth设置为NO。您的里程可能会有所不同,但未记录在案。 此属性仅存在于iOS 9中,因此请务必在设置之前进行检查。
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 
(以上来自iOS 8 UITableView separator inset 0 not working的代码) 编辑:这是一个纯粹的Interface Builder方法: TableViewAttributesInspector TableViewCellSizeInspector 注意:iOS 11更改&简化了大部分此类行为,即将发布更新......

ksequi

赞同来自:

XCode 7.1 iOS 7,8,9: 只需将这两行放在TabelViewCell中:

    self.layoutMargins = UIEdgeInsetsZero;
    self.preservesSuperviewLayoutMargins = false;
这对我有用

in_ut

赞同来自:

对我来说,没有任何工作,除了这个解决方法(Swift 3.0):

extension UIColor {
    static func colorWith(hex:String, alpha: CGFloat) -> UIColor {
        var cString = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased()
if cString.hasPrefix("#") {
            cString.remove(at: cString.startIndex)
        }
if cString.characters.count != 6 {
            return UIColor.gray
        }
var rgbValue:UInt32 = 0
        Scanner(string: cString).scanHexInt32(&rgbValue)
return UIColor(red:   CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
                       green: CGFloat((rgbValue & 0x00FF00) >> 8)  / 255.0,
                       blue:  CGFloat( rgbValue & 0x0000FF)        / 255.0,
                       alpha: alpha)
    }
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: cellReuseIdendifier, for: indexPath)
cell.backgroundColor = UIColor.colorWith(hex: "c8c7cc", alpha: 1) // same color of line separator
return cell
}

edolor

赞同来自:

这是在Swift中为我工作的代码:

override func viewDidLoad() 
{
    super.viewDidLoad()
    ...
    if tableView.respondsToSelector("setSeparatorInset:") {
        tableView.separatorInset = UIEdgeInsetsZero
    }
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath)
{
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset.left = CGFloat(0.0)
    }
    if tableView.respondsToSelector("setLayoutMargins:") {
        tableView.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins.left = CGFloat(0.0)
    }
}
这对我来说似乎是最干净的(现在),因为所有cell / tableView边缘/边距调整都是在tableView:willDisplayCell:forRowAtIndexPath:方法中完成的,而不会将不必要的代码填入tableView:cellForRowAtIndexPath:。 顺便说一句,我只是设置单元格的左侧separatorInset / layoutMargins,因为在这种情况下我不想搞砸我在单元格中设置的约束。 代码更新为Swift 2.2:
 override func viewDidLoad() {
   super.viewDidLoad()
if tableView.respondsToSelector(Selector("setSeparatorInset:")) {
      tableView.separatorInset = UIEdgeInsetsZero
        }
    }
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,forRowAtIndexPath indexPath: NSIndexPath) {
        if cell.respondsToSelector(Selector("setSeparatorInset:")) {
            cell.separatorInset.left = CGFloat(0.0)
        }
        if tableView.respondsToSelector(Selector("setLayoutMargins:")) {
            tableView.layoutMargins = UIEdgeInsetsZero
        }
        if cell.respondsToSelector(Selector("setLayoutMargins:")) {
            cell.layoutMargins.left = CGFloat(0.0)
        }
    }

isunt

赞同来自:

迅速:

override func viewDidLoad() {
    super.viewDidLoad()
if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }
    if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }
self.tableView.layoutIfNeeded()            // <--- this do the magic
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     ...
if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
return cell
}

zet

赞同来自:

大多数答案显示分隔符插入和布局边距是针对单元格和tableviews的各种方法(即viewDidLayoutSubviewswillDisplayCell等)设置的,但我发现只需将这些放在cellForRowAtIndexPath中就可以了。似乎是最干净的方式。

// kill insets for iOS 8
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8) {
    cell.preservesSuperviewLayoutMargins = NO;
    [cell setLayoutMargins:UIEdgeInsetsZero];
}
// iOS 7 and later
if ([cell respondsToSelector:@selector(setSeparatorInset:)])
    [cell setSeparatorInset:UIEdgeInsetsZero];

hvelit

赞同来自:

对于iOS 9,您需要添加:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
} 
有关详细信息,请参阅question

ksit

赞同来自:

对我来说,简单的线就完成了这项工作

cell.layoutMargins = UIEdgeInsetsZero

wfuga

赞同来自:

Swift for iOS 8中的简单解决方案,带有自定义UITableViewCell

override func awakeFromNib() {
    super.awakeFromNib()
self.layoutMargins = UIEdgeInsetsZero
    self.separatorInset = UIEdgeInsetsZero
}
通过这种方式,您只需将layoutMarginseparatorInset设置为一次,而不是为每个willDisplayCell设置,因为大多数上述答案都表明了这一点。 如果您使用自定义UITableViewCell,这是正确的位置。 否则你应该在tableView:cellForRowAtIndexPath中这样做。 只是另一个提示:您不需要设置preservesSuperviewLayoutMargins = false,因为默认值已经是NO

tin

赞同来自:

以下来自@cdstamper的回答,更好的地方是UITableViewCell的layoutSubviews,在你的单元文件中(我设置1%间距,你可以设置为零),所以只需要在这里设置代码来处理所有情况(旋转和其他):

 -(void)layoutSubviews
    {
        [super layoutSubviews];
        if ([self respondsToSelector:@selector(setSeparatorInset:)]) {
            [self setSeparatorInset:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
        }
        if ([self respondsToSelector:@selector(setLayoutMargins:)]) {
            [self setLayoutMargins:UIEdgeInsetsMake(0,self.bounds.size.width*0.01,0,self.bounds.size.width*0.01)];
        }
    }

cut

赞同来自:

Swift 3.0示例:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // removing seperator inset
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = .zero
    }
    // prevent the cell from inheriting the tableView's margin settings
    if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    // explicitly setting cell's layout margins
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = .zero
    }
}

cet

赞同来自:

我的解决方案是添加一个UIView作为单元子视图的容器。然后将此UIView约束(顶部,底部,尾随,前导)设置为0点。并且所有不必要的质量消失了.the image showing the logic

pdolor

赞同来自:

这是一种全局删除插图的简便方法。 在UITableViewCell+Extensions.swift中:

import UIKit
extension UITableViewCell {
override public var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set { }
  }
}
AppDelegate application:didFinishLaunchingWithOptions:中:
  UITableViewCell.appearance().separatorInset = UIEdgeInsetsZero
您可能认为a)也只是覆盖扩展中的separatorInset,或b)设置layoutMargins的外观代理。两者都不会起作用。尽管separatorInset被指示为属性,但尝试将其作为属性(或方法)覆盖会生成编译器错误。并为UITableViewCelllayoutMargins设置外观代理(或者,就此而言,还设置UITableViewlayoutMarginsseparatorInset的外观代理)无效。

vomnis

赞同来自:

Swift 2.0 Extension

我只想分享我为了从tableview单元格分隔符中删除边距而进行的扩展。
extension UITableViewCell {
    func removeMargins() {
if self.respondsToSelector("setSeparatorInset:") {
            self.separatorInset = UIEdgeInsetsZero
        }
if self.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
            self.preservesSuperviewLayoutMargins = false
        }
if self.respondsToSelector("setLayoutMargins:") {
            self.layoutMargins = UIEdgeInsetsZero
        }
    }
}
用于上下文:
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
cell.removeMargins()
    return cell

aet

赞同来自:

Swift版 iOS在单元格和表视图上引入了layoutMargins属性。 此属性在iOS 7.0中不可用,因此您需要确保在分配之前进行检查! 但是,Apple已将一个名为preservesSuperviewLayoutMargins的属性添加到您的单元格中,这将阻止它继承您的表格视图的边距设置。这样,您的单元格可以独立于表视图配置自己的边距。把它想象成一个覆盖。 此属性称为preservesSuperviewLayoutMargins,并将其设置为NO可以允许您使用自己的单元格的layoutMargin设置覆盖表视图的layoutMargin设置。它既节省了时间(您不必修改表视图的设置),而且更简洁。有关详细说明,请参阅Mike Abdullah的回答。 注意:正如Mike Abdullah的回答所表达的那样,这是正确的,不那么混乱的实现;设置单元格的preservesSuperviewLayoutMargins = NO将确保您的表视图不会覆盖单元格设置。 第一步 - 设置细胞边距:
/*
    Tells the delegate that the table view is about to draw a cell for a particular row.
*/
override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Remove separator inset
    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
// Prevent the cell from inheriting the Table View's margin settings
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
// Explictly set your cell's layout margins
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
}
将单元格上的preservesSuperviewLayoutMargins属性设置为NO应该可以防止表视图覆盖单元格边距。在某些情况下,似乎没有正常运作。 第二步 - 只有在所有操作都失败的情况下,您才可以强制执行Table View边距:
/*
    Called to notify the view controller that its view has just laid out its subviews.
*/
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
    if self.tableView.respondsToSelector("setSeparatorInset:") {
        self.tableView.separatorInset = UIEdgeInsetsZero
    }
if self.tableView.respondsToSelector("setLayoutMargins:") {
        self.tableView.layoutMargins = UIEdgeInsetsZero
    }
}
......你去!这应该适用于iOS 8和iOS 7。 注意:使用iOS 8.1和7.1进行测试,在我的情况下,我只需要使用此解释的第一步。 只有在渲染单元格下方有未填充的单元格时才需要第二步,即。如果表大于表模型中的行数。不执行第二步将导致不同的分隔符偏移。

phic

赞同来自:

我经历了所有这些精彩的答案,并意识到其中大部分都不适用于iOS 8,或者可以正常工作但是分隔符在动画期间会改变大小,从而导致不必要的闪烁。这是我在创建窗口之前最终在我的app委托中执行的操作:

[[UITableView appearance] setSeparatorInset:UIEdgeInsetsZero];
[[UITableViewCell appearance] setSeparatorInset:UIEdgeInsetsZero];
if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) {
    [[UITableView appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}
这就是我添加到我的UITableViewController中的内容:
-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}
我不需要添加任何其他内容。感谢所有提供关键位的人。

taut

赞同来自:

精氨酸!在Cell子类中执行此操作之后:

- (UIEdgeInsets)layoutMargins
{
    return UIEdgeInsetsZero;
}
或者设置cell.layoutMargins = UIEdgeInsetsZero;为我修复它。

nodit

赞同来自:

(经过大量调查后,这是处理这个恕我直言的正确方法) 要完全控制每个单元格上的分隔符插入和布局边距。您只需要在tableview委托中使用此代码。 iOS8或iOS9上不需要任何其他内容。

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.layoutMargins = UIEdgeInsetsZero
    cell.contentView.layoutMargins = UIEdgeInsetsMake(0, 10, 0, 10)
    cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
}
单元格对象控制分隔符,contentView控制其他所有内容。如果您的分隔符插入空间显示为意外颜色,则应解决此问题:
cell.backgroundColor = cell.contentView.backgroundColor

yut

赞同来自:

我们花一点时间来了解问题,然后盲目地收费以试图修复它。 在调试器中快速查看将告诉您分隔线是UITableViewCell的子视图。看起来细胞本身对这些细胞系的布局负有相当大的责任。 iOS 8引入了布局边距的概念。默认情况下,视图的布局边距为8pt,并且它们是从祖先视图继承的。 我们可以告诉您,在布置其分隔线时,UITableViewCell选择遵守左侧布局边距,使用它来约束左侧插图。 将所有这些组合在一起,以实现真正零的理想插入,我们需要:

  • 将左侧布局边距设置为0
  • 停止覆盖
  • 的任何继承边距
这样,这是一个非常简单的任务:
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
注意事项:
  • 这个代码只需要每个单元格运行一次(毕竟你只是配置单元格的属性),并且在你选择执行它时没有什么特别之处。做些对你来说最干净的事。
  • 遗憾的是,这两个属性都不能在Interface Builder中配置,但如果需要,您可以为preservesSuperviewLayoutMargins指定用户定义的运行时属性。
  • 显然,如果您的应用程序也是针对早期的操作系统版本,那么在iOS 8及更高版本上运行之前,您需要避免执行上述代码。
  • 您可以配置祖先视图(例如表格)以使0保留左边距,而不是设置preservesSuperviewLayoutMargins,但这似乎更容易出错,因为您无法控制整个层次结构。
  • 将左边距设置为0并保留其他边距可能会稍微清晰一些。
  • 如果你想在UITableView在普通样式表底部绘制的“额外”分隔符上有一个0插入,我猜这将需要在表级别指定相同的设置(没试过这个一个!)