从框架加载 .xib 文件

Posted

技术标签:

【中文标题】从框架加载 .xib 文件【英文标题】:Load .xib file from framework 【发布时间】:2018-02-15 19:39:07 【问题描述】:

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

结果:

【问题讨论】:

请显示足够的代码以允许您的代码编译。 view 是什么? bounds 是什么?不要显示使用未声明变量的代码。 太好了,谢谢!那么究竟是什么问题呢?是不是你不喜欢加载视图的size 绿色背景是我创建的框架中的 .xib 文件。灰色背景是我的应用程序中的视图。我在视图控制器中初始化绿色背景,高度和宽度应该占据所有视图。 是的,这就是我在回答中所假设的(如下)。 【参考方案1】:

您的代码的一个严重问题是:

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

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

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

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

【讨论】:

以上是关于从框架加载 .xib 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在框架内加载 `.xib` / `.nib` 文件?

iOS:如何在框架内加载 xib

从 nsbundle 访问图像

Xcode Interface Builder加载XIB文件显示具有透明度的视图

我正在使用 xcode 9。如何在里面创建带有 xib 文件的框架?

我可以直接从具有特定大小类或特征集合的 xib 加载 UITableViewCell 吗?