14

待ってください!!!:
この質問は以前に何度も尋ねられ、回答されていると思われるかもしれません。しかし、この質問がユニークであることは保証できます。

質問:
iOS アプリで、以下の画像に示すように 2 つのボタンがあり、トグル ロジックのように動作する 2 つのアクションがあると想像してください。

ここに画像の説明を入力

そして、そのロジックは次のようになります。

- (IBAction)testBtnClicked:(id)sender {
    if ([self.testBtn isEnabled]) {
        [self.testBtn setEnabled:NO];
        [self.setInteractionBtn setUserInteractionEnabled:YES];
    } else {
        [self.testBtn setEnabled:YES];
        [self.setInteractionBtn setUserInteractionEnabled:NO];
    }
}

- (IBAction)setInteractionBtnClicked:(id)sender {
    if ([self.setInteractionBtn isEnabled]) {
        [self.setInteractionBtn setUserInteractionEnabled:NO];
        [self.testBtn setEnabled:YES];
    } else {
        [self.setInteractionBtn setUserInteractionEnabled:YES];
        [self.testBtn setEnabled:NO];
    }
}

setEnabledしたがって、メソッドとメソッドの間に大きな違いはありませんsetUserInteractionEnabled。それらは、ユーザーが使用できないようにする単一のメソッドのように動作します。しかし、それが同じである場合、どのように検出することができますisEnabled trueか?falsesetUserInteractionEnabledFalse

以下は、この質問が SO の別の Q&A スレッドと重複する可能性がない理由です。

  • ランクの高いコードによって私の質問が重複の可能性があるとマークされたとしても、その Q&A では正しい理解が得られませんでした。
  • @danhが言ったように、

少なくとも 1 つの理由は、アニメーション中、UIView でのユーザー操作が無効になっていることです。コントロールがアニメーション化されているときに、コントロールがグレー表示されるのは正しくありません。したがって、少なくともアニメーション中は、2 つのプロパティは異なる意味を持ちます。

これら2つの方法には2つの理由があることを確認する本当の答えまたは理由を教えてくれました。誰もがsetUserInteractionEnabledUIの状態を変更しないと言うことができますが、少なくとも@danhの回答でのみ、UIアニメーション中に暗黙的に使用される可能性があると最初に述べていました。

4

3 に答える 3

17

それらはほぼ同じです。ビューがユーザーのタッチを受け取るかどうかを切り替える userInteractionEnabledのプロパティです。は( のサブクラスであり のスーパークラスである)のプロパティであり、同じ効果があります。1 つの違いは、UIKit コントロールが状態に応じて異なる方法で描画される可能性があることです。これは、abstract には当てはまりません。UIViewenabledUIControlUIViewUIButtonenabledUIView

では、なぜですか?

サブクラスは両方を継承するのにUIControl、ほとんど同じプロパティが 2 つあるのはなぜですか? userInteractionEnabledコントロールが「有効」という概念を捨てて、状態に基づいて異なる方法で描画しないのはなぜですか?

少なくとも 1 つの理由は、アニメーション中、ユーザーUIViewの操作が で無効になっていることです。コントロールがアニメーション化されているときに、コントロールがグレー表示されるのは正しくありません。したがって、少なくともアニメーション中は、2 つのプロパティは異なる意味を持ちます。

于 2015-12-04T05:11:15.430 に答える
4

有効化の特徴:

  • のプロパティですUIControl
  • のスーパークラスUIButton
  • これはオブジェクトの視覚的な状態に影響を与え、一般的にコントロールを無効にする方法として推奨されます

userInteractionEnabledの特徴:

  • のプロパティUIView
  • コントロールと対話するコードは、プロパティが設定されenabledているかどうかよりも、ボタンが存在するかどうかを確認する可能性が高くなります。userInteractionEnabledそれはより伝統的です。
于 2015-12-04T05:07:40.140 に答える
1
@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled

ユーザー イベントを無視してイベント キューから削除するかどうかを決定するブール値。NO に設定すると、ビューに対するタッチやキーボードなどのユーザー イベントは無視され、イベント キューから削除されます。YES に設定すると、イベントは通常どおりビューに配信されます。このプロパティのデフォルト値は YES です。

討論:

アニメーション中は、このプロパティの値に関係なく、アニメーションに関係するすべてのビューでユーザー操作が一時的に無効になります。アニメーションを構成するときに UIViewAnimationOptionAllowUserInteraction オプションを指定することで、この動作を無効にすることができます。

UIView の Apple Doc

@property(nonatomic, getter=isEnabled) BOOL enabled

レシーバーが有効かどうかを決定するブール値。

討論:

コントロールを有効にするには YES を指定します。それ以外の場合は、NO を指定して無効にします。デフォルト値は YES です。有効な状態が NO の場合、コントロールはタッチ イベントを無視し、サブクラスは異なる方法で描画される可能性があります。

ご参考までに:

  1. UIControl の Apple Doc
  2. Q&A

@danhが述べているように:

「少なくとも 1 つの理由は、アニメーション中、UIView でユーザー操作が無効になっていることです。コントロールがアニメーション中にグレー表示されるのは正しくありません。したがって、少なくともアニメーション中、2 つのプロパティには異なる意味があります。」

于 2015-12-04T10:20:11.803 に答える