侧边栏,在很多时候都会用到
在iOS7 的系统里,系统的导航控制器自带一个边缘侧滑的手势,目的就是为了用户体验?至少我自己使用觉得相当不错。。。
好吧,言归正传,因为这个手势的出现,原本的侧边栏,左划右划随便整,出了这个手势又不想干掉这个手势有很多设计就都改成只在主页可以随便划,子页是右侧边。
恩,没错,本人搞好不巧写了个这样的侧边栏,感觉效果一般。发现了一些手势冲突问题,特地记录一下。
就像之前写的一篇博文里说的处理手势冲突的问题,当时使用的是scrollView的代理方法来解决的。
这次遇到是tableView的手势与侧滑手势的冲突。
说道这,需要了解下手势基类的几个代理方法:
这个参数就是手势本身,返回值是返回是否生效。此方法在gesture recognizer视图转出UIGestureRecognizerStatePossible状态时调用,如果返回NO,则转换到UIGestureRecognizerStateFailed;如果返回YES,则继续识别触摸序列.(默认情况下为YES)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
这个方法返回值是用来表示手势是否共存的。只要返回YES,另外就不用管了,因为共存,所以共存,共同响应.也就是说两个gesture recognizers的delegate方法只要任意一个返回YES,则这两个就可以同时识别;只有两个都返回NO的时候,才是互斥的。默认情况下是返回NO。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
这个两个成对的方法比较有趣,一个是前面失效后面生效,另外一个相反。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
这个说明来看看API
// called before touchesBegan:withEvent: is called on the gesture recognizer for a new touch. return NO to prevent the gesture recognizer from seeing this touch
意思就是在toucheBegan这个方法之前,也就是在手势状态为began之前?
- 此方法在window对象在有触摸事件发生时,调用gesture recognizer的touchesBegan:withEvent:方法之前调用,如果返回NO,则gesture recognizer不会看到此触摸事件。(默认情况下为YES).
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
一个简单的用法。配合共存代理方法来使用。
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer
{
UIView *cell = [gestureRecognizer view];
CGPoint translation = [gestureRecognizer translationInView:[cell superview]];
// Check for horizontal gesture
if (fabsf(translation.x) > fabsf(translation.y))
{
return YES;
}
下次继续。
return NO;
}
——————————————————————————————————我是愉快的分割线—————————————————————————————————
应莎爷要求,来点图文混排吧
简单说说,这是一个viewController上有tableView的控制器,我给他添加一个pan手势。看代码:
恩,添加手势到tableView上面了。就是这么简单,so easy。
好,来区分下手,分别看看以下手势代理方法:
这两个代理的执行顺序也是像上面的那样,在shouldBegin代理中,去判断是否是当前手势,然后取对应的坐标点,比较,犹豫我是右侧边栏,于是就分别着是否展开来判断这个手势要不要。顺便对tableView的pan的手势进行禁用,为啥禁用,因为需求是如此,否者你可以把整个屏幕侧滑。。。
之后的这个代理方法比较关键,返回yes,让手势共存。
剩下的就跟普通的手势一样处理了。
其实这里可以自己写枚举来做事的,但是既然手势有state的枚举,那么正好轻松来处理。
这图看的我自己都蛋疼,太大了。。。好了,贴完收工,目前来说木有发现逻辑BUG问题,或者各种侧滑奇葩效果,稳定性还不错。
就这样了,方法干啥的基本上都说过了。至于里面的实现根据需求吧。莎爷,您满意否