我正在写一个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动画没有时间完成。相反,动画看起来非常生涩。有什么建议吗?
答案 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
,具体取决于您要去的方向。