当键盘显示时,iOS横向视图移动文本字段

时间:2014-05-05 20:36:59

标签: ios iphone objective-c xcode5

我有一部iPhone,我正在添加景观支持。它之前只是肖像。

当键盘显示时,我遇到了将文本字段移开的问题。

我使用的解决方案与Apple的解决方案非常相似here

解决方案在纵向模式下工作得很好,但是当我进入横向模式时它根本不工作。视图不向上滚动,而是向下滚动。

我认为它可能与键盘高度/宽度有关,我认为我正确地考虑了这一点。

任何建议指出我的愚蠢或更好的解决方案表示赞赏。

- (void)keyboardWillShow:(NSNotification *)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect activeFieldFrame = activeField.frame;
    CGFloat kbHeight;
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
    {
        kbHeight = kbSize.height;
    }
    else
    {
        kbHeight = kbSize.width;
    }

    UIEdgeInsets contentInsets;

    contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbHeight, 0.0);
    scrollView.contentInset = contentInsets;
    scrollView.scrollIndicatorInsets = contentInsets;

    CGRect aRect = self.view.frame;
    aRect.size.height -= kbHeight;
    activeFieldFrame.origin.y += scrollView.frame.origin.y+aRect.origin.y;
    if (!CGRectContainsRect(aRect, activeFieldFrame) )
    {
        CGPoint scrollPoint = CGPointMake(0.0, activeFieldFrame.origin.y-kbHeight-aRect.origin.y);
        [scrollView setContentOffset:scrollPoint animated:YES];
    }
}

注意我在键盘上显示这个,因为我认为在显示键盘之前移动视图会更好。

2 个答案:

答案 0 :(得分:1)

好的,我会用我的解决方案回答我自己的问题。当然,在我发布到SO后,我似乎遇到了解决方案。

我的数学都错了。

这是我的更新版本,以防其他人帮助。

这将同时适用于风景和肖像。

- (void)keyboardWillShow:(NSNotification *)aNotification
{
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        NSDictionary* info = [aNotification userInfo];
        CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
        CGRect activeFieldFrame = activeField.frame;
        CGRect scrollViewFrame = scrollView.frame;//used so I can see values below while debugging
        CGFloat kbHeight;
        if (self.interfaceOrientation == UIInterfaceOrientationPortrait)
        {
            kbHeight = kbSize.height;
        }
        else
        {
            kbHeight = kbSize.width;
        }

        UIEdgeInsets contentInsets;

        contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbHeight, 0.0);
        scrollView.contentInset = contentInsets;
        scrollView.scrollIndicatorInsets = contentInsets;

        // If active text field is hidden by keyboard, scroll it so it's visible
        // Your application might not need or want this behavior.
        CGRect aRect = self.view.frame;
        aRect.size.height -= kbHeight;
        activeFieldFrame.origin.y += scrollViewFrame.origin.y+aRect.origin.y;
        if (!CGRectContainsRect(aRect, activeFieldFrame) )
        {
            //add +5 here to give just a little room between field and keyboard
            //subtracting scrollviewFrame.origin.y handles cases where scrollview is not at top (0,0) of the view
            CGPoint scrollPoint = CGPointMake(0.0, activeFieldFrame.origin.y + activeFieldFrame.size.height + 5 - aRect.size.height  - scrollViewFrame.origin.y);
            [scrollView setContentOffset:scrollPoint animated:YES];
        }

    }
}

有一点值得注意的是,我遇到的情况是,如果您注册在视图A上获取键盘通知,并且在视图A和模态视图B上方弹出模态视图B也需要键盘恶作剧,因此您将模态视图B注册到处理它们,视图A仍然会获得键盘事件并执行代码,即使它在屏幕上不可见!

原始视图A仍会让键盘显示事件(如果它是基于标签的设计的一部分)和另一个视图C具有由另一个标签显示的编辑字段。

在您的视图消失时,您应取消注册键盘事件,并在您的视图出现时注册事件,这似乎是合乎逻辑的。

希望这有助于其他人。

答案 1 :(得分:0)

当您的文字字段成为第一响应者时,通常会滚动滚动视图。我曾经有过这样的想法,到目前为止,我发现的唯一解决方法是将文本字段包装在与字段大小相同的滚动视图中,以便自动滚动行为影响它们,不是我的主要滚动视图。