Objective c iOS 8方向更改:键盘框未正确显示

Objective c iOS 8方向更改:键盘框未正确显示,objective-c,xcode,swift,ios8,autolayout,Objective C,Xcode,Swift,Ios8,Autolayout,这只是iOS 8的问题,键盘在iOS 7中正确显示,设备方向发生变化。我的应用程序支持纵向和横向,并使用自动布局 如果我将包含UIExtField子类的UIViewController子类推送到导航堆栈上,并且UIExtField成为纵向的第一个响应程序,则默认键盘将正确显示。但是,如果我将设备旋转到横向,则UIViewController子视图布局将正确显示,但键盘将显示在屏幕的顶部中间。键盘的方向对于横向方向是正确的,但其帧宽度与纵向方向的预期宽度相同。如果我将应用程序方向设置为仅横向方向,

这只是iOS 8的问题,键盘在iOS 7中正确显示,设备方向发生变化。我的应用程序支持纵向和横向,并使用自动布局


如果我将包含UIExtField子类的UIViewController子类推送到导航堆栈上,并且UIExtField成为纵向的第一个响应程序,则默认键盘将正确显示。但是,如果我将设备旋转到横向,则UIViewController子视图布局将正确显示,但键盘将显示在屏幕的顶部中间。键盘的方向对于横向方向是正确的,但其帧宽度与纵向方向的预期宽度相同。如果我将应用程序方向设置为仅横向方向,则键盘无法正确显示。这只是iOS 8方向更改的问题。

在iOS 8之前,向应用程序报告时,键盘的位置和宽度/高度始终与纵向方向相对。(例如,横向键盘宽度为y方向,iPad上约为352像素。) 从iOS 8开始,它已更新为在(物理)视图的左上角始终有(0,0),并且宽度/高度反映了您通常期望在iOS之外的x/y方向。如果您以前是通过类似于
keyboardDidShow
[notification userInfo]
来定位键盘的,那么您将得到一些没有意义的数字。您可以使用以下方法来考虑iOS8之前的特性:

- (void)keyboardDidShow: (NSNotification *) notification{

    NSDictionary *keyboardInfo = [notification userInfo];
    CGSize keyboardSize = [[keyboardInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    float height, width;
    if(UIInterfaceOrientationIsPortrait(orientation)){
        width = keyboardSize.width;
        height = keyboardSize.height;
    } else {
        if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1){
            width = keyboardSize.height;
            height = keyboardSize.width;
        } else {
            width = keyboardSize.width;
            height = keyboardSize.height;
        }
    }

    // Remainder of function
}
-(无效)键盘显示:(NSNotification*)通知{
NSDictionary*keyboardInfo=[notification userInfo];
CGSize keyboardSize=[[keyboardInfo objectForKey:UIKeyboardFrameBeginUserInfo]CGRectValue]。大小;
UIInterfaceOrientation方向=[[UIApplication sharedApplication]statusBarOrientation];
浮动高度、宽度;
if(UIInterfaceOrientationSportRait(方向)){
宽度=键盘大小。宽度;
高度=键盘大小。高度;
}否则{

if(floor(NSFoundationVersionNumber)这不是iOS8或iphone6的bug,而是旧项目正确迁移到xCode6的问题

只需将
Launch screen interface file base name
key添加到
Info.plist
文件中即可


您可以找到此案例的详细说明。

我认为这可能是iPhone 6的一个bug。
- (void)keyboardDidShow: (NSNotification *) notification{

    NSDictionary *keyboardInfo = [notification userInfo];
    CGSize keyboardSize = [[keyboardInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    float width = keyboardSize.width;
    float height = keyboardSize.height;
    if(!UIInterfaceOrientationIsPortrait(orientation) && (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1)){
        width = keyboardSize.height;
        height = keyboardSize.width;
    }

    // Remainder of function
}