Пользовательский гибкий многоразовый вид с использованием xib

Я пытаюсь создать собственный вид многократного использования, скажем, QuestionView. Теперь я использую этот класс для расширения моим QuestionView, поэтому он загружает представление из моего xib, затем это представление добавляется как подпредставление к self. Это работает нормально, если мой вид имеет постоянную высоту и ширину, но мне нужен такой макет

Просмотр вопроса xib

Владелец файла этого представления установлен как 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
    }

}

person pavelkorolevxyz    schedule 16.04.2016    source источник
comment
Можете ли вы предоставить изображение вашего макета времени выполнения. сложно понять по твоему описанию   -  person slxl    schedule 16.04.2016
comment
и да, вы должны установить для translatesAutoresizingMaskIntoConstraints значение false и добавить четыре боковых ограничения в nibSetup()   -  person slxl    schedule 16.04.2016


Ответы (1)


Во-первых, вам нужно добавить ограничение между QuestionView и нижней частью его супервизора.

Во-вторых, похоже, что проблема может быть связана с супервизором QuestionView и его родительскими ограничениями.

UPD

лучший инструмент для устранения таких ошибок – Reveal.

person slxl    schedule 16.04.2016