0

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

在接口文件中

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

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

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

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

提前致谢

4

1 回答 1

1

即使我遇到了这个问题,也像下面这样修复。

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

并为该操作退出所有键盘 ( resignFirstResponder)。

这使您的视图在应用程序进入后台之前处于正确的位置。

并确保在正确的位置添加和删除通知观察者。

您可以在 中添加观察者viewDidLoad和删除观察者viewDidUnLoad

当使用此视图滚动与 textFields 时,它们可能是另一个问题,如果支持方向,则可能会发生此问题。

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

于 2012-10-11T15:58:13.923 回答