Пользовательская раскадровка клавиатуры с бета-версией Xcode 8

У меня возникли проблемы с созданием пользовательской клавиатуры из раскадровки в Xcode 8 beta 6.
По какой-то причине, когда я запускаю клавиатуру на устройстве iOS 10, это результат: введите здесь описание изображения

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

Вид снизу:введите описание изображения  здесь



Поэтому отображается только высота нижнего вида.
У меня нет этой проблемы с iOS 9.
Есть идеи, что происходит не так?

ОБНОВЛЕНИЕ:
так загружается клавиатура в iOS 9:
введите здесь описание изображения

ОБНОВЛЕНИЕ 2:
Даже программное создание представления в viewDidLoad() не работает:

self.view.backgroundColor = UIColor.orange

let bottomView = UIView()

bottomView.backgroundColor = UIColor.blue

self.view.addSubview(bottomView)

bottomView.translatesAutoresizingMaskIntoConstraints = false

let trailing = bottomView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor)
let leading = bottomView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor)
let bottom = bottomView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -50)
let top = bottomView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0)

NSLayoutConstraint.activate([trailing, leading, bottom, top])

Я написал отчет об ошибке Apple.
Надеюсь получить от них новости


person DanielZanchi    schedule 26.08.2016    source источник
comment
Люди против голосования вопрос. Пожалуйста, напишите в комментариях, почему они это делают?   -  person DanielZanchi    schedule 09.09.2016


Ответы (2)


У меня была такая же проблема. Я предполагаю, что у вас не установлена ​​высота зеленого блока, потому что вы хотите, чтобы он заполнил оставшееся пространство клавиатуры. Если вы хотите, чтобы клавиатура имела ПОСТОЯННУЮ высоту, вы можете просто установить ограничение по высоте для зеленого блока, и все готово, но из-за размеров экрана и ориентации вам, вероятно, не нужна одна высота для всего.

В iOS 9 размер пользовательской клавиатуры по умолчанию был таким же, как у системной клавиатуры. Поэтому, если вы запустите это в iOS 9, зеленый блок заполнит оставшееся пространство в зависимости от этих размеров. В iOS 10 по какой-то причине нет высоты по умолчанию, и поскольку ваш зеленый блок не имеет ограничений по высоте, он считает, что высота равна нулю.

Чтобы исправить это, вам нужно установить высоту клавиатуры. Это код, который я написал, чтобы справиться с этим (и пока все хорошо). Поместите это в класс keyboardviewcontroller перед ViewDidLoad, и все будет готово:

//***************************

//create constraint variable before function
var constraint = NSLayoutConstraint()

//function to set height
func setKeyboardHeight () {
    let screenSize = UIScreen.mainScreen().bounds.size
    let screenH = screenSize.height;

    self.view.removeConstraint(constraint)

    //you can set the values below as needed for your keyboard
    if screenH >= 768 {
        //for iPad landscape or portrait
        self.constraint = NSLayoutConstraint(item: self.view, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0.0, constant: 300.0)
        self.view.addConstraint(self.constraint)

    } else if screenH >= 414 {
        //for iPhone portrait AND iPhone Plus landscape or portrait
        self.constraint = NSLayoutConstraint(item: self.view, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0.0, constant: 220.0)
        self.view.addConstraint(self.constraint)

    } else {
        //for iPhone landscape
        self.constraint = NSLayoutConstraint(item: self.view, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0.0, constant: 140.0)
        self.view.addConstraint(self.constraint)
    }
}

//sets height when keyboard loads
override func updateViewConstraints() {
    super.updateViewConstraints()
    // Add custom view sizing constraints here
    setKeyboardHeight()
}

//sets or changes height when device rotates
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    setKeyboardHeight()
}

//***************************
person iOS_Mouse    schedule 15.09.2016
comment
Спасибо. Я попробую это как можно скорее. Объяснение кажется правильным. - person DanielZanchi; 16.09.2016

Пожалуйста, дайте мне знать, если я что-то упустил в этой проблеме. Если необходима дополнительная информация, используйте комментарии, и я обновлю ответ.

Я думаю, вы можете понизить приоритет сопротивления сжатию содержимого для вида сверху, если хотите, чтобы вид снизу расширялся. В вашем вопросе неясно, хотите ли вы сохранить пропорциональное расстояние между верхним и нижним представлениями.

Вы можете запустить приложение в симуляторе или на устройстве, а затем включить отладку представления и попытаться выяснить, что происходит с topView. Скорее всего, она нулевого размера или прячется за каким-то неожиданным видом. При отладке представления вы хотите щелкнуть представление, чтобы увидеть его схему. Существует также возможность просмотра ограничений, чтобы вы могли определить, какое из них может неожиданно повлиять на представление.

person Tommie C.    schedule 02.09.2016
comment
Я не могу отлаживать представление для клавиатуры. Я перехожу к иерархии представлений отладки, но получаю сообщение Невозможно зафиксировать иерархию представлений. Я не понимаю, почему topView не расширяется до Top. Я установил ограничение, как вы можете видеть. - person DanielZanchi; 05.09.2016