Я пытаюсь создать собственный вид многократного использования, скажем, QuestionView
. Теперь я использую этот класс для расширения моим QuestionView
, поэтому он загружает представление из моего xib, затем это представление добавляется как подпредставление к self
. Это работает нормально, если мой вид имеет постоянную высоту и ширину, но мне нужен такой макет
Владелец файла этого представления установлен как QuestionView
.
У меня есть метка сверху, которая связана с верхним, левым и правым с помощью ограничений, но она гибкая с точки зрения высоты - метка многострочная. Представление кнопок «Да/Нет» связано с нижней частью метки, слева и справа от суперпредставления и имеет постоянную высоту. Детальный вид, связанный с нижней частью вида кнопок, слева и справа, имеет постоянную высоту. Так что мой QuestionView
имеет гибкую высоту. Например, если я изменяю текст метки на 2 строки, мой вид должен быть растянут.
У меня есть ViewController xib, где я помещаю общий вид и устанавливаю его класс на QuestionView
.
Я просто добавляю это представление как подпредставление QuestionView
, поэтому я думаю, что есть проблема с ограничениями между представлением и подпредставлением, я должен их добавить? Я попытался добавить левое, правое, верхнее и нижнее ограничения между ними, установив для translatesAutoresizingMaskIntoConstraints
значение false, но все равно получил странную (похожую на высоту из xibs) высоту супервида (QuestionView
), высота подвида в порядке во время выполнения.
Так что я делаю неправильно здесь? Нужно ли как-то по-другому привязывать высоту подвида к высоте супервизора?
UPD. Вот скриншот во время выполнения, серый вид - это его размер во время выполнения, он должен быть растянут до нижней части TextField. Теперь похоже, что это был ложный эффект правильной высоты подвида во время выполнения.
Вот мой код сейчас
import UIKit
protocol NibDefinable {
var nibName: String { get }
}
@IBDesignable
class NibLoadingView: UIView, NibDefinable {
var containerView: UIView!
var nibName: String {
return String(self.dynamicType)
}
override init(frame: CGRect) {
super.init(frame: frame)
nibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
nibSetup()
}
private func nibSetup() {
//clipsToBounds = true
containerView = loadViewFromNib()
containerView.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(containerView)
addConstraint(.Top)
addConstraint(.Left)
addConstraint(.Bottom)
addConstraint(.Right)
}
private func addConstraint(attribute: NSLayoutAttribute) {
self.addConstraint(NSLayoutConstraint(item: self,
attribute: attribute,
relatedBy: .Equal,
toItem: containerView,
attribute: attribute,
multiplier: 1,
constant: 0.0
))
}
private func loadViewFromNib() -> UIView {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
let nibView = nib.instantiateWithOwner(self, options: nil).first as! UIView
return nibView
}
}