2015-07-21 2 views
67

Это не вопрос, а решение проблемы, с которой я столкнулся.Xcode 7 iOS 9 UITableViewCell Separator Вставка номер

В Xcode 7, когда приложение запускается на iOS 9 на iPad-устройствах, ячейки UITableView оставляют некоторый запас на левой стороне таблицы. И поворот устройства в ландшафт увеличит поля.

Решение я нашел:

Установка "cellLayoutMarginsFollowReadableWidth" к NO.

self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO; 

Поскольку это свойство доступно только прошивка 9. Таким образом, вы должны поставить условие, чтобы проверить версию IOS, иначе это приведет к краху.

if(NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_8_1) 
{ 
    self.tbl_Name.cellLayoutMarginsFollowReadableWidth = NO; 
} 

Надеюсь, это полезно другим.

+0

[имеет такую ​​же проблему] (http://stackoverflow.com/questions/31537196/ios-9-uitableview-separators-significant-left-margin) –

+0

Да, это отлично работает для меня, особенно на iPad с iOS 9 –

+0

Я только столкнулся с серьезной проблемой с этим ответом, он использует версию 'NSFoundationVersionNumber_iOS_8_1', вместо этого нужно использовать' NSFoundationVersionNumber_iOS_8_4', иначе это приведет к сбою приложения, работающего под iOS8.2 и iOS8.3 и IOS8.4. – Alex

ответ

13

Идеальное решение ДО прошивкой 9

В viewDidLoad

Objective-C

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

Свифта

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

В способах TableViewDelegate добавить следующий код:

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

Свифта

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 
    } 
    } 
+1

Это не сработало для меня. Вот почему мне пришлось искать другой подход. – stuti

+1

Это не работает с iOS 9. Вы тестировали его с помощью iOS 9 и Xcode 7 с правильными настройками инструментов командной строки в настройках? –

+0

Нет. Это не работает для меня. –

38

Лучшее решение для прошивкой 9 и выше

Это происходит потому, нового featu re называемые читаемыми руководствами по содержанию. Он обеспечивает поля, подходящие для чтения. Итак, в iPhone и портрете iPad они очень маленькие, но в плане iPad они больше. В iOS 9 поля ячейки UITableView по умолчанию соответствуют следующему руководству по содержанию.

Если вы хотите остановить это, просто установите tableView's cellLayoutMarginsFollowReadableWidth в NO/false.

Источник:https://forums.developer.apple.com/thread/5496

+2

Очень хороший ответ! К сожалению, он еще не задокументирован. Этот вопрос возник, когда я готовил [мой] (http://stackoverflow.com/questions/31537196/ios-9-uitableview-separators-insets-significant-left-margin/) –

3

Немного поздно. Я надеюсь, что это полезно для кого-то еще ...

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

readableContentGuide является макет руководство, которое уже добавлено к каждому UIView

Это должно обеспечить пользователю не нужно поворачивать голову, чтобы прочитать содержание.

Если вы хотите следовать читаемому содержание руководства, то сделайте следующее:

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 

Примечания: В приведенной выше нижних и верхних якорях коды используйте contentView вместо readableContentGuide так, чтобы содержание вертикальных полех изменения на основе tableView.rowHeight.

Смежные вопросы