键盘隐藏UITextFields。仅在键入开始后滚动

时间:2013-01-21 22:21:33

标签: keyboard uitextfield navigationbar container-view

我在这个问题上花了大约2天时间经历了几个堆栈溢出/在线帖子,似乎无法找到答案。

我有6个UITextFields。当键盘出现时,底部两个隐藏。但是,当我开始输入时:

在4英寸屏幕(iPhone 5)上:文本字段向上滚动并隐藏在导航栏后面。

在3.5英寸的屏幕上(iPhone 3GS):文本字段向上滚动到导航栏的正下方,这是应该的位置。

当用户点击UITextFields时,我希望UITextFields向上滚动并在导航栏右上方结束,RIGHT AWAY。这样,该字段就会出现并准备好输入,并且在向上滚动之前不会隐藏等待用户开始输入。

我不确定这是否相关,但我有UIControllerView,在里面,它有一个containerView。 containerView没有覆盖整个屏幕并从X开始:68 Y:7宽度:237高度:351。在ContainerView内部,我有UITcrollView和UITextFields。 containerView也有自己的NavigationBar。在iPhone 5(4“屏幕)上,当向上滚动时,TextFields隐藏在containerView内的NavigationBar后面。在iPhone 3GS(3.5”屏幕)上,UITextfield出现在NavigationBar的正下方,正如它们应该的那样。

以下是Apple Docs中的代码:

.h 
@interface ContactViewController : UIViewController <UITextFieldDelegate>
{
    UITextField *activeField;
}

.m
- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification object:nil];
}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0, 0, kbSize.height, 0.0);
    pageScrollView.contentInset = contentInsets;
    pageScrollView.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 -= kbSize.height;
    if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
    CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
    [pageScrollView setContentOffset:scrollPoint animated:YES];
    }
}


// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    pageScrollView.contentInset = contentInsets;
    pageScrollView.scrollIndicatorInsets = contentInsets;
}

我从Apple Doc获得了代码:http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement

1 个答案:

答案 0 :(得分:0)

经过几天的努力并考虑采取哪条路线,我决定将我的UIViewController变成一个内置滚动功能的UITableViewController。我做出这个决定主要是因为将来我喜欢本地化我的应用程序还有一些其他语言和不得不手动重新发明每种语言的轮子,我认为更容易适应自定义的TableView。