1

私にはUILabel子供がいUIViewます。何も表示する必要がない場合にビューからスライドするステータスパネルとして使用します。これを行うには、単にorigin.yからラベルの高さを引いたものにアニメーション化します。

メッセージを表示する必要があるとすぐに、ラベルをスライドしてビューに戻します。数秒の遅延の後、スライドして元に戻ります。それはうまくいきます。

また、ラベルにを追加したUITapGestureRecognizerので、ユーザーはメッセージが自動的に消えるのを待たずにすぐにメッセージを閉じることができます。

私の問題は、ラベルがビューの外に移動すると、ジェスチャレコグナイザーが起動しないことです。ラベルが完全にビュー内にあり、表示されたら、ジェスチャーレコグナイザーを初期化して追加します。初めて期待通りに動作します。しかし、メッセージが戻ってくると、ジェスチャ認識機能が削除または無効になっているように見えます。

また、アニメーションの完全なブロックでラベルが画面に完全に表示されるたびにgrを追加しようとしましたが、それも役に立ちませんでした。

ここで何が起こっているのか、そしてレコグナイザーを常に機能させる方法を誰かに説明してもらえますか?

あなたが必要で、さらなる情報があれば私に知らせてください。

アップデート

さらにテストを行ったところ、showError呼び出しでlblError.gestureRecognizersをログに記録すると、次のようになります。

<UITapGestureRecognizer: 0x6b153f0; state = Possible; view = <UILabel 0x6b14fa0>; target= <(action=dismissError:, target=<OptionViewController 0x686d2a0>)>>

作成直後とまったく同じです。ですから、それはまだそこにあり、タッチイベントはそれに到達しないと思います。

更新2

さらに一歩進んだ。

GestureRecognizer問題は、ラベルをy座標0に移動することであるようです。これは、0.1に設定すると機能するため、コードのバグである可能性があります。

システムは、ラベルがビューにないことを「認識」しているため、タッチ処理などを無効にしているように見えます。^^

これにより、問題の半分は解決されますが、反対側に新しい問題が作成されます。ジェスチャレコグナイザが機能するようになったため、遅延移動アニメーションはトリガーされなくなりました。

ですから、本当の問題は、ムーブアウトアニメーションがムーブインの直後にトリガーされることだと思います。それは遅れても、ラベルがいかなる種類のタッチイベントも受け取れないようにします。

コード

//ジェスチャレコグナイザーを追加します(viewDidLoad内)

UITapGestureRecognizer *errorDismissGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissError:)];
[lblError addGestureRecognizer:errorDismissGesture];

// display error
- (void)showError:(NSString *)message {
  [lblError setText:message];
  [UIView animateWithDuration:0.5 
                   animations:^(void) { 
                     CGRect frame = lblError.frame;
                     frame.size.width = self.view.bounds.size.width;
                     frame.origin.y = 0;
                     lblError.frame = frame;
                   } 
                   completion:^(BOOL finished) {
                     [UIView animateWithDuration:0.5
                                           delay:2.0
                                         options:UIViewAnimationOptionCurveEaseOut
                                      animations:^(void) {
                                        CGRect frame = lblError.frame;
                                        frame.origin.y = -40.0f;
                                        lblError.frame = frame;
                                      }
                                      completion:^(BOOL finished) {}];
                   }];
}

- (void)dismissError:(UIGestureRecognizer *)sender {
  [UIView animateWithDuration:0.3
                   animations:^(void) {
                     CGRect frame = lblError.frame;
                     frame.origin.y = -40.0;
                     lblError.frame = frame;
                   }
                   completion:^(BOOL finished) {}];
}

ありがとう、挨拶、トーマス

4

1 に答える 1

1

やっと解決しました!

ムーブアウトアニメーションの遅延により、ラベルがタッチイベントを受信できなくなっているようです。UIAnimationOptionAllowUserInteractionでさえ役に立ちませんでした。

そこで、遅延アニメーションを、コードを少しでも読みやすくする時間指定の呼び出しに置き換えました。これが今の様子です。

 - (void)showError:(NSString *)message {
     [lblError setText:message];
     [UIView animateWithDuration:0.5 
                     animations:^(void) { 
                         CGRect frame = lblError.frame;
                         frame.size.width = self.view.bounds.size.width;
                         frame.origin.y = 0.1;
                         lblError.frame = frame;
                     } 
                     completion:^(BOOL finished) {
                         if (finished) {
                            [_moveOutTimer invalidate];
                             _moveOutTimer = nil;
                             _moveOutTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(dismissError:) userInfo:nil repeats:NO];
                         }
                     }];
}

- (void)dismissError:(UIGestureRecognizer *)sender {
    [_moveOutTimer invalidate];

    [UIView animateWithDuration:0.3
                    animations:^(void) {
                         CGRect frame = lblError.frame;
                         frame.origin.y = -40.0;
                         lblError.frame = frame;
                     }
                     completion:^(BOOL finished) {}];
}
于 2012-06-07T18:49:12.150 に答える