1

私はこの質問が数回尋ねられたことを知っています。キーボードが表示されたときにビューまたはテキストフィールドを上に移動する方法は理解していますが、理解できないような不具合が発生しています。

上に移動しようとしているビューは、2つのビューのコンテナーとして機能するUIViewController内にあります。このコンテナは、それ自体がスライディングビューコントローラ内のビューです(Facebookが実装しているようなものです)。

ビューを最初にロードしたときにテキストフィールドは正常に上に移動しますが、別のビューに移動して戻った場合、キーボードによってビューが非表示になります。

ビューを上に移動するために使用しているコードは次のとおりです。

    - (void) animateTextField:(BOOL)up {

    const int movementDistance = 350; // tweak as needed
    const float movementDuration = 0; // tweak as needed

    int movement = (up ? -movementDistance : movementDistance);

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];

    self.sendingToolbar.frame = CGRectOffset(self.sendingToolbar.frame, 0, movement);
    self.messagesTable.frame = CGRectOffset(self.messagesTable.frame, 0, movement);
    //[splitController moveViewUp:up];
    [UIView commitAnimations];

}

- (void)registerForKeyboardNotifications
{
    NSLog(@"was this method called");

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWasShown:)
                                                 name:UIKeyboardDidShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillBeHidden:)
                                                 name:UIKeyboardWillHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
    [self animateTextField:YES];
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    [self animateTextField:NO];
}

このグリッチが発生する可能性がある理由はありますか?ありがとう

ブール値の提案を追加して、テキストフィールドがすでに表示されているかどうかを確認した後、ビューを離れて戻ったときだけでなく、キーボードが表示されているときは常にビューが消えます。改訂された方法は次のとおりです。

- (void) animateTextField:(BOOL)up {

    const int movementDistance = 350; // tweak as needed
    const float movementDuration = 0; // tweak as needed

    int movement = movementDistance;

    [UIView beginAnimations: @"anim" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];

    if(textFieldIsUp && (up == YES)) {
        NSLog(@"Case 1");
        // Do nothing since text field is already up
    }
    else if(textFieldIsUp && (up == NO)) {
        NSLog(@"Case 2");
        // Move the text field down
        self.sendingToolbar.frame = CGRectOffset(self.sendingToolbar.frame, 0, -movement);
        self.messagesTable.frame = CGRectOffset(self.messagesTable.frame, 0, -movement);

        textFieldIsUp = NO;
    }
    else if((textFieldIsUp == NO) && (up == YES)) {
        NSLog(@"Case 3");
        // Move the text field up
        self.sendingToolbar.frame = CGRectOffset(self.sendingToolbar.frame, 0, movement);
        self.messagesTable.frame = CGRectOffset(self.messagesTable.frame, 0, movement);

        textFieldIsUp = YES;
    }
    else if((textFieldIsUp == NO) && (up == NO)) {
        NSLog(@"Case 4");
        // Do nothing since the text field is already down
    }
    else {
        NSLog(@"Default");
        // Default catch all case. Does nothing
    }

    [UIView commitAnimations];

}

これが私のセットアップに関するいくつかの詳細です:

ビューコントローラーは、アプリのメッセージングセンターです。ビューコントローラには2つのサブビューが含まれています。左側のサブビューは会話を選択するためのメニューであり、右側のメニューはその会話内のメッセージを含むサブビューです。メッセージを下から上にロードしたいので、テーブルビューは180度回転し、セルも反対方向に180度回転します。また、NSTimerを使用してテーブルビューが5秒ごとにリロードされるため、メッセージを新しいメッセージで更新できます。

4

1 に答える 1

1

テキストフィールドは既に上に移動されていますが、ビューを離れたときに下に戻りませんでした。ビューに再度アクセスすると、再び上に移動し、画面から外れます。

私は以前にこの問題を抱えていました。テキストフィールドが上または下の位置にあるかどうかを示すブール変数を保持することで解決しました。再度上に移動する前に、変数をチェックして、テキストフィールドがまだ上になっていないことを確認してください。

どうやってやったの。ビューのプロパティを使用してNSNumber、ビューが押し上げられたかどうかを保存し、他のビューがビューを押し上げたかどうかを通信できるようにします。

//In viewDidLoad
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardWillHideNotification object:nil];

//Pushes the view up if one of the table forms is selected for editing
- (void) keyboardDidShow:(NSNotification *)aNotification
{
    if ([isRaised boolValue] == NO)
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.25];
        self.view.center = CGPointMake(self.view.center.x, self.view.center.y-moveAmount);
        [UIView commitAnimations];
        isRaised = [NSNumber numberWithBool:YES];
    }
}

//Push view back down
- (void) keyboardDidHide:(NSNotification *)aNotification
{
    if ([isRaised boolValue])
    {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.25];
        self.view.center = CGPointMake(self.view.center.x, self.view.center.y+moveAmount);
        [UIView commitAnimations];
        isRaised = [NSNumber numberWithBool:NO];
    }
}

-編集-

コードを見ると、フレームの y 座標から減算してフレームを下に移動しているように見えます。の iOS 座標系CGRectは、通常の座標系とは異なります。y 軸が反転しています (これは、グラフィック システムでは比較的一般的です)。あなたは自分がしていることの反対をしたいと思うでしょう。

于 2012-07-30T13:59:45.287 に答える