【问题标题】:Loading UIView from Bundle only fills screen partially从 Bundle 加载 UIView 仅部分填充屏幕
【发布时间】:2019-06-13 05:56:47
【问题描述】:

你好。

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

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

我做了以下事情:

  1. 视图控制器在 UIStoryboard 中定义
  2. 在viewDidLoad 中添加 UIView 的 UIViewController
  3. UIView swift 文件和 XIB 通过 File Owner 属性连接
  4. XIB文件被添加到copy bundle resources
  5. 亮粉色背景颜色是使用 Xcode 可视化编辑器设置的,而不是在代码中完成的。
  6. 我使用 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 只有一个没有内容的视图。

【问题讨论】:

    标签: swift uiview nsbundle


    【解决方案1】:

    我认为你应该在你的 Viewcontroller 中取一个 UIview(0,0,0,0 四个约束),然后为其分配一个自定义类,它是 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)
            }
        }
    

    【讨论】:

    • 我尝试将 UIView 创建为变量 var subview = QuestionView() 但这具有相同的效果。我想让 UIView 与 UIViewController 分开,因为我需要做很多 UIView 动画和其他不属于 UIViewController 的相关代码。
    • 我不确定我应该把 (0,0,0,0) 的 UIView 放在哪里,或者为什么这样会起作用,你能发布一些代码来显示你把它放在哪里吗?
    • 如果我将 UIView 物理添加到情节提要 UIViewController 中,并使用约束将所有角固定到边缘,并重命名该类以匹配我的自定义 UIView 并向 UIViewController 添加一个出口,该出口也与 UIViewController 匹配然后它会工作 - 但我不明白为什么我必须这样做,我见过的其他示例没有将 UIViews 添加到情节提要
    • 好的,我试试看
    • 我试过你的解决方案,效果很好。我不知道为什么我需要在我的视图控制器中设置 subview.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: view.bounds.width) ,但我不仅仅是很高兴它有效。赞成并接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 2015-03-14
    • 2017-09-13
    • 2021-04-05
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    相关资源
    最近更新 更多