Swift 从framework加载.xib文件

Swift 从framework加载.xib文件,swift,xib,Swift,Xib,我创建了一个带有自定义视图的框架。当我尝试将其加载到模拟器时,它会加载,但在不同的iPhone模拟器中加载时会出现错误 我将约束设置为0,但自定义视图不会在所有视图中加载 框架代码: @IBDesignable public class SummaryHeaderView: UIView { /* View */ @IBOutlet public var view: UIView! public override init(frame: CGRect)

我创建了一个带有自定义视图的框架。当我尝试将其加载到模拟器时,它会加载,但在不同的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)
}
结果:


代码的一个严重问题是:

override func viewDidLoad() {
    super.viewDidLoad()
    summary = SummaryHeaderView(frame: self.myView.bounds)
}
这里假设
self.myView.bounds
viewDidLoad
运行时已知。这种假设是错误的<代码>查看加载太早了。因此,摘要标题视图显示的大小不正确

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


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

请显示足够的代码以允许您的代码编译。什么是
视图
?什么是
界限
?不要显示使用未声明变量的代码。太好了,谢谢!那么到底是什么问题呢?您是否不喜欢加载视图的大小?绿色背景是我创建的框架中的.xib文件。灰色背景是我的应用程序中的视图。我在我的视图控制器中初始化绿色背景,高度和宽度应该占据所有视图。是的,这是我在我的回答(下面)中假设的。