UIsCrolViewビュー上のbuttonのクリック効果
3370 ワード
UIsCrolViewビュー上のbuttonのクリック効果
一般的にUIButtonはクリックした瞬間にハイライトを押す効果があり、長押しするのも同じです.しかし、このUIButtonをUIsCrolViewに追加すると、軽くクリックしてもハイライトされた押圧効果はなく、長押ししなければ現れないことがわかります.だから、このButtonはクリックしていないが、実際にはクリックイベントがトリガーされているが、クリック効果がないだけだという感じがします.ほとんどの注意深い学生がこの問題を発見したと信じています.
好奇心のある人は原因を探究し、ネット上でも問題の原因と解決方法を提供しています.
UIsCrolViewのdelaysContentTouchesとcancencelContentTouchesプロパティ
tracking
UIsCrolViewには、ユーザーがコンテンツに触れてスクロールしようとしているかどうかを返すBOOLタイプのtrackingプロパティがあります.このプロパティから、UIscrollViewの動作原理を探ります.
UIScrollViewの内容に指を触れた瞬間、次のような動きが起こります.
Case 1:時間間隔で指が移動していることが検出されると、UIscrollView自身がスクロールをトリガし、tracking属性がNOとなり、指のタッチ下に(タッチイベントに応答できる)内部コントロールがあってもタッチイベントに応答しない.Case 2:時間間隔で指が移動していないことが検出された場合、tracking属性はYESのままであり、指が触れた場合(タッチイベントに応答できる)内部コントロールがあれば、タッチイベントをコントロールに渡して処理する.
delaysContentTouches
多くのニュースクラスのAppの上部にはスライドメニューバーがあり、主なモデルは1つのUIscrollViewに複数のUIButtonコントロールが含まれている可能性があります.
上記の動作原理には、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:メッセージをコンテンツコントロールに送信し、コントロールによって自行処理する.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