Почему у меня есть это дополнительное пространство, когда я добавляю UIView.xib?

Почему у меня есть это дополнительное пространство, когда я добавляю UIView.xib в UIView, используемый в качестве контейнера для UIViewController. Я использую раскадровку для UIViewController, Xcode 9.2,. Синяя область - это контейнер.

экран

class MyViewController: UIViewController {
     override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        //Same problem if I am calling this into a Button action
        calendarView = ClassName(frame: containerView.frame)
        containerView.addSubview(calendarView)
    }   
}

class ClassName: UIView{
override init(frame: CGRect) {
    super.init(frame: frame)        
    commonInit()
}

 required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    commonInit()
}

private func commonInit(){        
    Bundle.main.loadNibNamed("NibName", owner: self, options: nil)
    addSubview(contentView)

    contentView.frame = bounds
    contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]


 }
}

1 ответ

Решение

Ответ на вопрос "Что это такое" таков: это расстояние между containerView и вершина его суперпредставления.

Думаю об этом. У вас есть эта строка:

calendarView = ClassName(frame: containerView.frame)

Но следующая строка будет:

containerView.addSubview(calendarView)

Но вы не можете установить фрейм представления с точки зрения фрейма его суперпредставления. Они находятся в двух разных координатных пространствах! Результатом здесь является то, что calendarView смещен в пределах своего суперпредставления точно так же, как containerView смещен в пределах своего суперпредставления. Зачастую результат будет намного хуже, чем это.

Вы имеете в виду границы.

calendarView = ClassName(frame: containerView.bounds)
containerView.addSubview(calendarView)

Теперь calendarView точно заполнит containerView,

(Конечно, у вас все еще будут проблемы позже, потому что вы не позиционируете вещи, используя автопоставку. Но по крайней мере это даст вам начальную позицию, которую вы ожидаете.)

Другие вопросы по тегам