编辑时按下主页按钮时的xCode TextField键盘视图滚动问题

时间:2012-10-11 14:35:53

标签: objective-c ios

当我在屏幕上有多个文本字段并且不希望键盘隐藏文本字段时,我当前使用此方法上下滚动视图。我在网上发现了这个代码,它在大多数情况下运行良好。

在界面文件

@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个文本字段,位于屏幕顶部,屏幕中间和屏幕底部。我还在每个文本字段中添加了此工具栏,其中包含下一个上一个和完成的按钮。我相信你能猜出他们做了什么。

除一个问题外,此代码运行良好。如果我正在编辑文本字段,并且单击屏幕中间的文本字段,则视图会向上滚动,因此文本字段不会被隐藏,这很好。但是,如果我在编辑过程中单击主页按钮,然后再次访问应用程序,当再次打开视图时,滚动将重置为正常情况,但文本字段仍在编辑中,所以当我单击完成按钮,视图动作是否仍然向上滚动,因此它再次向下滚动,这会导致视图滚动到屏幕底部

我还尝试使用通知显示或隐藏键盘以滚动视图,但同样的问题也会发生。

以前有人有这个问题吗?如果是这样,他们是如何解决它的。

提前致谢

1 个答案:

答案 0 :(得分:1)

即使我遇到了这个问题,并修改如下。

您需要在ViewController中为UIApplicationWillResignActiveNotification添加一个观察者,其中存在textFields。

对于该操作,将重新签名所有键盘(resignFirstResponder)。

这会在应用输入背景之前使您的视图处于正确的位置。

并确保添加&amp;在正确的位置删除通知观察员。

您可以在viewDidLoad中添加观察者,并在viewDidUnLoad中删除观察者。

将此视图滚动与textFields一起使用时可能会出现另外一个问题,如果支持方向,则可能会出现此问题。

如果您跟踪此问题,请告诉我,会对您有所帮助。