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:)

posted @ 2013-03-28 13:50  bxddno1  阅读(707)  评论(0编辑  收藏  举报