当我在屏幕上有多个文本字段并且不希望键盘隐藏文本字段时,我目前使用此方法上下滚动视图。我在网上找到了这段代码,它在大多数情况下都运行良好。
在接口文件中
@interface ViewController : UIViewController<UITextFieldDelegate>
{
IBOutlet UITextField *textField1;
IBOutlet UITextField *textField2;
IBOutlet UITextField *textField3;
//Float
CGFloat animatedDistance;
}
在实施中
static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3;
static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8;
static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216;
static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 162;
然后我使用这些方法在单击文本字段时使视图上下滚动
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;
CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height;
CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height;
CGFloat heightFraction = numerator / denominator;
if (heightFraction < 0.0)
{
heightFraction = 0.0;
}
else if (heightFraction > 1.0)
{
heightFraction = 1.0;
}
UIInterfaceOrientation orientation =
[[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationPortrait ||
orientation == UIInterfaceOrientationPortraitUpsideDown)
{
animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
}
else
{
animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction);
}
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
在此示例中,我有 3 个文本字段,分别位于屏幕顶部、屏幕中间和屏幕底部。我还将这个工具栏添加到每个文本字段中,其中包含下一个上一个和完成按钮。我相信你可以猜到他们在做什么。
此代码运行良好,除了一个问题。如果我正在编辑文本字段,然后单击屏幕中间的文本字段,视图会向上滚动,因此文本字段不会被隐藏,这很好。但是,如果我在编辑过程中单击主页按钮,然后再次访问应用程序,当再次打开视图时,滚动将重置为正常状态,但文本字段仍在编辑中,所以当我做点击完成按钮,视图的行为是如果它仍然向上滚动,所以它再次向下滚动,这导致视图滚动到屏幕底部
我也尝试使用通知何时显示或隐藏键盘来滚动视图,但同样的问题发生了。
以前有人遇到过这个问题吗?如果是这样,他们是如何解决的。
提前致谢