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

Autolayout, похоже, не работает при изменении размеров просмотра

У меня есть пользовательский подкласс UITableViewCell с установленными ограничениями.

Проблема в том, что я пытаюсь изменить размер одного вида следующим образом:

CGRect frm = CGRectMake(0, 0, someValue, 30);
cell.indentView.frame = frm;

другие представления, зависящие от ширины cell.indentView, вообще не перемещаются.

Что может быть?

Этот код будет работать:

// enumerate over all constraints
for (NSLayoutConstraint *constraint in cell.indentView.constraints) {
    // find constraint on this view and with 'width' attribute
    if (constraint.firstItem == cell.indentView && constraint.firstAttribute == NSLayoutAttributeWidth)
    {
        // increase width of constraint
        constraint.constant = someValue;
        break;
    }
}
4b9b3361

Ответ 1

Это потому, что вы не можете просто изменить фрейм объекта с ограничениями автоопределения (поскольку ограничения задают местоположения, а не вручную устанавливают свойства frame), свойства frame будут reset при повторном применении ограничений), См. эту статью, в которой показано, как правильно настроить ограничение для перемещения представления. (В этом случае мы анимируем, что не является проблемой здесь, но демонстрирует, как можно настроить ограничение на движение UIView.)

Короче говоря, если вы хотите переместить UIView в автозапуск, вы не должны пытаться изменить frame, а сами корректируете сами ограничения. Это упрощается, если вы создаете ссылки IBOutlet для самих ограничений, после чего вы можете отрегулировать constant NSLayoutConstraint.


Update:

Егор рекомендовал перечислить ограничения и отредактировать ту, которая соответствовала этому вопросу. Это отлично работает, но лично я предпочитаю иметь IBOutlet для конкретного ограничения, которое я хочу редактировать, а не перечислять их и охотиться за тем, о котором идет речь. Если для ширины NSLayoutConstraint indentView у вас был IBOutlet, называемый indentViewWidthConstraint, вы могли бы просто:

self.indentViewWidthConstraint.constant = newIndentConstantValue;

Ответ 2

Вам нужно указать фреймворк для обновления, например. вызывая setNeedsLayout, setNeedsUpdateConstraints или layoutIfNeeded. Для правильного использования см. Документацию UIView.