Я знаю, что у этого есть много ответов на SO и в другом месте, однако я все еще пытаюсь понять, как применить это в моем контексте. Кажется, есть много противоречивых и разнообразных советов, и я изо всех сил пытаюсь понять все это.
У меня есть ViewController, который загружает UIView, который затем загружает файл xib как подпредставление этого UIView следующим образом:
VC:
let cardExpanded = CardExpanded(frame: view.frame)
view.addSubview(cardExpanded)
customUIView:
class CardExpanded: UIView {
var cardLeadingAnchor : NSLayoutConstraint?
var cardTrailingAnchor : NSLayoutConstraint?
var cardTopAnchor : NSLayoutConstraint?
var cardBottomAnchor : NSLayoutConstraint?
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
guard let view = Bundle.main.loadNibNamed("CardExpanded", owner: self, options: nil)?.first as? UIView else {
return
}
self.maximizedView(view: view)
}
func maximizedView(view: UIView) {
addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
let topConstraint = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem:self , attribute: .top, multiplier: 1.0, constant: 20.0)
let bottomConstraint = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem:self , attribute: .bottom, multiplier: 1.0, constant: -20.0)
let leadingConstraint = NSLayoutConstraint(item: view, attribute: .leading, relatedBy: .equal, toItem:self , attribute: .leading, multiplier: 1.0, constant: 20.0)
let trailingConstraint = NSLayoutConstraint(item: view, attribute: .trailing, relatedBy: .equal, toItem:self , attribute: .trailing, multiplier: 1.0, constant: -20.0)
self.addConstraints([topConstraint, bottomConstraint, leadingConstraint, trailingConstraint])
}
Как вы можете видеть, я могу установить его так, как показано, и отображается представление и xib.
Однако есть ряд проблем:
1) Теперь у меня есть VC плюс подпредставление (cardExpanded - у меня также есть другие представления в VC), а затем у меня есть подпредставление cardExpanded (файл с именем xib, называемый view). Это кажется излишне сложным, все, что я хочу сделать, это загрузить файл XIB в VC. (я хочу анимировать его позже, и нет необходимости иметь промежуточный вид).
2) Я не хочу просто добавлять файл xib непосредственно в ViewController, например:
guard let view = Bundle.main.loadNibNamed("CardExpanded", owner: self, options: nil)?.first as? UIView else {
return
}
view.addSubview(view)
потому что тогда я должен установить ограничения внутри ВК. Я хочу загрузить представление с VC, как я сделал, и затем сделать представление САМОГО файла XIB.
Я столкнулся с проблемами здесь, так же как когда я пытался сделать это в своем пользовательском классе UIView, я не мог установить автоограничения на самом представлении, потому что они должны были быть ограничены superView, но, очевидно, я не могу получить доступ к представлению .superView в инициализации, так как представление еще не существует ..
3) Если я должен установить ограничения автопереключения в VC, то как я могу реорганизовать свой код. У меня много кодов ограничений в VC atm, которые я хочу оттуда удалить. Очевидно, я мог бы реорганизовать весь VC View из VC, но когда я использую mapkit, анимацию и библиотеки Geometry, и я волнуюсь, это создаст множество проблем с минимальной выгодой. (я не уверен)
Итак, мои вопросы:
1) Могу ли я удалить промежуточный UIView и создать UIView непосредственно из файла XIB?
2) Могу ли я установить автоограничения для ViewController изнутри UIView, либо при инициализации, либо иным образом
3) Если я должен использовать autolayout во ViewController, как я могу реорганизовать его, чтобы он был читабельным?
Спасибо