如何仅在键盘显示时检测?

时间:2013-08-05 16:47:50

标签: iphone ios objective-c uiview rotation

我希望我的UIView在显示键盘时动画到新位置,因此使用了UIKeyboardWillShowNotificationUIKeyboardWillChangeFrameNotification。问题是当设备在没有键盘的情况下旋转时,视图会自动调整并按原样旋转 - 它看起来很完美。

不幸的是,在显示键盘的情况下,旋转设备会发送这些通知,因此执行UIView动画作为响应会给它一个奇怪的动画。它最好被描述为看起来像是跳到一个新的位置然后被一个角落锚定到新的方向。也许你知道我在说什么。

当键盘显示时,有什么方法可以检测设备何时旋转或以其他方式处理问题?

3 个答案:

答案 0 :(得分:0)

对于方向更改检测,请使用UIDeviceOrientationDidChangeNotification

答案 1 :(得分:0)

我想以下代码可以帮助你..

@property(nonatomic,strong)BOOL keyBoardShow;


- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeShown:)
                                                 name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];


    [super viewDidLoad];
}
-(void)keyboardWillBeShown:(NSNotification *)aNotification {
    keyBoardShow = YES;
}


-(void)keyboardWillBeHidden:(NSNotification *)aNotification {
    keyBoardShow = NO;
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    if (keyBoardShow) {
        // Do the needful when the keyboard is shown

    }else{

    }
}

只需在keyboardWillBeShown和keyboardWillBeHidden委托方法中设置bool值即可。并在willRotateToInterfaceOrientation中执行你的uiview位置。

答案 2 :(得分:-1)

不是依靠内置的通知,为什么不依靠首先触发键盘显示的内容?我猜测当特定的UITextField成为第一个响应者时键盘会弹出。你应该可以使用它。

注册该UITextField的委托并实现-textFieldDidBeginEditing:。委托应该是一个视图控制器。然后,为了保持松散耦合,请从代理发布您自己的通知,并为此注册您的视图。

这是一项更多的工作,但它可以让你更好地控制。

- (void)textFieldDidBeginEditing:(UITextField *)textField  

Apple documentation: UITextFieldDelegate Protocol