Добавление ограничений приводит к исчезновению кнопки

#ios #swift #xcode #uikit

#iOS #swift #xcode #uikit

Вопрос:

Новичок в программировании, поэтому простите меня, если это вопрос для начинающих.

У меня есть пользовательский класс button (DropDownPicker), который я инициализирую на основе ограничений UIButton-заполнителя, который я создаю в storyboard. Другими словами, я создаю заполнитель в storyboard, делаю его выходом, а затем инициализирую свою пользовательскую кнопку, чтобы она имела те же ограничения.

В viewDidLoad контроллера представления у меня есть это:

 let button = DropDownPicker.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))

self.view.addSubview(button)

button.translatesAutoresizingMaskIntoConstraints = false
button.centerXAnchor.constraint(equalTo: placeholder.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: placeholder.centerYAnchor).isActive = true
button.leadingAnchor.constraint(equalTo: placeholder.leadingAnchor).isActive = true
button.trailingAnchor.constraint(equalTo: placeholder.trailingAnchor).isActive = true
button.topAnchor.constraint(equalTo: placeholder.topAnchor).isActive = true
button.bottomAnchor.constraint(equalTo: placeholder.bottomAnchor).isActive = true
  

И в классе DropDownPicker у меня есть:

 override init(frame: CGRect) {
    super.init(frame: frame)

    layer.cornerRadius = 15
    layer.masksToBounds = true
    clipsToBounds = true
}
  

Странно то, что если я создам заполнитель в пустом контроллере представления без каких-либо ограничений, это сработает. Но если я добавлю ограничения, она исчезнет. Есть идеи, почему это может быть?

Спасибо!

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

1. Почему вы используете заполнитель? Почему бы не разместить кнопку DropDownPicker непосредственно в раскадровке?

2. Задайте кнопке размер. Значение, установленное width и height на что-то другое, чем 0 .

3. @Supporteroftruth К сожалению, я не смог понять, как это сделать. У меня есть кнопка, установленная в моем классе DropDownPicker, но из того, что я могу сказать, ее все еще нужно инициализировать из контроллера представления. Еще раз прошу прощения за суперосновной вопрос.

4. @Don Я пробовал это, но безуспешно.

5. Все в порядке, вы должны делать это так, как упоминал @supporteroftruth. В вашем init приведенном выше примере удалите свой установочный код и поместите его в новый метод, который называется setup() или что-то в этом роде. Вам также нужно будет добавить required init?(coder aDecoder: NSCoder) {} . Вызовите super и ваш новый setup() метод также изнутри этого init . Это то, init что использует раскадровка. Поскольку вы уже настраиваете класс в инспекторе идентификации, все должно быть готово.