Не удается получить ограничения прямо в пользовательской клавиатуре iOS8

У меня серьезные проблемы с автоматическим макетом в iOS 8. Я работаю над пользовательской клавиатурой, но не могу отобразить вид на правильной высоте. Визуализированный вид на устройстве получается слишком низким, больше похожим на предполагаемую высоту только UIImageView. Я установил ограничения, как показано на рисунке:

Скриншот XCode

Но я продолжаю получать эту ошибку в журнале, которая ничего не говорит мне (вероятно, потому что я не понимаю, где искать):

2014-12-06 19:56:45.095 [40268:12181198] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this:(1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x600000096940 V:[UIInputView:0x7fe780d3f600(246)]>",
    "<NSLayoutConstraint:0x600000097390 'UIView-Encapsulated-Layout-Height' V:[UIInputView:0x7fe780d3f600(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600000096940 V:[UIInputView:0x7fe780d3f600(246)]>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

Я пытался следовать коду в iOS 8 Custom Keyboard: изменение высоты, но он все равно не работает.

Редактировать:

Я устанавливаю ограничение по высоте с помощью следующей функции:

override func updateViewConstraints() {
    super.updateViewConstraints()
    // Add custom view sizing constraints here
    let changeToOrientation = deviceInfoService.getOrientationForView(self.inputView)

    if (changeToOrientation == Orientation.Portrait) {
        self._heightConstraint!.constant = 246
        self.inputView.addConstraint(self._heightConstraint!)
    } else {
        self._heightConstraint!.constant = 192
        self.inputView.addConstraint(self._heightConstraint!)
    }
}

3 ответа

Решение

Ошибка говорит вам, что у вас есть конфликтующие ограничения. UIView-Encapsulated-Layout-Height кажется, предопределенная высота (При поиске я в основном нашел ссылки на его использование в UICollectionView). Я предполагаю, что высота, определяемая ОС, разрешена вашей клавиатуре. Другим ограничением, скорее всего, является размер встроенного содержимого созданного вами представления (316 и 30 действительно составляют 246).

Я пришел к выводу, что вы, вероятно, сделали что-то не так, когда вы изменили высоту. Поскольку я не слишком знаком с разработкой расширения клавиатуры, я не могу вам сказать, что. Однако, когда дело дошло до расширений Today, с которыми я немного поработал, был метод, который вы могли переопределить, который указывал высоту виджета.

Это похоже на ошибку в реализации пользовательской клавиатуры iOS. Обходной путь в настоящее время состоит в том, чтобы приспособить приоритет вашего ограничения к больше / меньше чем 1000

Это похоже на то, как можно обеспечить высоту TodayExtension. Попробуй это:

self.preferredContentSize = CGSizeMake(320, 246);

Вот так я явно установил высоту моего сегодняшнего расширения против ограничения высоты. Я попробую это сам, просто сейчас собираю пример проекта клавиатуры.

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