CCScrollLayer的触摸区域的裁剪与控制
(转载注明出处,谢谢:http://www.cnblogs.com/binxindoudou/archive/2013/03/28/2986587.html:)
最近再做一个项目的时候,遇到了一个麻烦事,我需要使用CCScrollLayer(Cocos2d的一个扩展类),但是这个类没有对需要触摸的区域进行裁剪,默认的触摸区域是全屏,所以这就导致了一个麻烦,就是,我只想触摸一个很窄的一个区域才可以实现滑动,其他地方滑动无效果,如下示例图:
然而从网上下载的CCScrollLayer并未对触摸区进行控制与裁剪。
我就网上找各种资料,找到了两种方法,下面就介绍下这两种方法。
第一种方法是从百度空间上有为叫“收音机”的大神得到的,从ScrollView得到了启发,使用OpenGL API对触摸区进行了裁剪,只留下了上图中绿色的区域,这样下面区域滑动就无法响应了。但事实上,这种方法我学了之后,发现并不可以使用,因为OpenGL已经丢弃了glClipPlanef的方法,所以我没有成功,也没找到解决方案,但是原理上是可以行的通的。我把这篇文章转载过来了,大家可以看看这篇文章,或许会成功,如果成功了,希望交流下。http://www.cnblogs.com/binxindoudou/articles/2982906.html
第二种方法是从国外的一个论坛上受到的启发,这个方法我做成功了,而且也挺简单。他说是如果让下面区域滑动无效果的话,就设置一个触摸响应范围,在范围内才可以响应事件,这样,其他你不想滑动的地方是不检测手势的,也就实现了局部滑动滚屏。
现在我将修改的步骤介绍下,供大家参考。
.h文件的修改
第一步,添加一个触摸控制区域的变量和属性
1 @interface CCScrollLayer : CCLayer 2 { 3 …… 4 5 //添加触控区域的变量 6 CGRect touchRangArea_; 7 8 …… 9 } 10 11 //添加触控区域的属性 12 @property (readwrite,assign) CGRect touchRangArea;
第二步,修改两个函数,这两个函数分别用于对外使用的类方法和初始化滚动层。主要是将需要控制的区域初始化到滚动层中。
1 +(id) nodeWithLayers:(NSArray *)layers widthOffset: (int) widthOffset withRangArea:(CGRect)aArea; 2 3 -(id) initWithLayers:(NSArray *)layers widthOffset: (int) widthOffset withRangArea:(CGRect)aArea;
.m文件的修改
第三步,就是将.h文件中修改的变量 属性 方法 对应的.m中的实现进行修改
1 …… 2 3 //属性实现 4 @synthesize touchRangArea = touchRangArea_; 5 6 …… 7 8 9 …… 10 //类方法 11 +(id) nodeWithLayers:(NSArray *)layers widthOffset: (int) widthOffset withRangArea:(CGRect)aArea 12 { 13 return [[[self alloc] initWithLayers: layers widthOffset:widthOffset withRangArea:aArea] autorelease]; 14 } 15 16 //初始化方法 17 -(id) initWithLayers:(NSArray *)layers widthOffset: (int) widthOffset withRangArea:(CGRect)aArea 18 { 19 if ( (self = [super init]) ) 20 { 21 …… 22 23 touchRangArea_ = aArea; 24 25 …… 26 } 27 return self; 28 } 29 30 …… 31 32
第四步,使用触摸域,对触控范围进行修改
1 -(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event 2 { 3 CGPoint touchPoint = [touch locationInView:[touch view]]; 4 touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint]; 5 //判断是否在范围内,不在范围内,不响应该事件 6 if(!CGRectContainsPoint(touchRangArea_,touchPoint)) 7 { 8 return NO; 9 } 10 11 …… 12 } 13 14 15 //同理 16 - (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event 17 { 18 CGPoint touchPoint = [touch locationInView:[touch view]]; 19 touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint]; 20 //判断是否在范围内,不在范围内,不响应该事件 21 if(!CGRectContainsPoint(touchRangArea_,touchPoint)) 22 { 23 return ; 24 } 25 26 …… 27 } 28 29 //同理 30 - (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event 31 { 32 CGPoint touchPoint = [touch locationInView:[touch view]]; 33 touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint]; 34 //判断是否在范围内,不在范围内,不响应该事件 35 if(!CGRectContainsPoint(touchRangArea_,touchPoint)) 36 { 37 return ; 38 } 39 40 …… 41 }
经过这样修改后,CCScrollLayer类就可以实现我的需求了,只有上部可以滑动,下部不响应了。
希望可以帮到大家,如果有好的想法,可以留言交流啊。
(转载注明出处,谢谢:http://www.cnblogs.com/binxindoudou/archive/2013/03/28/2986587.html:)