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 つのテキスト フィールドがあります。また、このツールバーを各テキスト フィールドに追加し、その中に次の前のボタンと完了ボタンを配置しました。彼らが何をしているのかは、きっとご想像いただけると思います。

このコードは、1 つの問題を除いてうまく機能します。テキスト フィールドを編集しているときに、画面の中央にあるテキスト フィールドをクリックすると、ビューが上にスクロールするので、テキスト フィールドが非表示になることはありません。これは良いことです。ただし、編集中にホームボタンをクリックしてアプリケーションに再度アクセスすると、ビューが再び開かれると、スクロールは通常の状態にリセットされますが、テキストフィールドはまだ編集中です。完了ボタンをクリックすると、ビューがまだ上にスクロールされている場合にビューが動作するため、再び下にスクロールし、ビューが画面の下部からスクロールします

ビューをスクロールするためにキーボードが表示または非表示になったときに通知を使用しようとしましたが、同じ問題が発生します。

誰かが以前にこの問題を抱えていましたか? もしそうなら、彼らはそれをどのように解決しましたか。

前もって感謝します

4

1 に答える 1

1

私もこの問題を抱えており、以下のように修正しました。

UIApplicationWillResignActiveNotificationtextFields が存在する ViewController にオブザーバーを追加する必要があります。

そして、そのアクションのために、すべてのキーボードを辞任します ( resignFirstResponder)。

これにより、アプリがバックグラウンドに入る前にビューが正しい位置に表示されます。

そして、適切な場所で通知オブザーバーを追加および削除してください。

でオブザーバーを追加しviewDidLoadたり、 でオブザーバーを削除したりできviewDidUnLoadます。

向きがサポートされている場合、この問題が発生する可能性があります。

この問題を追跡した場合はお知らせください。

于 2012-10-11T15:58:13.923 に答える