如何在键盘出现时使视图控制器滚动到文本字段

时间:2014-01-03 17:47:48

标签: ios objective-c xcode uiviewcontroller uiscrollview

我想制作uiviewcontroller.xib卷轴。我的视图控制器有8个文本字段。所以我的问题是当我想在第5 textfield时写一些东西,等等我的键盘覆盖文本字段。如何摆脱这个问题,让我的viewcontroller滚动?

请详细说明,因为我是iPhone开发的新手。

提前致谢。

4 个答案:

答案 0 :(得分:16)

您可以使用ScrollView

添加滚动视图

将一个scrollView拖放到视图控制器上,就像使用文本字段一样,并调整尺寸以满足您的需要(看起来您希望它填充视图控制器。)

enter image description here

然后将文本字段放入滚动视图。我认为使用左侧的文档大纲最简单。将文本字段拖到滚动视图上,如图所示。

enter image description here

键盘出现时滚动视图滚动

将此代码添加到viewDidLoad

中的视图控制器
//register for keyboard notifications
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWasShown:)
                                             name:UIKeyboardDidShowNotification object:nil];

将这些方法添加到视图控制器

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    [self.scrollView setContentOffset:CGPointMake(0, kbSize.height) animated:YES];
}
//called when the text field is being edited
- (IBAction)textFieldDidBeginEditing:(UITextField *)sender {
    sender.delegate = self;
}

显示键盘时会调用前两个方法。当您开始编辑文本字段时,会调用第二个。

现在转到故事板并将文本字段的操作附加到刚刚添加的方法中。您可以右键单击文本字段,选择相应的操作并将其拖到方法中。

当您右键单击文本字段时,您应该看到类似的内容。

enter image description here

将此属性添加到视图控制器,然后右键单击从滚动视图拖动到该视图。它允许您的视图控制器控制滚动视图。

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;

像这样:

enter image description here

关闭键盘

按下返回按钮后,我们希望键盘关闭。

在您的视图控制器标题中,使您的视图控制器为UITextFieldDelegate,如下所示:

@interface ViewController : UIViewController <UITextFieldDelegate>

将此代码添加到viewDidLoad

中的视图控制器
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardWillBeHidden:)
                                             name:UIKeyboardWillHideNotification object:nil];

将这些方法添加到视图控制器

// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return [textField resignFirstResponder];
}

键盘关闭时会调用第一个方法。它将滚动视图返回到其原始位置。编辑完文本字段后,将调用第二种方法。它允许在发生这种情况时解除键盘。

更多信息

Here是有关管理键盘的更多信息。

这里的参考是我的ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITextFieldDelegate>

@end

和ViewController.m

#import "ViewController.h"

@interface ViewController () 
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    //register for keyboard notifications
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardDidShowNotification 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;
    [self.scrollView setContentOffset:CGPointMake(0, kbSize.height) animated:YES];
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES];
}
- (IBAction)textFieldDidBeginEditing:(UITextField *)sender {
    sender.delegate = self;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    return [textField resignFirstResponder];
}

@end

答案 1 :(得分:5)

之前的所有答案都很棒,但如果您不想将自己与代码混淆,请使用控件。

我喜欢的是:https://github.com/michaeltyson/TPKeyboardAvoiding (Cocoapods:pod'TPKeyboardAvoiding')

您所要做的就是将文本字段嵌入到UIScrollView(编辑器/嵌入式。首先选择您的UITextFields),然后将UIScrollView的类设置为TPKeyboardAvoidingScrollView。

是的,你应该首先学习如何手动完成,但是如果你愿意的话,可以使用它。

答案 2 :(得分:1)

选择文本字段并转到“编辑器”菜单,然后选择“嵌入” - >滚动视图。这将自动在视图层次结构中放置滚动视图,并将文本字段移动到其中。

通常,当人们希望在屏幕上显示多个文本字段并让它们滚动时,它们实际上会将它们放在UITableView中,其中每个单元格中都有一个文本字段。通常这是分组表视图单元格样式。如果你这样做,表格视图可以在键盘出现时自动调整其大小,这样你就不必自己处理。

答案 3 :(得分:0)

您就是这样做的:

@implementation mainViewController{
    CGPoint textFieldPoint;
    UITextField *curentlyBeingEditingTextField;
}


  - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    _myTextField.delegate=self;

     textFieldPoint=CGPointMake(160, 228);

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification object:nil];

}


- (void)keyboardWillShow:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
   double delay = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
   CGRect kbFrame=[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];

    [UIView animateWithDuration:0.4f
                              delay:delay-0.2
                            options:UIViewAnimationOptionCurveEaseOut
                         animations:^{
                             curentlyBeingEditingTextField.center=CGPointMake(curentlyBeingEditingTextField.center.x,kbFrame.origin.y- kbFrame.size.height-curentlyBeingEditingTextField.frame.size.height);
                         }completion:nil];


}


-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [curentlyBeingEditingTextField resignFirstResponder];
    [UIView animateWithDuration:0.4f
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         curentlyBeingEditingTextField.center=textFieldPoint;
                     }completion:nil];
}

#pragma mark TextFieldDelegate
- (void)textFieldDidBeginEditing:(UITextField *)textField{
    curentlyBeingEditingTextField=textField;
}