Автоматическое удаление макета из супервизора не обновляется

Я пытаюсь увеличить UILabel, сняв ограничения с помощью removeFromSuperview. Текстовое поле 1 удалено. Но это все еще не позволяет UILabel увеличиваться в ширину. Я приложил образец кода здесь для справки. Его полностью на доске рассказов.

Вот мой метод ViewDidLoad:

  self.label1.text = @"label 1";
  self.label2.text = @"label 2";
  self.textfield1.text = @"text field 1";
  self.textfield2.text = @"text field 2";
  [self.textfield1 removeFromSuperview]; 

Я не хочу иметь IBOutlet ограничений и обновлять его в коде. Я пытаюсь получить это на раскадровке на этот раз.


person Siddharthan Asokan    schedule 29.05.2015    source источник
comment
Может надо позвонить [self.view setNeedsLayout] ?   -  person Zhang    schedule 28.01.2017


Ответы (2)


Я думаю, что ваша метка 2 зависит от ее положения в текстовом поле 1, и вы хотите, чтобы метка 2 увеличивалась, чтобы занимать пространство текстового поля 1, когда вы удаляете текстовое поле 1. Однако, поскольку метка 2 (скажем, 20 пикселей справа от текстового поля 1), когда вы удаляете текстовое поле 1, это ограничение удаляется (теперь оно недействительно, поскольку текстовое поле 1 больше не существует!) и создается ограничение по умолчанию относительно суперпредставления.

Существует простое решение, но оно довольно несовершенно - вместо удаления из супервизора установите ширину текстового поля 1 на 0. После этого вы увидите изменение положения метки 2.

Однако для большего контроля, я думаю, вам все равно нужно IBOutlet ограничение.

person Flying_Banana    schedule 29.05.2015
comment
Я хочу, чтобы label2 занимал место textfield1. - person Siddharthan Asokan; 30.05.2015
comment
Это все тот же принцип. Я обновлю свой ответ, если он вас беспокоит. - person Flying_Banana; 30.05.2015
comment
Я уже сделал, однако, если я ошибаюсь в макете, мне может понадобиться схема макета, чтобы помочь вам в дальнейшем. - person Flying_Banana; 31.05.2015

С помощью следующего метода вместо удаления текстового поля вы можете просто установить его текст равным нулю. В этом случае внутренний размер содержимого будет иметь нулевую ширину, а ваша метка расширится, чтобы заполнить дополнительное пространство.

  • Ограничьте метку и текстовое поле ближайшим краем их суперпредставления (т.е. по 1 ограничению на каждое) и ограничьте их вертикальное положение по своему усмотрению.
  • Добавьте ограничение по горизонтали между меткой и текстовым полем (например, с постоянным зазором в 8 пунктов).
  • Увеличьте приоритет сопротивления сжатию текстового поля и приоритет охвата его содержимого (оба по горизонтали).

Я предполагаю, что ваш макет выглядит примерно так:

|[label][textField]|

person johnpatrickmorgan    schedule 29.05.2015