Перенастройка ширины UIButton

#ios #uiview #uibutton #autolayout

#iOS #uiview #uibutton #автоматическое описание

Вопрос:

Я использую ограничения автозапуска программно, и я хотел бы сбросить ширину моей кнопки на основе ее изменяющегося заголовка. Предполагая, что у меня нет ссылки на старое ограничение ширины, которое было установлено для него, как я могу перенастроить его ширину? Мне кажется, что создание нового ограничения ширины не работает — мне нужно деактивировать старое, а затем активировать новое. Но у меня нет ссылки на старую.

 // adding a new constraint
myButton.widthAnchor.constraintEqualToConstant(myNewWidth).active = true
  

Комментарии:

1. Почему у вас нет ссылки на старое ограничение ширины? По умолчанию ширина кнопок будет охватывать ее содержимое, поэтому, возможно, вам вообще не нужно ограничение ширины. Установите горизонтальный центр и, возможно, максимальную ширину

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

Ответ №1:

Создайте свойство NSLayoutConstraint в своем классе. Когда вы программно устанавливаете ограничение ширины вашей кнопки, назначьте этому свойству новое ограничение.

Затем, когда вам нужно обновить ограничение, просто сделайте это

 myWidthConstraint.constant = newValue
  

Комментарии:

1. Я согласен, что сохранение ссылки на ограничение полезно, но было бы предпочтительнее запрашивать ограничение для привязки ширины, например.

Ответ №2:

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

 var constraint: NSLayoutConstraint! = nil
let constraints = myButton.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Horizontal)
  

или это приведет ко всем вашим ограничениям.

 var constraint: NSLayoutConstraint! = nil
  

Затем вам нужно перебрать их и найти требуемый, как это.

 for const in myButton.constraints {
    if const.firstAttribute == NSLayoutAttribute.Width {
        constraint = const 
        break
    }
}
  

Первый атрибут ограничения ширины всегда устанавливается как «Ширина», а также вы можете установить дополнительную проверку, как показано ниже, для элемента, к которому применяется ограничение, с предложением if

 const.firstItem as! NSObject == myButton
  

потому что первый элемент ограничения ширины — это он сам.
попробуйте, если работает. И если вы его найдете, я предлагаю удалить конкретное ограничение и добавить новое. Чтобы добавить ограничение ширины для элемента, ниже приведен код. Предположим, что требуемая ширина равна 50 пикселям.

 myButton.addConstraint(NSLayoutConstraint(item: myButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 50.0))
  

Это правильный подход. Не активируйте и не деактивируйте его.