問題描述
iOS 9 為 iOS 8 添加了
(注意紅色視圖是如何連接到鍵盤頂部的)
實際行為:
<塊引用>將紅色視圖附加到鍵盤頂部的正確方法是什么?
問題在于大多數代碼 (
當鍵盤處于僅快捷欄模式時,這是矩形:
<塊引用>請注意鍵盤的大部分是如何在屏幕外的,但它仍然是相同的高度.
要獲得正確的行為,請使用 CGRectIntersection 與視圖的邊界和該視圖內的鍵盤框架:
//? 好代碼,使用CGRect keyboardScreenEndFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];CGRect keyboardViewEndFrame = [self.view convertRect:keyboardScreenEndFrame fromView:self.view.window];CGRect keyboardFrame = CGRectIntersection(self.view.bounds, keyboardViewEndFrame);CGFloat keyboardHeight = keyboardFrame.size.height;//= 55
出于同樣的原因,應該使用 UIKeyboardFrameEndUserInfoKey
而不是 UIKeyboardFrameBeginUserInfoKey
.
iOS 9 adds a Shortcut Bar to the iOS 8 QuickType bar.
As part of this change, if you connect a bluetooth keyboard to an iPad, the keyboard is in a minimized Shortcut Bar only mode (which can be simulated by pressing command-k in the simulator).
I have code which gets the keyboard height using a method similar to the following:
CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardFrame.size.height; // = 313
The problem is that when the keyboard is toggled between the expanded and collapsed state, the height remains the same, causing my view to appear in its old location:
Desired behavior:
(Notice how the red view is attached to the top of the keyboard)
Actual behavior:
What's the correct way to get the red view to be attached to the top of the keyboard?
The problem is that most code out there (including Apple's) ignores the fact that UIKeyboardFrameEndUserInfoKey is a CGRect and not a CGSize.
// ? Bad code, do not use
- (void)keyboardWasShown:(NSNotification*)aNotification {
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGRect bkgndRect = activeField.superview.frame;
bkgndRect.size.height += kbSize.height;
[activeField.superview setFrame:bkgndRect];
[scrollView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES];
}
Here you see that only the keyboard height (kbSize.height
) is being used. The origin of the rect is important, and should not be ignored.
When the keyboard is visible, this is the rect that is reported:
When the keyboard is in Shortcut Bar only mode, this is the rect:
Notice how the majority of the keyboard is offscreen, yet it is still the same height.
To get the correct behavior, use CGRectIntersection with the view's bounds and the keyboard frame within that view:
// ? Good code, use
CGRect keyboardScreenEndFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect keyboardViewEndFrame = [self.view convertRect:keyboardScreenEndFrame fromView:self.view.window];
CGRect keyboardFrame = CGRectIntersection(self.view.bounds, keyboardViewEndFrame);
CGFloat keyboardHeight = keyboardFrame.size.height; // = 55
For this same reason, UIKeyboardFrameEndUserInfoKey
should be used as opposed to UIKeyboardFrameBeginUserInfoKey
.
這篇關于在 iOS 9 Shortcut Bar only 模式下,與鍵盤頂部對齊的視圖出現在錯誤的位置的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!