Загрузка UIView из Bundle только частично заполняет экран - PullRequest
0 голосов
/ 19 января 2019

Screenshot from simulator iphone xr

Привет.

Используя Swift 4, я пытаюсь загрузить пользовательский UIView с XIB на UIViewController.

Однако кажется, что он только частично заполняет экран, и я не уверен, почему.

Я сделал следующее:

  1. Контроллер представления определенв UIStoryboard
  2. UIViewController, который добавляет UIView в viewDidLoad
  3. Файл Swift UIView и XIB подключаются через свойство «Владелец файла»
  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, чтобы загрузить файл 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 выглядит только в одном представлении без содержимого.

Storyboard

1 Ответ

0 голосов
/ 19 января 2019

Я думаю, что вы должны взять UIview (0,0,0,0 с четырьмя ограничениями) в вашем Viewcontroller, а затем назначить ему пользовательский класс, который является подклассом 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)
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...