iOS 9 UITableView separators insets (significant left margin)

后端 未结 11 2077
故里飘歌
故里飘歌 2020-12-02 16:41

I have a problem with separators between UITableViewCells in UITableView on iOS 9. They have the significant left margin. I already ha

相关标签:
11条回答
  • 2020-12-02 17:17

    The accepted answer did not work for me. Until I moved setCellLayoutMarginsFollowReadableWidth BEFORE setLayoutMargins (still needed for iOS 8):

    if([_tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) {
      _tableView.cellLayoutMarginsFollowReadableWidth = NO;
    }
    
    if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
      _tableView.layoutMargins = UIEdgeInsetsZero;
    }
    
    0 讨论(0)
  • 2020-12-02 17:17

    This is my solution for Swift 3.0/iOS 10 in XCode 8.2.1.

    I have created a subclass for UITableview which works for IB and programmatically create tableviews.

    import UIKit
    
    class EXCSuperTV: UITableView
    {
        required init?(coder aDecoder: NSCoder)
        {
            super.init(coder: aDecoder)
            setupView()
        }
    
        override init(frame: CGRect, style: UITableViewStyle)
        {
            super.init(frame: frame, style: style)
            setupView()
        }
    
        func setupView() {}
    }
    
    class EXCNoFooter: EXCSuperTV
    {
        override func setupView()
        {
            super.setupView()
            //tableFooterView = UIView.Zero()
        }
    }
    
    
    class EXCMainTV: EXCNoFooter
    {
        override func setupView()
        {
            super.setupView()
            separatorInset = UIEdgeInsets.zero
        }
    }
    
    0 讨论(0)
  • 2020-12-02 17:18

    Okay, I have found out the solution. The only thing required for that is to set on the presenting instance of UITableView that flag cellLayoutMarginsFollowReadableWidth

    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
    

    I wanted to find some reference in the documentation but it looks like it is not ready yet, only mentioned on diff page.

    As the flag was introduced in iOS 9 for the backward compatibility you should add a check before trying to set it:

    if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
    {
        myTableView.cellLayoutMarginsFollowReadableWidth = NO;
    }
    

    For Swift 2.0 you can use #available to check iOS version.

    if #available(iOS 9, *) {
        myTableView.cellLayoutMarginsFollowReadableWidth = false
    }
    

    Moreover you need to compile it with Xcode 7 or above.

    EDIT

    Please keep in mind that this is the only required fix if your separators looked "fine" up to iOS 8, otherwise you need to change a bit more. You can find info how to do this already on SO.

    0 讨论(0)
  • 2020-12-02 17:25
    - (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];
        }
    
    }
    
    0 讨论(0)
  • 2020-12-02 17:26

    Swift 3.0 / 4.0

    tableView.cellLayoutMarginsFollowReadableWidth = false
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
            cell.separatorInset = UIEdgeInsets.zero
        }
        if cell.responds(to: #selector(setter: UIView.preservesSuperviewLayoutMargins)) {
            cell.preservesSuperviewLayoutMargins = false
        }
        if cell.responds(to: #selector(setter: UIView.layoutMargins)) {
            cell.layoutMargins = UIEdgeInsets.zero
        }
    }
    
    0 讨论(0)
  • 2020-12-02 17:26

    This worked perfectly for me in iOS 9.

    For 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;
        }
    
    0 讨论(0)
提交回复
热议问题