Iphone UITextField辞去第一响应者后如何更改UIScrollView内容大小

Iphone UITextField辞去第一响应者后如何更改UIScrollView内容大小,iphone,ios,objective-c,uitextfield,Iphone,Ios,Objective C,Uitextfield,我正在编写一个iPhone应用程序,我有一些UITextfields,当键盘出现时会被覆盖;因此,我将UITextFields放在UIScrollView中,并将自己设置为代理,以便在键盘激活时调用此方法: -(void) textFieldDidBeginEditing:(UITextField *)textField { self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width, 56

我正在编写一个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];
}
-(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设置得更高,这样即使文本字段已经聚焦,用户仍然可以滚动

类似地,当textfield退出first responder状态时,将调用此方法:

-(void) textFieldDidBeginEditing:(UITextField *)textField
{
    self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width, 560);
    [self.myScrollView setContentOffset:CGPointMake(0, 200) animated:YES];
}
-(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动画没有时间完成。相反,动画看起来非常不稳定。有什么建议吗?

这个怎么样? 我不知道它是否会起作用,但我只是想:

[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];
                  }];

祝你好运

使用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];
第二步:在键盘显示的时候做点什么

- (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];
}

}
第三步:在键盘隐藏时做些什么

// 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,只需调整视图的位置,通过动画,它看起来就足够了。

您可以尝试使用内容偏移量,并根据所处方向将其传递给文本字段的rect或
CGRectZero