【发布时间】:2019-06-13 05:56:47
【问题描述】:
你好。
使用 Swift 4,我正在尝试将带有 XIB 的自定义 UIView 加载到 UIViewController 上。
但是,它似乎只是部分填满了屏幕,我不知道为什么。
我做了以下事情:
- 视图控制器在 UIStoryboard 中定义
- 在
viewDidLoad中添加 UIView 的 UIViewController - UIView swift 文件和 XIB 通过 File Owner 属性连接
- XIB文件被添加到
copy bundle resources - 亮粉色背景颜色是使用 Xcode 可视化编辑器设置的,而不是在代码中完成的。
- 我使用 iphone xr 进行模拟,但如果我在 iPhone 6s 上进行模拟,我会遇到同样的问题
视图控制器代码是空的,但我已经包含了相关部分:
// QuestionViewController
class QuestionViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let subview = QuestionView()
self.view.addSubview(subview)
}
}
UIView 也很基本:
class QuestionView: UIView, XibView {
override init(frame: CGRect) {
super.init(frame: frame)
setupXib()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setupXib()
}
func setupXib() {
guard let v = loadFromXib() else {
return
}
addSubview(v)
}
}
我使用在 stackoverflow 上找到的协议从 bundle 加载 xib 文件。最初我什至在加载捆绑包时遇到了很多问题,但幸运的是我能够纠正这个问题。反正我的XIB协议文件在这里:
// XIB protocol file
protocol XibView {
func setupXib()
func constrainView(_ view: UIView)
func loadFromXib() -> UIView?
}
extension XibView where Self: UIView {
func setupXib() {
if let xibView = loadFromXib() {
addSubview(xibView)
constrainView(xibView)
}
}
func constrainView(_ view: UIView) {
view.translatesAutoresizingMaskIntoConstraints = false
addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "V:|[view]|",
options: [.alignAllCenterX, .alignAllCenterY],
metrics: nil,
views: ["view": view]
)
)
addConstraints(
NSLayoutConstraint.constraints(
withVisualFormat: "H:|[view]|",
options: [.alignAllCenterX, .alignAllCenterY],
metrics: nil,
views: ["view": view]
)
)
}
func loadFromXib() -> UIView? {
let xibView = UINib(nibName: String(describing: Self.self), bundle: Bundle(for: type(of: self))).instantiate(withOwner: self, options: nil).first as? UIView
return xibView
}
}
--
问题:
为什么 UIView 没有填满整个屏幕或仅部分填满屏幕,我该如何解决这个问题?
感谢
编辑:
情节提要寻找 UIViewController 只有一个没有内容的视图。
【问题讨论】: