Xcode - странная проблема с xib и автоматической компоновкой (xib расширяется до случайной высоты)

У меня странная автоматическая компоновка с проблемой файла/класса xib. Я создал собственное представление уведомлений (подкласс UIView) в Swift, в котором используется файл xib.

  • Когда устройство находится в портретной ориентации при загрузке, уведомление в порядке.
  • Когда я поворачиваюсь в альбомную ориентацию, снова с уведомлением все в порядке (однако взаимодействие кнопок каким-то образом отключается/не отвечает)
  • Когда я поворачиваюсь обратно в портретную ориентацию, представление xib (т. е. «я») расширяется до случайной высоты (обратите внимание на «желтый» фон, который устанавливается: self.backgroundColor = UIColor .желтый цвет()

Ничто в моем коде не устанавливает рамку или ограничения после первоначального добавления в контроллер представления. Я настроил каждое ограничение автоматического макета в файле xib, о котором я мог подумать, и по-прежнему сталкиваюсь с этой проблемой.

Вот несколько скриншотов: введите сюда описание изображениявведите здесь описание изображения


person JimmyJammed    schedule 07.11.2014    source источник


Ответы (2)


Попробуйте добавить ограничение по высоте в представление. В конце списка ограничений у вас есть: - Вертикальное пространство (которое, я думаю, это вертикальное пространство вверху - Горизонтальное пространство - Горизонтальное пространство - Добавьте ограничение высоты для представления, чтобы оно никогда не изменяло свою высоту.

person diegomen    schedule 07.11.2014

Ок решил. Итак, проблема в том, что вы не можете настроить автоматические ссылки на макет в IB из xib во внешний UIViewController (поскольку они не знают друг о друге, пока вы программно не добавите xib в качестве подпредставления). Таким образом, вы должны программно создать ограничения.

Вот как я это сделал:

    // Manual constraints required since view is a xib file being added to an external view controller
    self.setTranslatesAutoresizingMaskIntoConstraints(false)
    var constraintHeight = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 44)
    self.addConstraint(constraintHeight)
    var constraintWidth = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: self.presentingViewController?.view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 1)
    self.presentingViewController?.view.addConstraint(constraintWidth)
    var constraintTop = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: underView, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0)
    self.presentingViewController?.view.addConstraint(constraintTop)
person JimmyJammed    schedule 07.11.2014