0

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

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

4

3 回答 3

2

使用 UIKeyboardDidShowNotification 和 UIKeyboardWillHideNotification 是一个好主意:

第一步:收听两个通知

[[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的位置,加上动画,看起来就够了。

于 2013-02-20T03:45:19.203 回答
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];
                  }];

祝你好运

于 2013-02-20T03:44:31.300 回答
0

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

于 2013-02-20T03:52:23.273 回答