从框架加载.xib文件

时间:2018-02-15 19:39:07

标签: swift xib

我使用自定义视图创建框架。当我尝试将其加载到模拟器时,它会加载,但是当在不同的iPhone模拟器中加载时会出现错误。

我将约束设置为0,但自定义视图不会在所有视图中加载。

框架代码:

@IBDesignable
public class SummaryHeaderView: UIView {

    /* View */
    @IBOutlet public var view: UIView!

    public override init(frame: CGRect) {
        super.init(frame: frame)
        setUpNib()
    }

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

    internal func setUpNib() {
        view = loadNib()
        view.frame = bounds
        view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        addSubview(view)
    }

    internal func loadNib() -> UIView {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: String(describing: SummaryHeaderView.self), bundle: bundle)
        guard let summaryHeaderView = nib.instantiate(withOwner: self, options: nil).first as? UIView else {
            return UIView()
        }
        return summaryHeaderView
    }

}

应用代码:

@IBOutlet weak var myView: UIView!

var summary = SummaryHeaderView()

override func viewDidLoad() {
    super.viewDidLoad()
    summary = SummaryHeaderView(frame: self.myView.bounds)

    myView.addSubview(summary)
}

结果:

enter image description here

1 个答案:

答案 0 :(得分:2)

您的代码存在一个严重问题:

override func viewDidLoad() {
    super.viewDidLoad()
    summary = SummaryHeaderView(frame: self.myView.bounds)
}

您在此假设self.myView.boundsviewDidLoad运行时已知。这个假设是错误的。 viewDidLoad为时尚早。因此,您的摘要标题视图显示的大小错误。

一个简单的解决方案是:不是在任何地方使用绝对帧,而是在任何地方使用自动布局约束。这样,无论屏幕有多大,所有视图和子视图都会自动调整

另一种方法是等到视图的大小已知。例如,将代码移至viewDidLayoutSubviews。但是你必须采取额外的步骤,以便以后不再添加子视图,因为在应用程序的生命周期内可以多次调用viewDidLayoutSubviews