从框架加载 .xib 文件
Load .xib file from framework
我使用自定义视图创建了一个框架。当我尝试将其加载到模拟器时,它会加载,但是当在不同的 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
运行时已知。这个假设是错误的。 viewDidLoad
太早了。因此,您的摘要 header 视图显示的尺寸错误。
一个简单的解决方案是:不要到处使用绝对框架,而是到处使用自动布局约束。这样,无论屏幕有多大,您的所有视图和子视图都会自动调整。
另一种方法是等到视图的大小 已知。例如,将您的代码移至 viewDidLayoutSubviews
。但是你必须采取额外的步骤,这样你以后就不会再添加子视图了,因为 viewDidLayoutSubviews
在应用程序的生命周期中可以被调用很多次。
我使用自定义视图创建了一个框架。当我尝试将其加载到模拟器时,它会加载,但是当在不同的 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
运行时已知。这个假设是错误的。 viewDidLoad
太早了。因此,您的摘要 header 视图显示的尺寸错误。
一个简单的解决方案是:不要到处使用绝对框架,而是到处使用自动布局约束。这样,无论屏幕有多大,您的所有视图和子视图都会自动调整。
另一种方法是等到视图的大小 已知。例如,将您的代码移至 viewDidLayoutSubviews
。但是你必须采取额外的步骤,这样你以后就不会再添加子视图了,因为 viewDidLayoutSubviews
在应用程序的生命周期中可以被调用很多次。