В @IBDesignable
,@IBDesignable, NSLayoutConstraint для пропорциональной ширины множителя супервизора?
Я пытаюсь программно установить «ширина 20% от родителей»:
@IBDesignable
class TwentyPercentExample:UIView {
func setup() {
let cWidth = NSLayoutConstraint(
item: self,
attribute: NSLayoutAttribute.width,
relatedBy: NSLayoutRelation.equal,
toItem: self.superview,
attribute: NSLayoutAttribute.width,
multiplier: 0.2,
constant:0
)
addConstraint(cWidth)
print("I seemed to added the width constraint....")
updateConstraintsIfNeeded() // could be useful..
}
override init(frame: CGRect) {
super.init(frame: frame)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
}
(Таким образом, вы бы добавить UIView в раскадровке, возможно, установить его на якорь слева до супервизора, а затем смените класс на TwentyPercentExample.)
Странно это не работает. если вы это сделаете:
multiplier: 1,
constant:100
это красиво устанавливает его в режиме реального времени в раскадровке до 100 ширины. Замените на
multiplier: 1,
constant:200
и он отлично работает, меняет его в режиме реального времени на 200 ширины. Однако это просто не похоже на работу:
multiplier: 0.2,
constant:0
У меня есть toItem:
неправильно, или что-то? В чем дело?
Всякий раз, когда вы предоставляете ограничения программным образом, вам необходимо активировать ограничения. И ты этого не делал. Проверьте этот документ яблока https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/ProgrammaticallyCreatingConstraints.html. –
@the_dahiya_boy Это неправда. Установка 'isActive' - это новый и лучший способ сделать это, но любой из них должен работать. В документах есть заметка «Свойство isActive автоматически добавляет и удаляет ограничение из правильного представления» –
Это устаревшее использование автоматического макета. Замените весь метод этой единственной строкой: 'self.widthAnchor.constraint (equalTo: supiew! .widthAnchor, множитель: 0.2) .isActive = true'. Это также было бы ошибкой, так как у вас нет набора Superview. –