Xcode 7 iOS 9 UITableViewCell Separator Inset issue

后端 未结 4 1191
情深已故
情深已故 2020-12-12 15:29

This is not a question, rather a solution to the problem I faced.

In Xcode 7, when the application is run on iOS 9 on iPad devices, the UITableViewCell

相关标签:
4条回答
  • 2020-12-12 16:02

    Up to iOS 9

    In viewDidLoad

    Objective-C

    - (void)viewDidLoad {
        [super viewDidLoad];
        //Required for iOS 9
        if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 9.0) {
            self.testTableView.cellLayoutMarginsFollowReadableWidth = NO;
        }
    }
    

    Swift

    override func viewDidLoad() {
        super.viewDidLoad()
        if #available(iOS 9.0, *) {
            tableViewDiet.cellLayoutMarginsFollowReadableWidth = false
        }
    }
    

    In TableViewDelegate methods add following code:

    Objective-C

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

    Swift

    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    
        // Remove seperator inset
        if cell.respondsToSelector(Selector("setSeparatorInset:")) {
            cell.separatorInset = UIEdgeInsetsZero
        }
    
        // Prevent the cell from inheriting the Table View's margin settings
        if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
            cell.preservesSuperviewLayoutMargins = false
        }
    
        // Explictly set your cell's layout margins
        if cell.respondsToSelector(Selector("setLayoutMargins:")) {
            cell.layoutMargins = UIEdgeInsetsZero
        }
    }
    
    0 讨论(0)
  • 2020-12-12 16:03

    iOS 9 and above:

    This is because of a new feature called readable content guides. It provides margins that are suitable for reading. So, on iPhone and portrait iPad they are very small margins. But in the landscape, iPad they are bigger. In iOS 9, UITableViewCell margins default to following the readable content guide.

    If you want to stop that, just set the tableView's cellLayoutMarginsFollowReadableWidth to NO/false.

    Source: https://forums.developer.apple.com/thread/5496

    0 讨论(0)
  • 2020-12-12 16:07

    readableContentGuide is a layout guide that is already added to every UIView.

    This is to ensure the user doesn't have to turn his head to read the content.

    If you want to follow the readable content guide, then do the following:

    let baseSection = UIView()
    
    contentView.addSubview(baseSection)
    
    baseSection.translatesAutoresizingMaskIntoConstraints = false
    
    let insets = UIEdgeInsets(top: 4, left: 0, bottom: 4, right: 0)
    
    baseSection.leadingAnchor.constraint(equalTo: readableContentGuide.leadingAnchor, constant: insets.left).isActive = true
    baseSection.trailingAnchor.constraint(equalTo: readableContentGuide.trailingAnchor, constant: -insets.right).isActive = true
    baseSection.topAnchor.constraint(equalTo: contentView.topAnchor, constant: insets.top).isActive = true
    baseSection.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -insets.bottom).isActive = true
    

    Note: In the code above the bottom and top anchors use the contentView instead of the readableContentGuide so that the content vertical margins change based on the tableView.rowHeight.

    0 讨论(0)
  • 2020-12-12 16:09

    I hope this is helpful.

    if #available(iOS 9.0, *) {
          myTableView.cellLayoutMarginsFollowReadableWidth = false
    }
    
    0 讨论(0)
提交回复
热议问题