2016-09-26 3 views
6

Вы можете загрузить образец проект, демонстрирующий вопрос ниже здесь: https://github.com/DimaVartanian/keyboard-extension-height-bugрасширения клавиатуры теряет высоту в ИО 10 при попытке размера автоматически в некоторых случаях

При создании расширения клавиатуры и не указав конкретную высоту для ее компонентов но вместо этого привязывая их к представлению/inputView, так что теоретически система будет определять их высоту, основанную на окружении и ориентации, в некоторых ситуациях высота вместо этого превращается в 0, а клавиатура измельчается (за исключением всего, что имеет бетонную высоту таких как ярлык собственного размера или кнопка).

Это, похоже, происходит на iOS 10. На iOS 9 детские представления правильно изменяются, чтобы соответствовать стандартной высоте клавиатуры.

Существует несколько сценариев, которые могут проявиться, и этот проект демонстрирует базовый характер. Она начинается с базовым шаблоном расширения клавиатуры с по умолчанию кнопки «рядом с клавиатурой» и ограничениями 2 размера она поставляется с:

self.nextKeyboardButton.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
self.nextKeyboardButton.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 

Далее мы создаем один другой вид, что мы хотим, чтобы заполнить пространство надтаблицы без определения конкретного размера для себя:

let anotherView = UIView() 
anotherView.backgroundColor = UIColor.red 
anotherView.translatesAutoresizingMaskIntoConstraints = false 
view.addSubview(anotherView) 
anotherView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true 
anotherView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true 
anotherView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true 

Теперь, скажем, мы просто хотим, чтобы закрепить этот новый вид нижней части нашей клавиатуры надтаблицы. Мы бы просто сделать что-то вроде:

anotherView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true 

Результат выглядит следующим образом:

IOS 9 enter image description here

IOS 10 enter image description here

Этот макет именно то, что мы ожидаем. Теперь вместо этого давайте привяжем новый вид к верхней части нашей следующей кнопки. Мы избавляемся от ограничения мы только что добавили, и заменить его

anotherView.bottomAnchor.constraint(equalTo: self.nextKeyboardButton.topAnchor).isActive = true 

по логике вещей, в результате чего высота должна быть такой же (определяется системой)

В результате в настоящее время это:

IOS 9 enter image description here

IOS-10 enter image description here

На iOS 9 он работает так, как ожидалось, но на iOS 10 гибкий вид высоты изменяется до 0, а все оставшееся - кнопка фиксированной высоты.

Нет сообщений о конфликтующих ограничениях. Я пытаюсь выяснить, что может быть причиной этого, и почему это произойдет только на iOS 10.

ответ

3

Apple, ответил на мой DTS билет и сказал мне, чтобы подать отчет об ошибке, так что это на самом деле IOS 10 ошибка. Я подал радар (# 28532959) и обновил этот ответ, если бы получил ответ. Если кто-то другой придумает конкретное решение, которое позволяет мне использовать автозапуск для достижения автоматической высоты, ответы по-прежнему принимаются.

+0

Вы получили какие-либо ответ ? Мы сталкиваемся с той же проблемой, я был бы рад получить обновление, если оно у вас есть. –

+0

Нет. Просто ошибка, и вы должны найти способ сделать свои ограничения без его запуска. Был просто проб и ошибок для меня. – Dima

+0

@ Дима вы получили ответ на этот вопрос? – Ramakrishna

0

Я также столкнулся с той же проблемой. это из-за ограничений Autolayout. Просто удалите все ограничения. и установить автоматическое изменение размера. enter image description here

+0

Это не вариант для меня, к сожалению. – Dima

0

Я решил его решить, установив новый ограничитель высоты.

enter image description here

+1

К сожалению, похоже, ваше решение состояло в том, чтобы жестко установить постоянную высоту. Это именно то, чего я пытаюсь избежать, поскольку я поддерживаю каждый размер и ориентацию устройства, поэтому я хотел бы позволить системе решить, какую высоту использовать, которая должна работать, но перестала работать в iOS 10. – Dima

1

Вот мое обходное решение. Это немного отстает, когда устройство вращается, но оно выполнит эту работу, пока Apple не исправит эту ошибку. Сначала я подумал, что это как-то связано с inputView.allowSelfSizing, но эта переменная ничего не изменила.

Во-первых, объявить heightConstraint:

var heightConstraint: NSLayoutConstraint! 

В viewDidLoad, добавить пользовательский вид:

let nibName: String! = UIDevice.isPhone ? "KeyboardViewiPhone" : "KeyboardViewiPad" 
customView = Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?.first as! UIView 
customView.translatesAutoresizingMaskIntoConstraints = false 
view.addSubview(customView) 

Добавить ограничение по ширине, как вы могли бы сделать, как правило:

let widthConstraint = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: customView, attribute: .width, multiplier: 1.0, constant: 0.0) 

Добавьте постоянное ограничение для высоты:

heightConstraint = NSLayoutConstraint(item: customView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: view.frame.height) 
view.addConstraints([widthConstraint, heightConstraint]) 

Сейчас идет исправление:

override func viewDidLayoutSubviews() { 
    heightConstraint.constant = view.bounds.height 
} 

Как viewDidLayoutSubviews вызывается каждый раз view.bounds изменения, он будет обрабатывать ориентации правильно меняется.

0

Я также столкнулся с той же проблемой для пользовательского расширения клавиатуры в Xcode 8.2. Это вызвано auto resizing. В моем случае я решил это ниже.

Первоначально у меня на заказ клавиатура имеет 3 вида. В этом я фиксировал конечный, ведущий, верх и высоту для первого и последнего вида. И поместите средний вид, как на изображении. enter image description here

после этого выберите средний вид и откройте show the size inspector в раскадровке. В size inspector, вы найдете вариант auto resizing. При этом выберите индикаторы ограничения для этой точки зрения.

enter image description here

После выбора запускать проект в устройстве, и он будет работать правильно, не пропуская любой точки зрения.

Примечание: - Он будет работать как в портретном, так и в ландшафтном режимах. И в основном вам не нужно давать ограничения для среднего вида.

+0

@ Дима проверить мой ответ. Я тоже закончил, как ты. Но эти процессы решают мою проблему. Надеюсь, это сработает для вас. – Ramakrishna

0

ИМХО, лучшее рабочее решение использует «Пропорциональную высоту». Например, в моем случае я, наконец, закончил с двумя представлениями. Верхний получил 0,8 высоты надзора, снизу - 0,2. Это не идеальное решение, но вы все равно можете воспользоваться автозапуском.

Proportional

Смежные вопросы