3

私はこれを理解することはできませんし、これが本当にそれを説明しているとは思いません。

UILabelユーザーがタップして非表示または表示できる があります。次のように設定します。

self.numberLabel.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] 
    initWithTarget:self action:@selector(hideOrShowNumber)];
[self.numberLabel addGestureRecognizer:tapGesture];

alphaに値を設定して、ラベルの非表示と表示をアニメーション化したいと思いUILabelます。ただし、アルファ値を に設定する0.0fと、ラベルはタップを受け入れなくなります。そのため、ユーザーがラベルを非表示にできたとしても、表示できなくなります。

私の回避策は次のようになります。

ラベルを非表示にする場合: - アルファ値を 0.0f にアニメートします。- ラベルのテキストの色を黒に設定します (背景が黒なので見えなくなります)。 - アルファを 1.0f にリセットします。

ラベルを表示する場合: - アルファを 0.0f に設定します (ラベルが非表示のときに 1.0f のままだったため)。- テキストの色を黒以外の色に設定します (ゲームの状態によって異なります)。- アルファ値を 1.0f にアニメートします。

コードは次のようになります (いくつかの状態変数が含まれていますself.numberLabelが、 への参照ですUILabel)。

NSTimeInterval duration = 0.6f;

if (self.numberIsVisible) {
    [UIView animateWithDuration:duration
                     animations:^{
                         self.numberLabel.alpha = 0.0f;
                     }
                     completion:^(BOOL done) {
                         self.numberLabel.textColor = [UIColor blackColor];
                         self.numberLabel.alpha = 1.0f;
                     }
    ];
    self.numberIsVisible = NO;
}
else {
    UIColor *rightColor = [UIColor whiteColor];

    if ([GameState sharedGameState].haveMatch) {
        rightColor = [UIColor colorWithRed:0.0/255.0 green:127.0/255.0 blue:255.0/255.0 alpha:1.0];
    }

    self.numberLabel.alpha = 0.0f;
    self.numberLabel.textColor = rightColor;

    [UIView animateWithDuration:duration
                     animations:^{
                         self.numberLabel.alpha = 1.0f;
                     }
    ];

    self.numberIsVisible = YES;
}

動作しますが、少し扱いに​​くいです。

問題は、透明度を設定するとユーザーの操作が失われるのはなぜですか? UILabelこれは仕様によるもので、どこかに文書化されていますか? UIGestureRecognizerドキュメントでこれについて何も見つかりません。

4

6 に答える 6

3

公式ドキュメントから(タッチイベント配信の規制セクション

タッチ イベントの配信をオフにします。デフォルトでは、ビューはタッチ イベントを受け取りますが、その userInteractionEnabled プロパティを NO に設定して、タッチ イベントの配信をオフにすることができます。ビューが非表示または透明の場合も、これらのイベントを受け取りません

ビューに完全な透明性 (アルファ = 0) を設定することは、ビューを非表示にすることと同様であると見なされるため、その場合にユーザー インタラクションを処理する必要はありません。代わりに、ほぼ透明にすることもできますUILabel。のアルファが0.1限界のようです。

于 2013-01-05T09:18:19.903 に答える
2

alpha が < 0.1f の UIView は、hidden プロパティが YES に設定されているかのように動作するようです。つまり、ビューは透過的であるため、タッチ イベントを受け取りません。この投稿を参照してください。

于 2013-01-05T09:28:31.653 に答える
2

少なくとも iOS 8 では、アルファを 0.01 に設定でき (制限は 0.1 ではなくなりました)、タッチ イベントがトリガーされます。0.0 の場合、タッチ イベントはトリガーされません。

更新: iOS 8.2 およびおそらくそれ以前のバージョンで、制限が 0.001960785 であることを発見しました。完全に透明に非常に近い。おそらく、その数はさらに小さい可能性があるため、小数点以下の桁数は取りませんでした。

于 2014-07-14T04:51:05.690 に答える
1

どうやらこの動作は文書化されていたようですが、現在の文書には見つかりません。

この回答を参照してください:アルファがゼロに設定されている場合、UIViews で touchesBegan が起動しないのはなぜですか?

「デフォルトでは、ビューはタッチ イベントを受け取りますが、その userInteractionEnabled プロパティを NO に設定して、イベントの配信をオフにすることができます。また、ビューが非表示または透過の場合、ビューはイベントを受け取りません。」

UILabel非表示にするビューが、タッチを受けるビューと同じビューである必要はありません。より簡単な回避策は次のとおりです。

  1. ユーザーがタップできるようにするラッパーUIViewを追加します
  2. ジェスチャ レコグナイザーをラッパー ビューに追加する
  3. ジェスチャ レコグナイザーのアクションでラベルを表示または非表示にする
于 2013-01-05T09:26:45.493 に答える
0

設計上、アルファが 0 に設定されている場合、ビューはタッチを受け取りません。代わりに、アルファを 0.1 に設定してみてください。Apple リンクhttps://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MultitouchEvents/MultitouchEvents.htmlを確認してください。

于 2013-01-05T21:52:36.340 に答える
0

スペースを含む UILabel を作成することでこれを解決し、Autolayout 制約を使用して必要に応じて拡大/縮小しました。

于 2015-07-09T15:48:56.743 に答える