Я только что создал быстрый тестовый проект, и кажется, что при моем нажатии на кнопку диктовки на моем конце нормально проходит уведомление.Я могу только догадываться о том, что может пойти наперекосяк, так как вы вообще не включили свой код, но пара предположений:
- Уведомление приходит, норасчеты, корректирующие высоту клавиатуры, неверны (возможно, не принимая во внимание safeAreaInsets.bottom?)
- Вы удаляете себя в качестве наблюдателя уведомлений клавиатуры в какой-то момент до уведомления для рамки клавиатурыприходит изменение для диктовки.
Вот мой пример кода, который работал для меня:
#import "ViewController.h"
@interface ViewController ()
@property (strong, nullable) IBOutlet UITextField *tf;
@property (strong, nullable) IBOutlet UIView *redView;
@property (strong, nullable) IBOutlet NSLayoutConstraint *redViewBottomConstraint;
- (IBAction)resignActiveOnTF:(id)sender;
- (void)keyboardWillChangeFrame:(NSNotification *)notification;
- (void)keyboardWillHide:(NSNotification *)notification;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// put the redView off the bottom of the screen initially (include safe area insets on the bottom
self.redViewBottomConstraint.constant = -(self.redView.frame.size.height + self.view.safeAreaInsets.bottom);
}
- (void)keyboardWillChangeFrame:(NSNotification *)notification {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
CGFloat keyboardHeight = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
[self.view layoutIfNeeded];
// adjust the constraint by the keyboard height and account for the safe area insets on the bottom as well
self.redViewBottomConstraint.constant = keyboardHeight - self.view.safeAreaInsets.bottom;
[UIView animateWithDuration:0.4f animations:^{
self.redView.alpha = 1.0f;
[self.view layoutIfNeeded];
}];
}];
}
- (void)keyboardWillHide:(NSNotification *)notification {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self.view layoutIfNeeded];
self.redViewBottomConstraint.constant = -(self.redView.frame.size.height + self.view.safeAreaInsets.bottom);
[UIView animateWithDuration:0.25f animations:^{
self.redView.alpha = 0.0f;
[self.view layoutIfNeeded];
}];
}];
}
- (IBAction)resignActiveOnTF:(id)sender {
[self.tf resignFirstResponder];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end
И пример его действия на симуляторе:
Если ничего из этого не поможет вам, я настоятельно рекомендую воспроизвести это в очень простом примере и опубликовать свой код, чтобы другие могли помочь.
Редактировать:
Я скопировал ваш пример кода в новый контроллер представления, и мне кажется, что он работает нормально.Я сделал одну небольшую модификацию на моем конце для вычисления константы ограничения (мое нижнее ограничение - это нижняя часть представления, которое проходит через клавиатуру до нижней части безопасной области):
- (void)keyboardFrameChange:(NSNotification *)notification
{
NSDictionary * userInfo = [notification userInfo];
CGRect keyboardRect = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
double duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
// Anchor the bottom of the message view to the top of the keyboard.
[UIView animateWithDuration:duration animations:^{
self.bottomConstraints.constant = (CGRectGetHeight(keyboardRect) - self.view.safeAreaInsets.bottom);
[self.view layoutIfNeeded];
}];
}
, хотя яЯ предполагаю, что у вас другое ограничение в вашей xib?
Я пытался запустить это непосредственно на iPhone 6s, и это работает там же.У меня нет физического устройства iPhone X, на котором можно было бы его протестировать.