我有一个覆盖整个屏幕的覆盖视图下方的scrollView。在这个叠加视图中,我有一个迷你视图。我已经将一个平移手势附加到overlayView,当向上/向下拖动此平移手势时,它会激活迷你视图的增长/缩小。我的目标是,当我到达scrollView的底部时,如果我再向上滑动,它会调用overlayView的平移手势来为miniView的增长设置动画。但是,如果我从这个位置向下滑动,那么它会像往常一样向上滚动滚动视图。我的问题是我无法弄清楚如何在我的覆盖视图中保持触摸,或者将它们传递给scrollView,它可以正常滚动。我需要以某种方式访问一个函数,它允许我使用if语句(如果scrollView.isAtCertainPoint&&> swipeWasInCertainDirection),然后选择是否将运动传递给scrollView或overlayView。这是我的观点层次结构:
- 父亲的看法
-----叠加视图---------- ScrollView
---------迷你视图(overlayView的子视图)
我正在尝试重新创建应用程序Bumble的向上/向下滑动,如果这有用的话。在此先感谢,我一直在寻找,但似乎无法找到解决方案。
答案 0 :(得分:1)
好吧,我找到了自己问题的答案。不确定这是否是最有效/最干净的方法,但这是获得所需效果的唯一方法。这是我的解决方案:在我的overlayView中,我覆盖了
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
}
这基本上允许我说视图是否应该有userInteraction,我基于某些标准(点击是在我的miniView或miniView放大)。但是,当我返回false时,它会让触摸通过。如果您没有覆盖此方法并且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
}
这让我可以看到平移手势即将开始的时间,并且取决于我返回的内容(真或假),它会将状态更改为.failed for pan手势。基本上,取消它的手势。这是一个有用的Stack OverFlow帖子:Limit UIView movement to only vertical or horizontal axis
现在,根据我指定的标准,我的平移手势失败,但我需要告诉我的scrollView,如果我的自定义平移手势失败,它的平移手势可能会平移。这就是这个方便的线路需要(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 repo(视图名称不同),如果有人想看到示例代码。 https://github.com/danielchangsoojones/Bumble-App-Clone/tree/master