English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

iOS UIButtonが反応しない解決策

前書き

日常開発ではボタンとよく関わることがありますが、時には難しい問題に直面することがあります。それはボタンがクリックイベントに反応しないことです。この場合、以下の点から調査する必要があります

ボタンが反応しない理由

1、ボタンがユーザーインタラクションを開始していない親ビューに追加されている場合、例えばUIImageViewの場合、親ビューのインタラクションを開始します view.userInteractionEnabled = YES

YESに設定することで問題が解決します

2、ボタン自身が遮られており、クリックするとボタンではなくその上のレイヤーのビューがクリックされているため、自然に反応しません

ここにはレイヤーを確認する方法があります。以下の図で赤い枠のボタンをクリックすると、現在の実行中のインターフェースのUI要素が見えます。viewがbuttonを遮っているかどうかを確認できます

3、ボタンのframeが親ビューのframeを超えている場合、これは最もよく起こる問題です。ボタンのframeは親ビューのframeの内部でクリックする必要があります。以下の図のように、ボタンのクリック可能な赤い枠の内側をクリックしないと反応しません。

この問題に直面した場合、どうすればいいのでしょうか、以下に続いてください

クリックエリアを超えた問題を解決する方法

この状況は実際には非常に起こりやすいです。私が経験した例を挙げます:チャットエリアの高さがキーボードの高さよりも小さく、入力フィールドがチャットエリアのサブビューである場合、キーボードが弹出した後、入力フィールドが上に移動し、親ビューのframeを超えることがあります。この時、赤い枠のボタンをクリックして表情キーボードのアクションに切り替えると、反応しません。

解決策

ここには二つのメソッドがあります。タッチアクションがあるたびに、この二つのメソッドが実行されます

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

メソッドをオーバーライドします - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

これはView内のメソッドであり、処理プロセスは以下の通りです

  • まず、タッチポイントが現在のビュー内にあるかどうかを判断するためのpointInside:withEvent:メソッドを呼び出します。
  • NOが返された場合、hitTest:withEvent:はnilを返します。
  • YESが返された場合、現在のビューのすべての子ビュー(subviews)にhitTest:withEvent:メッセージを送信し、すべての子ビューの巡回順序はtopからbottom、つまりsubviews配列の末尾から前に巡回し、子ビューが非空のオブジェクトを返すまでまたはすべての子ビューが巡回完了するまでです。
  • 最初に子ビューが非空のオブジェクトを返した場合、hitTest:withEvent:メソッドはこのオブジェクトを返し、処理が終了します。
  • すべてのサブビューがfalseを返した場合、hitTest:withEvent:メソッドは自身(self)を返します。
  • 最後に、このタッチイベントはメインウィンドウのhitTest:withEvent:メソッドから返されるビューオブジェクトに処理を任せます。

したがって、nilを返す場合に処理を行うことができます。なぜなら、この時点でボタンは親ビューの外にありますから

//イベントに応答するビューを返します
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
 UIView *view = [super hitTest:point withEvent:event];
 if (view == nil){
  //座標の変換
  CGPoint tempPoint = [self.testBtn convertPoint:point fromView:self];
  //クリックポイントがボタン領域内にあるかどうかを判定
  if (CGRectContainsPoint(self.testBtn.bounds, tempPoint)){
   //戻るボタン
   return _testBtn;
  }
 }
 return view;
}

この時点で、ボタンが領域外をクリックしても効果があります

まとめ

以上が編集者が皆さんに紹介したiOS UIButton クリック無反応の解決策です。皆さんに役立つことを願っています。何かご不明な点があれば、コメントを残してください。編集者はすぐに回答します。このサイトへのサポートに感謝しています!

声明:この記事の内容はインターネットから取得され、著作権者に帰属します。インターネットユーザーによって自発的に提供され、アップロードされました。このサイトは所有権を持ちません。また、人工編集は行われていません。著作権侵害を疑う内容があれば、メールを送信してください:notice#oldtoolbag.com(メール送信時、#を@に変更して報告してください。関連する証拠を提供してください。一旦確認がついたら、このサイトは即座に侵害を疑う内容を削除します。)

おすすめ