簡體   English   中英

如何防止傳遞給UIView的超級視圖的觸摸事件?

[英]how to prevent a touch event passed to a UIView's superview?

我制作了一個程序,其中包含可以拖動以在屏幕上移動的圖片。 我也使用UIScrollView,因為空間大於窗口。 我將UIView子類化為圖片視圖,以顯示圖片並處理此類中的觸摸。 圖片視圖作為子視圖添加到scrollView。 但現在我遇到了一個問題:當我拖動圖片時,scrollView會與圖片一起移動。 我想知道是否有辦法消耗圖片類中的觸摸以防止它們傳遞給superview。

您應該將代碼放在UIView的“touchesMoved:withEvent:”方法中。 如果您的View將自己處理此事件,那么它不應該冒泡到superview

冰風的上述評論解決了這個問題:

您可以嘗試在UIScrollView中將canCancelContentTouches設置為NO。 並在你的UIView中使用圖像設置exclusiveTouch為YES - 冰風3月7日14:22

我知道這是一個老問題,但我有一個類似的問題和批准的答案(在滾動視圖canCancelContentTouches設置為false ,在子視圖中將isExclusiveTouchtrue )對我不起作用。

經過一些實驗,我發現在我的子視圖中簡單地覆蓋gestureRecognizerShouldBegin(_:)以返回false解決了問題:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}

為什么你使用UIScrollView 您擁有自己的滾動圖片視圖,因此無需使用UIScrollView來處理滾動觸摸輸入。

換句話說,為什么你使用自己的滾動圖片視圖? UIScrollView將處理滾動的情況,所以你可以在UIScrollView下放置一個UIImageView ,除非你自己的視圖有一些其他的行為,但是你可以UIImageViewUIView而不需要你自己滾動圖片,因為你知道UIScrollView會做它適合你。

您需要子類UIScrollView並覆蓋touchesShouldCancel

override func touchesShouldCancel(in view: UIView) -> Bool {
    return !(view is MyView) // or whatever your check is
}

作為獎勵,您可能需要scrollView.delaysContentTouches = false以便在自定義控件上進行即時響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM