2014-09-23 2 views
11

У меня есть несколько пользовательских UITableViewCells в моем приложении, в основном определяемые nib. При переходе на iOS 8 и Xcode 6 поля слева и справа неверны. Эти ячейки часто перемежаются в виде таблицы с ячейками по умолчанию.Пользовательские UITableViewCells в iOS 8 и layoutMargin

Я сделал образец проекта, вот вопрос Маржа я говорю: margin issue

Единственное, что я смог найти, что к этому относится это новое свойство layoutMargins. Для UITableViewCells его значение, кажется, изменяется в зависимости от устройства приложение работает на:

iPhone 6 and below - layoutMargin: {8, 16, 8, 16} 
iPhone 6 Plus - layoutMargin: {8, 20, 8, 20} 

Это, кажется, совпадают с полями, что я вижу на стандартных клетках. Однако содержимое для моих пользовательских ячеек находится внутри ячеек contentView, который имеет стандартный UIView layoutMargin от {8, 8, 8, 8}. Это означает, что любые ограничения автоматической компоновки, связанные с маркой контейнера, добавляют неправильный интервал.

Единственный способ я нашел, чтобы исправить это, добавив следующее cellForRowAtIndexPath:

cell.contentView.layoutMargins = cell.layoutMargins; 

Это не похоже, очень хорошее решение идти вперед (тем более, что мне нужно, чтобы обернуть его в проверках на iOS8 для обеспечения совместимости).

У кого-нибудь есть идеи? Я чувствую, что мне что-то не хватает.

ответ

13

Возможно, вы захотите проверить свойство preserveesSuperviewLayoutMargins. Это похоже на то, что вы ищете.

Добавьте следующие строки в любые клетки, которые должны быть последовательно расположены со стандартными клетками:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    if ([self.contentView respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) { 
     self.contentView.preservesSuperviewLayoutMargins = YES; 
    } 
} 
+0

Спасибо! Это то, что я искал. – simon

4

В вашем UITableViewCell подклассе переопределить layoutMarginsDidChange и установить layoutMargins в contentView, чтобы соответствовать layoutMargins клеточному:

- (void)layoutMarginsDidChange { 
    contentView.layoutMargins = layoutMargins 
} 

Я нашел это, чтобы быть надежным чем установка preservesSuperviewLayoutMargins в YES.

0

заповедникиSuperviewLayoutMargins решает его для iOS8. В приведенный ниже код входит и дополнительный код, который разрешает его для ios7.1.

class CustomTableViewCell: UITableViewCell { 

    @IBOutlet weak var mainLabel: UILabel! 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     if contentView.respondsToSelector(Selector("preservesSuperviewLayoutMargins")) { 
      contentView.preservesSuperviewLayoutMargins = true 
     } else { 
      if mainLabel != nil { 
       let leftConstraint = NSLayoutConstraint(item: mainLabel, 
        attribute: .Leading, 
        relatedBy: .Equal, 
        toItem: contentView, 
        attribute: .Leading, 
        multiplier: 1.0, 
        constant: 16.0); 
       addConstraint(leftConstraint); 
      } 
     } 
    } 

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