XIB和容器视图的自动高度

时间:2016-10-06 13:04:30

标签: ios swift autolayout interface-builder xcode8

我正在尝试为我的故事板构建可重用的视图,让我们从XIB开始:

XIB TextField on Interface Builder

此视图包含一个UITextField,其标签显示错误,File的所有者已连接到此类:

import Foundation
import UIKit

@IBDesignable
class TextField: UIView {

    @IBOutlet weak var textField: UITextField!

    @IBOutlet weak var errorLabel: UILabel!

    @IBOutlet weak var errorLine: UIImageView!

    var view: UIView!

    func loadViewFromNib() -> UIView {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "TextField", bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView

        return view
    }

    func xibSetup() {
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]
        addSubview(view)
    }

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

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

    @IBInspectable var placeholder: String? {
        didSet {
            textField.placeholder = placeholder
        }
    }

    @IBInspectable var isSecureTextEntry: Bool = false {
        didSet {
            textField.isSecureTextEntry = isSecureTextEntry
        }
    }

    @IBInspectable var errorText: String? {
        didSet {
            errorLabel.text = errorText
        }
    }

    func showError() {
        errorLine.isHidden = false
        errorLabel.isHidden = false
    }

    func hideError() {
        errorLine.isHidden = true
        errorLabel.isHidden = true
    }
}

然后我在Main.storyboard上使用它作为UIView,将类设置为TextField:

enter image description here

这里的问题是我每次使用这个TextField类时都需要为高度添加一个约束,我尝试使用instrinsic size作为Main.storyboard上的UIView的占位符(删除高度约束)但是在运行时与XIB的高度不同。

View Controller的容器视图也出现同样的问题,我遇到这种情况:

enter image description here

如何使容器视图与嵌入的视图控制器的高度相同? (作为测试,我将大红色视图控制器的高度设置为1500px以查看它是否滚动,如果我对容器视图的高度设置了约束,滚动视图的内容大小是正确的,但我想避免对高度的约束,我希望它是自动的)

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:0)

我使用了我在这里描述的相同技术: https://medium.com/zenchef-tech-and-product/how-to-visualize-reusable-xibs-in-storyboards-using-ibdesignable-c0488c7f525d#.3c0javomy

确保Xib中的所有约束定义视图的高度。 在故事板中使用它时,您不需要再次设置高度。但是,在渲染视图之前,您将在故事板中看到IB约束错误。