UITextField辞职第一响应者后如何更改UIScrollView contentSize

Posted

技术标签:

【中文标题】UITextField辞职第一响应者后如何更改UIScrollView contentSize【英文标题】:How to change UIScrollView contentSize after UITextField resigns first responder 【发布时间】:2013-02-20 02:59:27 【问题描述】:

我正在编写一个 iPhone 应用程序,我有一些 UITextfields 会在键盘出现时被覆盖;因此,我将 UITextFields 放在 UIScrollView 中,并将自己设置为委托,这样当键盘激活时,就会调用此方法:

-(void) textFieldDidBeginEditing:(UITextField *)textField

    self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width, 560);
    [self.myScrollView setContentOffset:CGPointMake(0, 200) animated:YES];

请注意,我将 contentSize 设置得更高,这样即使文本字段成为焦点,用户仍然可以滚动。

同样,当文本字段退出第一响应者状态时,会调用此方法:

-(void) textFieldDidEndEditing:(UITextField *)textField

    [self.myScrollView setContentOffset:CGPointMake(0, 0) animated:YES];
    self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width,self.myScrollView.frame.size.height);    

请注意,一旦放下键盘,所有内容都可见,因此无需启用滚动(contentSize = frame.size)。

但是,我的问题是因为我在设置 contentOffset 之后立即设置 contentSize,所以 setContentOffset 动画没有时间完成。相反,动画看起来非常生涩。有什么建议吗?

【问题讨论】:

【参考方案1】:

使用 UIKeyboardDidShowNotification 和 UIKeyboardWillHideNotification 是个好主意:

第1步:监听两个通知

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardDidShow:)
                                             name:UIKeyboardDidShowNotification object:nil];

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

第 2 步:在键盘显示时做一些事情

- (void)keyboardDidShow:(NSNotification*)notification

CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;

BOOL Need_Resize; // judge by yourself

if (Need_Resize) 
    double offset; // judge by yourself
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDuration:0.5];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.view setCenter:CGPointMake(self.view.center.x, self.view.center.y - offset];
    [UIView commitAnimations];



第 3 步:在键盘隐藏时做一些事情

// in animation code, set the view back to the original place
[self.view setCenter:CGPointMake(self.view.center.x, self.view.frame.size.height/2)];

这个方案不需要UIScrollView,只需要调整view的位置,加上动画就够了。

【讨论】:

【参考方案2】:

这个呢? 不知道它是否会起作用,但只是从我的头顶开始:

[UIView animateWithDuration:0.5
                  animations:^
                      self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width, 560);
                   completion:^(BOOL finished) 
                      [self.myScrollView setContentOffset:CGPointMake(0, 200) animated:YES];
                  ];

祝你好运

【讨论】:

【参考方案3】:

您可以尝试使用scrollRectToVisible:animated: 并将其传递给您的文本字段的矩形或CGRectZero,而不是设置内容偏移量,具体取决于您要去的方向。

【讨论】:

以上是关于UITextField辞职第一响应者后如何更改UIScrollView contentSize的主要内容,如果未能解决你的问题,请参考以下文章

辞职第一响应者 UITextfield

iPhone-在 UITextField 上辞职第一响应者后,无法重新聚焦

Swift 如何让所有 uiTextfield 上的第一响应者辞职

UITextField,辞职第一响应者时,导致文本的奇怪动画滚动

UITextField 辞职第一响应者 iOS4

UITextField 不辞职第一响应者?