之前撸k线,k线视图作为一个子控件被放在了ScrollView上,由于k线有个左右滑动的手势,于是使用了UIPanGestureRecognizer,这导致了在K线上上下滑动时ScrollView没有任何相应,在交互上不太友好。
因此本内容主要是为了处理UIScrollView的子视图上添加UIPanGestureRecognizer后,导致上下滑动该子视图时UIScrollView无法跟随上下滚动的情况。
实现原理
新建UIPanGestureRecognizer
子类
重写- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
方法
在此方法中,根据手势方向处理手势的有效性。
核心代码
@implementation IXPanGestureRecognizer
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
if (_autoLock) {
_direction = IXPanDirectionAny;
_beginP = [[touches anyObject] locationInView:self.view];
}
}
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
if (!_autoLock && _direction != IXPanDirectionAny) return;
CGPoint nowPoint = [[touches anyObject] locationInView:self.view];
if (_direction == IXPanDirectionAny) {
if (fabs(nowPoint.x - _beginP.x) > fabs(nowPoint.y - _beginP.y)) {
_direction = IXPanDirectionHor;
} else {
_direction = IXPanDirectionVer;
self.state = UIGestureRecognizerStateFailed;
}
}
}
@end
如有疑问可查看demo