Подтвердить что ты не робот

Пользовательские 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 для обеспечения совместимости).

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

4b9b3361

Ответ 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/....