UIsCrolViewビュー上のbuttonのクリック効果

3370 ワード

UIsCrolViewビュー上のbuttonのクリック効果


一般的にUIButtonはクリックした瞬間にハイライトを押す効果があり、長押しするのも同じです.しかし、このUIButtonをUIsCrolViewに追加すると、軽くクリックしてもハイライトされた押圧効果はなく、長押ししなければ現れないことがわかります.だから、このButtonはクリックしていないが、実際にはクリックイベントがトリガーされているが、クリック効果がないだけだという感じがします.ほとんどの注意深い学生がこの問題を発見したと信じています.
好奇心のある人は原因を探究し、ネット上でも問題の原因と解決方法を提供しています.

UIsCrolViewのdelaysContentTouchesとcancencelContentTouchesプロパティ


tracking


UIsCrolViewには、ユーザーがコンテンツに触れてスクロールしようとしているかどうかを返すBOOLタイプのtrackingプロパティがあります.このプロパティから、UIscrollViewの動作原理を探ります.
UIScrollViewの内容に指を触れた瞬間、次のような動きが起こります.
  • タッチイベント
  • をブロックする
  • tracking属性がYES
  • になる
  • は、極めて短いイベント間隔で指移動が発生したかどうかを監視するために内蔵されたタイマが有効になり始めた
  • である.
    Case 1:時間間隔で指が移動していることが検出されると、UIscrollView自身がスクロールをトリガし、tracking属性がNOとなり、指のタッチ下に(タッチイベントに応答できる)内部コントロールがあってもタッチイベントに応答しない.Case 2:時間間隔で指が移動していないことが検出された場合、tracking属性はYESのままであり、指が触れた場合(タッチイベントに応答できる)内部コントロールがあれば、タッチイベントをコントロールに渡して処理する.

    delaysContentTouches


    多くのニュースクラスのAppの上部にはスライドメニューバーがあり、主なモデルは1つのUIscrollViewに複数のUIButtonコントロールが含まれている可能性があります.
  • あなたが操作する時、指が急速に上を漕いだ場合、指が触れた場所にUIButtonがあっても、UIButtonのタッチイベントはトリガーされていないことがわかります.これは前述のcase 1です.
  • 指がゆっくりと動いていないか、まったく動いていない場合、UIBEttonのタッチイベントがトリガーされます.これはcase 2の場合です.

  • 上記の動作原理には、delaysContentTouchesという属性スイッチがあります.デフォルト値はYESです.NOに設定すると、指の移動がどんなに速くても、タッチイベントは常に内部コントロールに渡されます.NOに設定すると、UIscrollViewのスクロール機能に影響を与える可能性があります.

    canCancelContentTouches


    もう1つのBOOLタイプの属性cancancelContentTouchesを見ると、字面的には「コンテンツタッチをキャンセルできる」と理解され、デフォルト値はYESです.ドキュメントの説明は次のとおりです.
    A Boolean value that controls whether touches in the content view always lead to tracking.
    If the value of this property is YES and a view in the content has begun tracking a finger touching it, and if the user drags the finger enough to initiate a scroll, the view receives a touchesCancelled:withEvent: message and the scroll view handles the touch as a scroll. If the value of this property is NO, the scroll view does not scroll regardless of finger movement once the content view starts tracking.
    中国語に訳すと大体以下の通りです.
    このBOOLタイプの値はcontent viewのタッチが常にトレースを起こすかどうかを制御します
  • 属性値がYESであり、指がコンテンツコントロールに触れていることを追跡している場合、ユーザが指の距離をドラッグしてスクロールを生成するのに十分である場合、コンテンツコントロールはtouchesCancelled:withEvent:メッセージを受け取り、scroll viewは今回のタッチをスクロールとして処理する.
  • 値がNOの場合、content viewがトレースを開始すると、指が移動するかどうかにかかわらずscrollViewはスクロールしません.

  • 簡単に言えば、YESであれば、ユーザーの次の動作を待っていて、ユーザーが指を一定距離移動すると、この操作をスクロールとして処理し、スクロールを開始し、touchesCancelled:withEvent:メッセージをコンテンツコントロールに送信し、コントロールによって自行処理する.NOであれば、ユーザの次の動作を待つことはなく、scrollViewのスクロールは常にトリガーされません.

    ======================


    UIButtonがUISCrolView上でクリックした瞬間にクリック効果があることを解決するために、同時にUISCrolViewのスライドや機能に影響を与えることはできません


    UIsCrolViewのカテゴリを追加するだけでいいです!
    .hファイル
    @interface UIScrollView (Click)
    @end
    

    .mファイルメソッド*-(BOOL)t o u c h e s ShouldCancelInContentView:(UIView)view公式ドキュメント新規サブクラス継承UIScrolView書き換えを推奨するため、カテゴリ書き換え時に警告があります.ここでは警告マスクが必要です
    @implementation UIScrollView (Click)
    - (BOOL)delaysContentTouches
    {
        return NO;
    }
    
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
    - (BOOL)touchesShouldCancelInContentView:(UIView *)view
    {
        return YES;
    }
    #pragma clang diagnostic pop
    
    @end
    

    参照リンク:http://www.cnblogs.com/wayne23/p/4011266.html