8

iOS6 では問題なく動作する UIButton に問題がありますが、iOS7 では特定の時点までタッチ イベントに応答しません。明確にするために、下の画像を参照してください。

ios7_button_issue

失敗するボタンは、UIView にある [すべて破棄] ボタンです。(このボタンは一時的に無効になっているだけで、それは問題ではないことに注意してください。ボタンが有効になっている最新のテストのスクリーンショットがありません。)

このボタンは、最初に UITableViewCell の [破棄] または [再試行] ボタンを押さない限り、すべてのタッチを無視します。(これにより、View Controller のリロードが発生し、ViewDidLoad などのライフサイクル メソッドが再度呼び出されます。) テーブル ビュー セルの [破棄] または [再試行] ボタンのいずれかが押された後、[すべて破棄] ボタン正しく機能し始めます。

ビューと [すべて破棄] ボタンは、コードではなくコントローラーの XIB ファイルに基づいて作成されています。これは iOS7 でのみ失敗し、taleview セル ボタンがタッチされるとすぐに機能し始めます。

誰にもアイデアはありますか?

ありがとう!

4

10 に答える 10

17

昨夜解決策を見つけました。さて、上記のテーブル ビューと UIView 要素をターゲット フレームに配置するとどうなりますか。

100% 確信があるわけではありませんが、iOS6 では、ボタンが配置されている場所に関係なく、ボタンがイベントに応答するようです。iOS7 では、何らかの理由で、ボタンがフレームの外側にあると、ボタンが表示されてもタッチ イベントが無視されます。

ビューのフレームを正しい場所に配置してボタンをオーバーレイすることで問題を解決しました。

これに関するドキュメントが見つかった場合は、ここに投稿します。

ありがとう!

于 2013-10-01T06:59:49.510 に答える
7

私はちょうどこの問題に直面しました。@Guntis Treulands のhitTest:withEvent:アドバイスに従って、カスタム ヘッダー ビューでメソッドをオーバーライドするとどうなるかを確認することにしました。このメソッドは、非表示のビュー オブジェクト、ユーザー操作が無効になっているビュー オブジェクト、またはアルファ レベルが 0.01 未満のビュー オブジェクトを無視します。このメソッドは、ヒットを判断するときにビューのコンテンツを考慮しません。したがって、指定されたポイントがそのビューのコンテンツの透明な部分にあり、オーバーライドされた後、境界外のタッチを受け取った場合でも、ビューを返すことができます。それは私のためにトリックをしました。お役に立てば幸いです。

迅速

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    guard !isHidden, alpha > 0 else {
      return super.hitTest(point, with: event)
    }
    
    for subview in subviews {
      let subpoint = subview.convert(point, from: self)
      let result = subview.hitTest(subpoint, with: event)
      if result != nil {
        return result
      }
    }
    return super.hitTest(point, with: event)
}

Objective-C

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
        for (UIView *subview in self.subviews.reverseObjectEnumerator) {
            CGPoint subPoint = [subview convertPoint:point fromView:self];
            UIView *result = [subview hitTest:subPoint withEvent:event];
            if (result != nil) {
                return result;
            }
        }
    }
    // use this to pass the 'touch' onward in case no subviews trigger the touch
    return [super hitTest:point withEvent:event];
}
于 2014-03-04T17:10:21.557 に答える
1

これは奇妙ですが、私はiOS 7用の新しいアプリを開発していて、[cell.contentView setUserInteractionEnabled: YES];実際に設定が機能しました.

于 2013-11-07T19:24:06.557 に答える
1

私も同じ問題を抱えていましたが、以下のコードボタンアクションを追加した後、正常に動作しましたcell.contentView.userInteractionEnabled = NO;

于 2015-10-30T09:15:49.693 に答える
1

私はこれと同じ問題を抱えていました-ボタンはiOS6では機能し、iOS7では機能しませんでした。問題は、追加したコンテナUIViewにあり、コンテナUIButtonsに制約を追加するUIViewと機能し始めました。私の場合に追加しなければならなかったコード:

[superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:    [_controllersView]-|" options:0 metrics:nil views:views]];
[superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_controllersView(70)]" options:0 metrics:nil views:views]];
[superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_controllersView]|" options:0 metrics:nil views:views]];
于 2013-12-03T16:24:30.340 に答える
0

親フレーム内のボタンを確認します

于 2015-01-14T22:06:52.600 に答える