如何在UITextField重新启动第一个响应程序后更改UIScrollView contentSize

时间:2013-02-20 02:59:27

标签: iphone ios objective-c uitextfield

我正在写一个iPhone应用程序,我有一些UITextfields,当键盘出现时会被覆盖;因此我将UITextField放在UIScrollView中,并将自己设置为委托,以便当键盘变为活动状态时,会调用此方法:

-(void) textFieldDidBeginEditing:(UITextField *)textField
{
    self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width, 560);
    [self.myScrollView setContentOffset:CGPointMake(0, 200) animated:YES];
}

请注意,我正在使contentSize更高,以便即使文本字段成为焦点,用户仍然可以滚动。

同样,当textfield重新响应第一个响应者状态时,会调用此方法:

-(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动画没有时间完成。相反,动画看起来非常生涩。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

使用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,只需调整视图的位置,使用动画,它看起来很棒。

答案 1 :(得分:0)

这个怎么样? 不知道它是否会起作用,但只是从我的头脑中开始:

[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];
                  }];
祝你好运

答案 2 :(得分:0)

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