从 Bundle 加载 UIView 只会部分填满屏幕
Loading UIView from Bundle only fills screen partially
你好。
使用 Swift 4,我试图将带有 XIB 的自定义 UIView 加载到 UIViewController 上。
但是,它似乎只是部分填满了屏幕,我不确定为什么。
我做了以下事情:
- 视图控制器在 UIStoryboard 中定义
- 在
viewDidLoad
中添加 UIView 的 UIViewController
- UIView swift 文件和 XIB 通过文件所有者连接 属性
- 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)
}
}
我使用在 Whosebug 上找到的协议从包中加载 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 只有一个没有内容的视图。
我认为你应该在你的 Viewcontroller 中使用 UIview(0,0,0,0 四个约束),然后为它分配一个自定义的 class,它是一个 subclass UIView再加载Xib文件肯定会占满整个屏幕
试试这个人::----
class QuestionViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let subview = QuestionView()
subview.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.width)
self.view.addSubview(subview)
}
}
你好。
使用 Swift 4,我试图将带有 XIB 的自定义 UIView 加载到 UIViewController 上。
但是,它似乎只是部分填满了屏幕,我不确定为什么。
我做了以下事情:
- 视图控制器在 UIStoryboard 中定义
- 在
viewDidLoad
中添加 UIView 的 UIViewController
- UIView swift 文件和 XIB 通过文件所有者连接 属性
- 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)
}
}
我使用在 Whosebug 上找到的协议从包中加载 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 只有一个没有内容的视图。
我认为你应该在你的 Viewcontroller 中使用 UIview(0,0,0,0 四个约束),然后为它分配一个自定义的 class,它是一个 subclass UIView再加载Xib文件肯定会占满整个屏幕
试试这个人::----
class QuestionViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let subview = QuestionView()
subview.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.width)
self.view.addSubview(subview)
}
}