1

私は画面全体をカバーするオーバーレイビューの下にあるscrollViewを持っています。このオーバーレイビューでは、私はミニビューを持っています。私は、オーバーレイビューにパンジェスチャを付けました。このパンジェスチャを上/下にドラッグすると、ミニビューの拡大/縮小がアニメーション化されます。私の目標は、scrollViewの一番下に到達したときに、別のスワイプを上向きにすると、overlayViewのパンジェスチャが呼び出され、miniViewの成長がアニメーション化されます。しかし、私がこの位置から下にスワイプすると、通常のようにスクロールビューをスクロールアップします。私の問題は、オーバレイビュー内でどのようにタッチを維持するか、スクロールビューに渡してスクロールすることができないことです。何らかの理由で関数にアクセスできるようにする必要があります。if文(scrollView.isAtCertainPoint & & swipeWasInCertainDirectionの場合)を使用して、scrollViewまたはoverlayViewに移動を渡すかどうかを選択します。ここに私のビュー階層は次のとおりです。
-parentビュー
-----オーバーレイビュー---------- ScrollView
---------ミニビュー(overlayViewのサブビュー)ScrollViewの上でオーバーレイビューにアタッチされたジェスチャー認識子?

私は、アプリのバブルを上向き/下向きにスワイプして再作成しようとしています。事前に感謝、私はどこにでも見てきましたが、解決策を見つけることができません。

答えて

1

私は自分の質問に対する答えを見つけました。これが最も効率的でクリーンな方法であるかどうかはわかりませんが、それが目的の効果を得るための唯一の方法でした。ここに私のソリューションです:私のoverlayViewでは、私は、これは基本的にビューは、私は一定の基準に基づいてuserInteractionを、持っている必要があるなら、私に言うことを許可され

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
    if miniView.frame.contains(point) || miniView.isOpen { 
     return true 
    } 
    //pass the tap onto other views 
    return false 
} 

overridded(タップは私のミニビューの中にあったかのミニビューが拡大していました) 。しかし、私が偽に戻ると、タッチが通過するようになります。このメソッドをオーバーライドしておらず、overlayViewにuserInteractionEnabledがあった場合、オーバーレイビューは文字通りすべてのタッチを食べます。このメソッドを使用すると、私はまだoverlayViewにuserInteractionEnabledを保持できますが、タッチがいつどこかに渡るべきかどうかを決めることができます。

次に、私のparentViewに、パンジェスチャーを追加しました。私はparentView UIGestureRecognizerDelegate作られており、この機能を実装:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
    //if the final page is the first page (i.e. the user only has one pic), then we don't want swiping that could interfere with the card swipe. 
    if let pan = gestureRecognizer as? UIPanGestureRecognizer { 
     let velocity = pan.velocity(in: self) 
     let isVertical = abs(velocity.x) < abs(velocity.y) 
     let isUpwards = getPanDirection(velocity: velocity) == .up 
     return (theBumbleScrollView.isAtFinalPage && isVertical && isUpwards) || theBumbleDetailView.isOpen 
    } 
    return true 
} 

これは、パンジェスチャが始まろうとしたとき、私は見ることができ、そして私が(trueまたはfalse)を返すものに応じて、それはに状態を変更します。パンジェスチャーのために.failed。基本的に、ジェスチャーをキャンセルします。 Limit UIView movement to only vertical or horizontal axis

私のパンジェスチャーは、指定された基準に従って失敗していましたが、自分のパンジェスチャーがあった場合、そのパンジェスチャーがパンになることをスクロールビューに伝える必要がありました。失敗しました。この便利なラインが入って来たところである(toFail:...を):必要と私は親ビューにパンジェスチャーを設定すると

let pan = UIPanGestureRecognizer(target: self, action: #selector(self.isPanning(pan:))) 
    pan.delegate = self 
    self.addGestureRecognizer(pan) 
    theScrollView.panGestureRecognizer.require(toFail: pan) 

、私は基本的に(自動的に建てられたリンゴ)、スクロールビューのパンジェスチャーを語りましたカスタムパンのジェスチャーが失敗した場合は、次の行に表示する必要があります。

これは私がscrollViewでスクロールすることを可能にする解決策でしたが、他の時には私のoverlayViewをスクロールできるようになりました。私は誰かを救うことができることを願います。誰かがサンプルコードを見たいのであれば、私のサンプルプロジェクトのgithubリポジトリ(ビューの名前は異なります)を作成しました。 https://github.com/danielchangsoojones/Bumble-App-Clone/tree/master

関連する問題