Загрузка пользовательского представления с помощью кончика приводит к удалению ограничений

#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)
    }
}