Висота в портреті та висота в пейзажі, виміряна в балах.
Висота в портреті та висота в пейзажі, виміряна в балах.
Відповіді:
Я використав наступний підхід для визначення кадру клавіатури в iOS 7.1.
У методі init мого контролера перегляду я зареєструвався для UIKeyboardDidShowNotification
:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardOnScreen:) name:UIKeyboardDidShowNotification object:nil];
Потім я використав наступний код, keyboardOnScreen:
щоб отримати доступ до рамки клавіатури. Цей код отримує userInfo
словник із сповіщення, а потім отримує доступ до NSValue
пов'язаного з UIKeyboardFrameEndUserInfoKey
. Потім ви можете отримати доступ до CGRect і перетворити його в координати виду вашого контролера перегляду. Звідти ви можете виконувати будь-які необхідні обчислення на основі цього кадру.
-(void)keyboardOnScreen:(NSNotification *)notification
{
NSDictionary *info = notification.userInfo;
NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
CGRect rawFrame = [value CGRectValue];
CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];
NSLog(@"keyboardFrame: %@", NSStringFromCGRect(keyboardFrame));
}
Стрімкий
І еквівалентна реалізація із Swift:
NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow), name: UIResponder.keyboardDidShowNotification, object: nil)
@objc
func keyboardDidShow(notification: Notification) {
guard let info = notification.userInfo else { return }
guard let frameInfo = info[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else { return }
let keyboardFrame = frameInfo.cgRectValue
print("keyboardFrame: \(keyboardFrame)")
}
Пам’ятайте, що з iOS 8 розмір екранної клавіатури може змінюватися. Не припускайте, що екранна клавіатура завжди буде видимою (з певною висотою) або невидимою.
Тепер, з прошивкою 8, користувач може також красти область тексту передбачення і вимикатися ... і коли вони роблять це, було б штовхнути додаток , в keyboardWillShow
подія знову .
Це призведе до розбиття багатьох зразків застарілого коду, які рекомендували писати keyboardWillShow
подію, яка просто вимірює поточну висоту екранної клавіатури та зміщує елементи керування вгору або вниз на сторінці на цю (абсолютну) величину.
Іншими словами, якщо ви бачите будь-який зразок коду, який просто повідомляє вам додати keyboardWillShow
подію, виміряти висоту клавіатури, а потім змінити висоту елементів керування на цю величину, це більше не завжди буде працювати.
У наведеному вище прикладі я використовував зразок коду з наступного сайту, який анімує значення вертикальних обмежень constant
.
У своєму додатку я додав обмеження до свого UITextView
, встановленого внизу екрана. Коли екран з’явився вперше, я зберігав цю початкову вертикальну відстань.
Потім, щоразу, коли починається моя keyboardWillShow
подія, я додаю (нову) висоту клавіатури до цього початкового значення обмеження (тому обмеження змінює висоту елемента управління).
Ага. Це негарно.
І я трохи роздратований / здивований тим, що жахливо-болючий AutoLayout XCode 6 не просто дозволяє нам прикріпити нижню частину елементів керування або внизу екрана, або у верхній частині екранної клавіатури.
Можливо, я чогось пропускаю.
Крім моєї розсудливості.
Висота клавіатури становить 216 пунктів для портретного режиму та 162 пункту для альбомного режиму.
Примітка до версії: це більше не має значення в iOS 9 і 10, оскільки вони підтримують власні розміри клавіатури.
Це залежить від моделі та панелі QuickType:
Висота клавіатури залежить від моделі, панелі QuickType, налаштувань користувача ... Найкращий підхід - обчислити динамічно:
Свіфт 3.0
var heightKeyboard : CGFloat?
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardShown(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
}
func keyboardShown(notification: NSNotification) {
if let infoKey = notification.userInfo?[UIKeyboardFrameEndUserInfoKey],
let rawFrame = (infoKey as AnyObject).cgRectValue {
let keyboardFrame = view.convert(rawFrame, from: nil)
self.heightKeyboard = keyboardFrame.size.height
// Now is stored in your heightKeyboard variable
}
}
Я не можу знайти останню відповідь, тому перевіряю все на симуляторі. (IOS 11.0)
Пристрій | Висота екрану | Портрет | Пейзаж
iPhone 4s | 480,0 | 216,0 | 162,0
iPhone 5, iPhone 5s, iPhone SE | 568,0 | 216,0 | 162,0
iPhone 6, iPhone 6s, iPhone 7, iPhone 8, iPhone X | 667,0 | 216,0 | 162,0
iPhone 6 плюс, iPhone 7 плюс, iPhone 8 плюс | 736,0 | 226,0 | 162,0
iPad 5-го покоління, iPad Air, iPad Air 2, iPad Pro 9.7, iPad Pro 10.5, iPad Pro 12.9 | 1024,0 | 265,0 | 353,0
Дякую!
iPhone
Розміри клавіатури:
2.6S, 6,7,8: (375 × 667): Розмір клавіатури = (0,0, 407,0, 375,0, 260.
3,6 +, 6S +, 7+, 8+: (414 × 736) клавіатура Розмір = (0,0, 465,0, 414,0, 271,0)
4.XS, X: (375 X 812) keyboardSize = (0.0, 477.0, 375.0, 335.0)
5.XR, XSMAX ((414 x 896) Розмір клавіатури = (0,0, 550,0, 414,0, 346,0)