侧边栏,在很多时候都会用到
在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;
}