#ios #swift #uiview #constraints #nib
#iOS #swift #uiview #ограничения #наконечник
Вопрос:
Обзор
Я создал пользовательский класс представления и связанный с ним кончик. Когда я пытаюсь загрузить его в другой контроллер представления, он загружает его, но ограничения удаляются.
Прежде чем пометить это как дубликат…
Что я обнаружил, я прочитал много вопросов о StackOverflow людей, имеющих те же проблемы, но те, что в swift, либо остались без ответа, либо не работают. Я перепробовал все.
Что я делаю
У меня есть контроллер представления (который является контроллером keyboardviewcntroller, но на обычном у меня все еще есть проблема) со связанным наконечником и пользовательским UIView со связанным с ним наконечником.
- KeyboardViewController:
я связал с моим контроллером представления клавиатуры zip-файл. Его владельцем файла является KeyboardViewController.
В моем KeyboardViewController у меня есть базовый код, который вы получаете, создавая цель клавиатуры, а затем я добавил выход пользовательского представления перед viewDidLoad
@IBOutlet weak var vieww: Custom!
и внутри моего viewDidLoad я загрузил свой наконечник
let nib = UINib(nibName: "nibbb", bundle: nil)
let objects = nib.instantiate(withOwner: self, options: nil)
view = objects[0] as? UIView
- Пользовательский вид
В моем пользовательском представлении также есть связанный кончик. Его владелец файла является пользовательским (мой новый класс). В кончик я поместил кнопку и метку, как показано на рисунке ниже, и добавил некоторые ограничения.
В пользовательский класс я помещаю следующий код, который включает выходы и инициализацию класса.
@IBOutlet weak var label: UILabel!
@IBOutlet weak var button: UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit(){
Bundle.main.loadNibNamed("Custom", owner: self, options: nil)
addSubview(label)
label.frame = self.bounds
label.autoresizingMask = [.flexibleHeight, .flexibleWidth]
addSubview(button)
button.frame = self.bounds
button.autoresizingMask = [.flexibleHeight, .flexibleWidth]
}
}
Это результат, который я получаю:
и, конечно, это не то, чего я хотел.
Вопрос
Как мне загрузить пользовательский кончик UIView с другого контроллера представления, не нарушая мои ограничения?
Ответ №1:
Причина, по которой ваши ограничения работают не так, как ожидалось, заключается в том, что в функции commonInit метка и кнопка устанавливаются того же размера, что и представление.
Вы должны объявить свойство UIView, а затем заменить содержимое функции commonInit:
var contentView: UIView!
private func commonInit() {
if let nib = Bundle.main.loadNibNamed("Custom", owner: self, options:nil)?.first as? UIView {
contentView = nib
contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
contentView.frame = bounds
addSubview(contentView)
}
}