Рамка пользовательской клавиатуры iOS сжимается на 20 пунктов, если строка состояния увеличивается во время записи или телефонного звонка?

У меня возникла проблема с расширением клавиатуры на устройстве iOS (настоящем) во время записи или телефонного звонка (в симуляторе iOS нет красной строки состояния). Из-за того, что строка состояния увеличивается на 20 пунктов, пользовательская клавиатура также перемещается на 20 пунктов по оси Y и уменьшает ее height до 196 пунктов (должно быть 216 пунктов). Однако, когда я печатаю view.frame, он показывает {{0.0, 0.0}, {320.0, 196.0}}.

Вот скриншот.

Если я использую раскадровку вместо программного добавления представлений, все работает нормально. Сначала я подумал, что это из-за topLayoutGuide.length, но он показывает 0.0 в области отладки.

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


person João Oliveira    schedule 09.10.2015    source источник
comment
Очень просто погрузиться в эту проблему. Вы просто добавляете расширение клавиатуры в свой новый проект, добавляете строку кода view.backgroundColor = UIColor.white(), чтобы идентифицировать представление клавиатуры для вашего keyboardViewController.swift, и запускаете проект, и вы увидите проблему.   -  person João Oliveira    schedule 09.10.2015
comment
Я думаю, что это ошибка iOS 9. ????????   -  person João Oliveira    schedule 12.10.2015
comment
Я застрял в той же проблеме. Он воспроизводится как на iOS 9.0, так и на iOS 9.1 (отлично на iOS 8). Вы сообщали об этом с радара? Я хотел бы продублировать его. Не по теме: вы можете имитировать строку состояния вызова в симуляторе iOS: Hardware => Toggle In-Call Status Bar или CMD+Y   -  person thelvis    schedule 02.11.2015
comment
Да, я думаю, это ошибка в iOS 9. Это происходит не только с расширением клавиатуры, но и с UITabBar. Надеюсь, это скоро будет исправлено. Ой! Спасибо за чаевые!   -  person João Oliveira    schedule 04.11.2015
comment
я протестировал бета-версию iOS 9.2, ошибка все еще существует   -  person TomSawyer    schedule 17.11.2015
comment
@thelvis Вы записали радар? Не поделитесь ссылкой на него?   -  person Rasto    schedule 20.02.2016


Ответы (2)


Обходной путь, который работает для меня:

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    if (CGRectGetMinY(self.view.superview.frame) > 0.f) {
        CGRect frame = self.view.superview.frame;
        frame.origin.y = 0.f;
        [self.view.superview setFrame:frame];
    }
}

По сути, мы ищем кадр супервида, и я «настраиваю» его, если он смещается.

Изменить:

Как упоминал TomSawyer, в предыдущем решении есть проблема. Это должно решить их обоих.

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    CGRect frame = self.view.superview.frame;
    CGFloat dy = CGRectGetMinY(frame);
    if (dy > 0.f) {
        frame.origin.y = 0.f;
        frame.size.height += dy;
        [self.view.superview setFrame:frame];
    }
}
person thelvis    schedule 10.12.2015
comment
Он исправляет вид, но после того, как я добавил событие касания в вид, он не может распознать касание в нижних 20 пикселях. Как исправить событие касания? - person TomSawyer; 21.12.2015
comment
Редактирование все еще не работает для меня. Визуальное смещение исправлено, но последние 20 нижних точек клавиатуры не реагируют на касания. - person Rasto; 20.02.2016
comment
@drasto Вы поместили код в подкласс UIInputViewController? - person thelvis; 22.02.2016
comment
@drasto Что касается радара: номер билета — 23357303, который Apple пометил как Duplicate of 22973486 (Open). Обратите внимание, что это находится на частном радаре Apple, а не на публичном. Я думаю, что могу скопировать содержимое в публичный билет, если хотите. - person thelvis; 22.02.2016
comment
Вы правы, это работает. Мой проект на Swift, поэтому я переводил ваш код на Swift и допустил в процессе очень глупую ошибку. Мой убыток - это ваша прибыль в данном случае +250 репутации. Поздравляем, вы только что установили рекорд StackOverflow! Я никогда не видел никого, даже близкого к вашей репутации (21), чтобы выиграть такую ​​​​большую награду! Вы хорошо это заработали. Что касается радара, то было бы здорово, если бы вы выложили его в открытый доступ и написали мне, как найти и продублировать билет - person Rasto; 24.02.2016
comment
@drasto Спасибо! Я скопировал содержимое в общедоступный радар. Что вы можете сделать сейчас, так это, по сути, скопировать содержимое (более или менее) в новый тикет на странице отчетов об ошибках Apple< /а>. Чем больше дубликатов, тем больше шансов, что Apple это исправит. - person thelvis; 25.02.2016
comment
Спасибо продублирую. Кому @JoaoOliveira: я считаю, что этот ответ следует пометить как принятый. - person Rasto; 27.02.2016
comment
@thelvis Если у вас есть время, вас может заинтересовать один мой вопрос. Это также как-то связано с неправильным положением клавиатуры — на этот раз из-за неправильной высоты после поворота. Я был бы очень благодарен за вашу помощь. - person Rasto; 22.03.2016
comment
это сработало для меня, но при вызове в представленииDidAppear не в представленииDidLayoutSubviews, спасибо! - person Red Mak; 22.05.2016

вы можете написать обходной путь, используя UIApplicationWillChangeStatusBarFrameNotification.

В вашем init или viewDidLoad:

let os = NSProcessInfo().operatingSystemVersion
if os.majorVersion == 9 && (os.minorVersion == 0 || os.minorVersion == 1) {
    NSNotificationCenter.defaultCenter().addObserver(self, selector: "statusBarChange:", name:
        UIApplicationWillChangeStatusBarFrameNotification, object: nil)
}

И обработка уведомления:

func statusBarChange(notification:NSNotification) {
    let newRect:CGRect? = notification.userInfo?[UIApplicationStatusBarFrameUserInfoKey]?.CGRectValue
    var heightOffset = CGFloat(20) - newRect!.height
}

Затем вы можете обновить рамку вида, используя смещение в качестве координаты Y.

Надеюсь, это поможет.

person Bert Vermeire    schedule 15.11.2015
comment
Это не работает. проблема в том, что inputView автоматически сжимается и становится короче. не могу ничего сделать, чтобы подтянуть его на 20 пикселей - person TomSawyer; 17.11.2015
comment
@TomSawyer Вы правы, я также не могу найти способ компенсировать эту потерю роста на 20 баллов. - person Rasto; 20.02.2016