【问题标题】:How to make the view controller scroll to text field when keyboard appears键盘出现时如何使视图控制器滚动到文本字段
【发布时间】:2014-01-21 11:29:00
【问题描述】:

我想让我的uiviewcontroller.xib 滚动。我的视图控制器有 8 个文本字段。所以我的问题是当我想在第 5 个textfield 中写一些东西时,我的键盘会覆盖文本字段。我怎样才能摆脱这个问题,让我的视图控制器滚动?

由于是 iPhone 开发新手,请详细指导。

提前致谢。

【问题讨论】:

  • 你试过添加滚动视图吗?
  • 如何将它添加到现有的视图控制器中?
  • 您可以将滚动视图拖放到您的 viewController 上。然后将所有文本字段放在滚动视图上。
  • 如果你想自动滚动到选中的文本框,那么你需要 UITableViewController

标签: ios objective-c xcode uiviewcontroller uiscrollview


【解决方案1】:

您可以使用ScrollView

添加滚动视图

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

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

当键盘出现时让滚动视图滚动

将此代码添加到 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;
}

这些方法中的前两个在显示键盘时被调用。第二个在您开始编辑文本字段时调用。

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

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

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

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

像这样:

关闭键盘

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

在您的视图控制器标题中将您的视图控制器设为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

【讨论】:

  • 这个问题是当虚拟键盘出现和消失时,您必须手动处理调整滚动区域或调整滚动视图的大小。此外,您还必须做额外的工作才能使文本字段滚动可见。如果您使用 UITableViewController 并将文本字段放在表格视图单元格中,那么其中一些(不是全部)会自动为您处理。例如,当虚拟键盘出现时,它会自动调整可滚动区域的大小。
  • 确实如此。使用表格视图可能最适合作者问题。我对你的答案投了赞成票,但如果作者仍然想要/需要使用此方法,我将把它留在这里(并在需要时扩展它)。
  • @connor 请继续,如果这不是我的问题的解决方案,它将成为其他人的解决方案。
  • 这是您问题的一个很好的解决方案:stackoverflow.com/a/1127025/754604
  • 他们的回答方式非常棒,对于像我这样的初学者来说很容易理解,对新手会有帮助。
【解决方案2】:

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

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

【讨论】:

  • 我已经完成了选择文本字段并嵌入但文本字段仍然隐藏在键盘后面...
  • 试试我提到的使用 UITableViewController 的方法。否则,当使用 UIScrollView 时,您必须在虚拟键盘显示和隐藏时手动调整它的大小,这需要监听这些通知,因此会很麻烦。 UITableViewController 方法要简单得多。
  • 是的,我知道uitableview 是一种简单的方法,但在某些特殊情况下我不能。
【解决方案3】:

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

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

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

是的,您应该先学习如何手动操作,但如果您愿意,只需使用它即可。

【讨论】:

    【解决方案4】:

    这就是你的做法:

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 2011-09-02
      • 2018-11-03
      • 1970-01-01
      相关资源
      最近更新 更多