UIScrollViewの中でスクロールをキャンセルする方法
-
23-08-2019 - |
質問
私は、iPhone上の大型(320PXより大きい)UIを作るためにUIScrollViewのを使用します。
私はUIScrollViewのインスタンスを作り、その上にいくつかのサブビューを追加しました。 問題は、私は、ユーザーがサブビューの外に触れたときにのみスクロール可能にしたいということです ユーザーはサブビューの1触れたときにスクロールを停止します。
私は文書を読み、サンプルを見つけることを試みたが、私は良いヒントを見つけることができません。 あなたが任意のアイデアを持っている場合は、私を助けてくださいます。
解決
、あなたはUIScrollViewのサブクラスをし、特にこの目的のために作成されtouchesShouldBegin
とtouchesShouldCancelInContentView
メソッドをオーバーライドする必要があります。
この他にも、UIScrollViewのは、すべてのタッチ自体を処理する傾向があり、そのサブビューに渡していないとして、あなたがサブビューにタッチを識別できる方法はありません。
すべての最高ます。
他のヒント
UIScrollViewのは、あなたがプログラム的にスクロールを無効にすることができます。のscrollEnabled のプロパティがあります。また、あなたがそのような開始/終了のスクロールなどのイベントを見ることができますデリゲート(UIScrollViewDelegate)を持っています。あなたには、いくつかの方法で組み合わせて、それらのオプションで何かを調理することができるはずと思われます。
プロパティあなたが本当に興味を持っている - と私はあなたが同じ問題を抱えているので、私は実際に、今これをテストしていますが - canCancelContentTouches
です。
このプロパティの値はNOである場合には、 スクロールビューがスクロールしません かかわらず、指の動きの一回 コンテンツビューは、追跡を開始します。
これは、あなたが望む結果を与えるサブクラスUIScrollViewのと受け入れ答えが示唆するものであるtouchesShouldBegin:withEvent:inContentView
メソッドをオーバーライドしない場合ます。
これを実行する最も簡単な方法はscrollviewためdelayContentTouches
するNO
に設定されています。 Uicontrolのあるものはすぐにスクロールする他andeverything Controlにタッチを渡すようにその方法は、デフォルトの動作が設定されます。
またUIScrollViewControllerをsublcassとtouchesBegan、touchesMovedとtouchesEndedメソッドをオーバーライドすることができます。あなたの実装は、スーパークラスの実装を呼び出すことがない場合、それはスクロールしません。
私の問題は、ユーザーが描けるという見解を持っていたが、スクロールビューは、タッチをハイジャックし、図面の代わりにスクロールされました。これは私の実用的なソリューションです。
私の図面ビューで私が持っています:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// Disable scroll on touch begin
setContainerScrollingEnabled(false)
super.touchesBegan(touches, with: event)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
// Reenable scroll on touch end
setContainerScrollingEnabled(true)
super.touchesEnded(touches, with: event)
}
private func setContainerScrollingEnabled(_ enabled: Bool) {
// loop up superviews to find the scrollview
func scrollingSuperview(of view: UIView) -> UIScrollView? {
guard let superview = view.superview else { return nil }
if let scrolling = view.superview as? UIScrollView { return scrolling }
return scrollingSuperview(of: superview)
}
// and switch on/off scrolling
let scrollView = scrollingSuperview(of: self)
scrollView?.isScrollEnabled = enabled
}
と私がスクロールビューを含むビューコントローラ内
// Not sure what exactly this does, but I think it allows the drawing view to have precedence. This was the missing piece of the puzzle.
scrollView.delaysContentTouches = false