Пользовательские UITableViewCells в iOS 8 и layoutMargin
У меня есть несколько пользовательских UITableViewCells в моем приложении, в основном определяемые nib. При переходе на iOS 8 и Xcode 6 поля слева и справа неверны. Эти ячейки часто перемежаются в виде таблицы с ячейками по умолчанию.
Я сделал пример проекта, вот вопрос маржи, о котором я говорю:
![margin issue]()
Единственное, что мне удалось найти, относится к этому новому свойству layoutMargins
. Для UITableViewCells его значение, похоже, меняется в зависимости от устройства, на котором работает приложение:
iPhone 6 and below - layoutMargin: {8, 16, 8, 16}
iPhone 6 Plus - layoutMargin: {8, 20, 8, 20}
Это, похоже, совпадает с полями, которые я вижу на стандартных ячейках. Однако содержимое для моих пользовательских ячеек находится внутри ячеек contentView
, у которого есть стандартный UIView layoutMargin
of {8, 8, 8, 8}
. Это означает, что любые ограничения макета, связанные с маркой контейнера, добавляют неверный интервал.
Единственное, что я нашел, чтобы исправить это, добавив следующее в cellForRowAtIndexPath:
cell.contentView.layoutMargins = cell.layoutMargins;
Это не похоже на очень хорошее решение в будущем (тем более, что мне нужно будет обернуть его в чеки для iOS8 для обеспечения совместимости).
Есть ли у кого-нибудь идеи? Я чувствую, что мне что-то не хватает.
Ответы
Ответ 1
Возможно, вы захотите проверить свойство preserveesSuperviewLayoutMargins. Это похоже на то, что вы ищете.
Добавьте следующие ячейки в ячейки, которые должны быть последовательно расположены со стандартными ячейками:
- (void)layoutSubviews {
[super layoutSubviews];
if ([self.contentView respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
self.contentView.preservesSuperviewLayoutMargins = YES;
}
}
Ответ 2
В вашем подклассе UITableViewCell
переопределите layoutMarginsDidChange
и настройте макеты содержимого contentView в соответствии с макетом ячейки:
- (void)layoutMarginsDidChange {
contentView.layoutMargins = layoutMargins
}
я нашел это более надежным, чем установка preservesSuperviewLayoutMargins
в YES
.
Ответ 3
сохраняет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);
}
}
}
}
Ответ 4
Чтобы удалить это левое поле в iOS 8+, в представлении таблицы:
table.separatorInset = UIEdgeInsets.zero // or UIEdgeInsetsZero
Вам также может понадобиться:
table.layoutMargins = UIEdgeInsets.zero
Кредит fooobar.com/info/148172/....