Ответ 1
Это потому, что вы не можете просто изменить фрейм объекта с ограничениями автоопределения (поскольку ограничения задают местоположения, а не вручную устанавливают свойства frame
), свойства frame
будут reset при повторном применении ограничений), См. эту статью, в которой показано, как правильно настроить ограничение для перемещения представления. (В этом случае мы анимируем, что не является проблемой здесь, но демонстрирует, как можно настроить ограничение на движение UIView
.)
Короче говоря, если вы хотите переместить UIView
в автозапуск, вы не должны пытаться изменить frame
, а сами корректируете сами ограничения. Это упрощается, если вы создаете ссылки IBOutlet
для самих ограничений, после чего вы можете отрегулировать constant
NSLayoutConstraint
.
Update:
Егор рекомендовал перечислить ограничения и отредактировать ту, которая соответствовала этому вопросу. Это отлично работает, но лично я предпочитаю иметь IBOutlet
для конкретного ограничения, которое я хочу редактировать, а не перечислять их и охотиться за тем, о котором идет речь. Если для ширины NSLayoutConstraint
indentView
у вас был IBOutlet
, называемый indentViewWidthConstraint
, вы могли бы просто:
self.indentViewWidthConstraint.constant = newIndentConstantValue;