当我在屏幕上有多个文本字段并且不希望键盘隐藏文本字段时,我当前使用此方法上下滚动视图。我在网上发现了这个代码,它在大多数情况下运行良好。
在界面文件
中@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个文本字段,位于屏幕顶部,屏幕中间和屏幕底部。我还在每个文本字段中添加了此工具栏,其中包含下一个上一个和完成的按钮。我相信你能猜出他们做了什么。
除一个问题外,此代码运行良好。如果我正在编辑文本字段,并且单击屏幕中间的文本字段,则视图会向上滚动,因此文本字段不会被隐藏,这很好。但是,如果我在编辑过程中单击主页按钮,然后再次访问应用程序,当再次打开视图时,滚动将重置为正常情况,但文本字段仍在编辑中,所以当我单击完成按钮,视图动作是否仍然向上滚动,因此它再次向下滚动,这会导致视图滚动到屏幕底部
我还尝试使用通知显示或隐藏键盘以滚动视图,但同样的问题也会发生。
以前有人有这个问题吗?如果是这样,他们是如何解决它的。
提前致谢
答案 0 :(得分:1)
即使我遇到了这个问题,并修改如下。
您需要在ViewController中为UIApplicationWillResignActiveNotification
添加一个观察者,其中存在textFields。
对于该操作,将重新签名所有键盘(resignFirstResponder
)。
这会在应用输入背景之前使您的视图处于正确的位置。
并确保添加&amp;在正确的位置删除通知观察员。
您可以在viewDidLoad
中添加观察者,并在viewDidUnLoad
中删除观察者。
将此视图滚动与textFields一起使用时可能会出现另外一个问题,如果支持方向,则可能会出现此问题。
如果您跟踪此问题,请告诉我,会对您有所帮助。