2016-11-15 2 views
0

Я создал пользовательский вид с помощью файла .Xib. Когда я создаю представление программно и добавляю его в свой ViewController, он работает отлично. Но если я создаю UIView в Interface Builder и задаю класс для своего класса CustomView и запустим его, он не появится.Пользовательский вид, созданный с использованием Xib, не работающего в Interface Builder

Это код в моем CustomView классе:

@IBOutlet var view: UIView! 

init() { 
    super.init(frame:CGRect.zero) 
    setup() 
} 

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

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
    setup() 
} 


func setup() { 
    Bundle.main.loadNibNamed("CustomView", owner: self, options: nil) 
    view.backgroundColor = UIColor(red: 10.0/255.0, green: 30.0/255.0, blue: 52.0/255.0, alpha: 1.0) 
    view.translatesAutoresizingMaskIntoConstraints = false 
    view.isUserInteractionEnabled = true 
} 


func presentInView(superView:UIView) { 

    superView.addSubview(view) 

    // Define Constraints 
    let height = NSLayoutConstraint(item: view, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 90.0) 
    view.addConstraint(height) 

    let topConstraint = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: superView, attribute: .top, multiplier: 1.0, constant: 0.0) 
    let leftConstraint = NSLayoutConstraint(item: view, attribute: .left, relatedBy: .equal, toItem: superView, attribute: .left, multiplier: 1.0, constant: 0.0) 
    let rightConstraint = NSLayoutConstraint(item: view, attribute: .right, relatedBy: .equal, toItem: superView, attribute: .right, multiplier: 1.0, constant: 0.0) 
    superView.addConstraints([topConstraint,leftConstraint, rightConstraint]) 
} 

В файле .Xib я установить класс для Files Owner к CustomView и подключить IBOutlet view к главному представлению в .Xib.

В моей ViewController я сделал это, чтобы добавить CustomView к нему:

let customView = CustomView() 
customView.presentInView(superView: self.view) 

Когда я добавляю UIView в Interface Builder, он должен работать так же, как это происходит, когда я делаю это программно.

ответ

0

Проблема была размер view, то IBOutlet, что я связан с моей точки зрения в файле .Xib. Когда я создал свой код CustomView, я также вызвал метод presentInView, который я, однако, был лишним при создании в построителе интерфейса, потому что я устанавливал там ограничения. Но я забыл, что ограничения, которые я установил в Interface Builder, предназначены для самого класса, а не для его view. Таким образом, view нуждается в ограничениях, чтобы удерживать его в своем представлении, что не является ViewController.view, а CustomView. Вот почему мне также приходится писать self.addSubview(view)

С этими изменениями он работает. Вот окончательный код:

func setup() { 

    Bundle.main.loadNibNamed("CustomView", owner: self, options: nil) 
    view.backgroundColor = UIColor(red: 10.0/255.0, green: 30.0/255.0, blue: 52.0/255.0, alpha: 1.0) 
    view.translatesAutoresizingMaskIntoConstraints = false 
    view.isUserInteractionEnabled = true 
    self.addSubview(view) 

    let topConstraint = NSLayoutConstraint(item: view, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0.0) 
    let leftConstraint = NSLayoutConstraint(item: view, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1.0, constant: 0.0) 
    let rightConstraint = NSLayoutConstraint(item: view, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1.0, constant: 0.0) 
    let bottomConstraint = NSLayoutConstraint(item: view, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0.0) 
    self.addConstraints([topConstraint,leftConstraint, rightConstraint, bottomConstraint]) 

} 

Это presentInView метод больше не нужен.

Надеюсь, что это поможет, если у кого-то есть такая проблема.

1

Вы назначили класс CustomView для uiview в интерфейсе Builder.

Assigning UIView As you CustomView

+0

Да, я назначил его так же, как вы сделали – Codey

+0

. Вы установили NSLayoutConstraint. Из конструктора интерфейса и сделайте их выход для дальнейших изменений. –

+0

Да, я создал ограничения, но я не сделал его выходом, потому что мне он больше не нужен. – Codey

Смежные вопросы