好吧,我想出答案我自己的问题。不知道这是否是最有效/最干净的方式,但它是获得理想效果的唯一方法。这里是我的解决办法:在我OverlayView的,我overridded
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
}
这基本上让我说,如果认为应该有用户交互,这是我在一定的标准基础(水龙头是我MiniView中内部或MiniView中已扩大) 。但是,当我返回错误时,它会让触摸通过。如果您没有覆盖此方法,并且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),这将改变状态。失败的平底锅手势。基本上,取消它的手势。这是一个有用的Stack OverFlow post: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)
当我设置的移动手势到父视图,我主要讲述滚动视图的平移手势(其中苹果内置的自动)如果自定义平移手势失败,它应该在下一行。
。那是让我有时滚动滚动视图我但有时能在我OverlayView的滚动解决方案。希望我能在解决这个问题的那一天拯救某个人。如果有人希望看到示例代码,我还创建了我的示例项目(视图名称不同)的github repo。 https://github.com/danielchangsoojones/Bumble-App-Clone/tree/master