从 Bundle 加载 UIView 只会部分填满屏幕

Loading UIView from Bundle only fills screen partially

你好。

使用 Swift 4,我试图将带有 XIB 的自定义 UIView 加载到 UIViewController 上。

但是,它似乎只是部分填满了屏幕,我不确定为什么。

我做了以下事情:

  1. 视图控制器在 UIStoryboard 中定义
  2. viewDidLoad
  3. 中添加 UIView 的 UIViewController
  4. UIView swift 文件和 XIB 通过文件所有者连接 属性
  5. XIB 文件添加到 copy bundle resources
  6. 粉红色背景颜色是使用 Xcode 可视化编辑器设置的,不是在代码中完成的。
  7. 我使用 iphone xr 进行模拟,但是如果我在 iPhone 6s
  8. 上进行模拟,我会遇到同样的问题

视图控制器代码是空的,但我已经包含了相关部分:

// 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)
        }
    }