IOS UI学习 ScrollView中Touch事件作用子视图

移动开发 iOS
本文介绍的是IOS UI学习,当多个视图进行叠加的时候,Touch事件是作用到最上面的视图上,详细内容来看本文介绍。

IOS UI学习 ScrollViewTouch事件作用子视图是本文要介绍对内容,我们知道当多个视图进行叠加的时候,touch事件是作用到最上面的视图上,但是如果父视图UIScrollView,如果默认,可能touch子视图会造成UIScrollView的滚动。

UIScrollView滚动的原因,可以看UIScrollView 原理,地址:http://www.cocoachina.com/bbs/read.php?tid-40965-page-1.html

我在这里简单的描述一下,UIScrollView的工作原理,当手指touch的时候,UIScrollView会拦截Event,会等待一段时间,在这段时间内,如果没有手指没有移动,当时间结束时,UIScrollView会发送tracking events到子视图上。在时间结束前,手指发生了移动,那么UIScrollView就会进行移动,从而取笑发送tracking。

那么,UIScrollView的子类想要接受touch事件,就是用户点击UIScrollView上的视图时,要先处理视图上的touch,而不发生滚动。这时候就需要UIScrollView的子类重载touchesShouldBegin:withEvent:inContentView: ,从而决定自己是否接受子视图中的touch事件。

上面都是理论的知识,下面看一个简单的例子:

外面红色是一个UIScrollView,黄色是在UIScrollView上添加的UIView。最后的效果是,当在黄色区域内touch时,touch事件会作用到UIView上,当touch红色区域时,整个视图上下滚动。下面是实现的过程。

一、创建工程,然后创建myScrollView,并且myScrollView继承自UIScrollView。

  1. #import <UIKit/UIKit.h> 
  2. @interface myScrollView : UIScrollView {   
  3. }  
  4. @end 

具体的实现:

  1. #import "myScrollView.h"  
  2.  
  3. #import "MyView.h"  
  4.  
  5. @implementation myScrollView  
  6.  
  7. - (id)initWithFrame:(CGRect)frame   
  8. {   
  9.     self = [super initWithFrame:frame];   
  10.     if (self) {   
  11.         [self setBackgroundColor:[UIColor redColor]];   
  12.           
  13.         MyView *myView=[[MyView alloc] initWithFrame:CGRectMake(1, 3, 100, 200)];   
  14.         [self addSubview:myView];   
  15.         [myView release];   
  16.     }   
  17.     return self;   
  18. }  
  19.  
  20. - (void)dealloc   
  21. {   
  22.     [super dealloc];   
  23. }  
  24.  
  25. - (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view   
  26. {   
  27.     NSLog(@"用户点击了scroll上的视图%@,是否开始滚动scroll",view);   
  28.     //返回yes 是不滚动 scroll 返回no 是滚动scroll   
  29.     return YES;   
  30. }   
  31. - (BOOL)touchesShouldCancelInContentView:(UIView *)view   
  32. {   
  33.     
  34.     NSLog(@"用户点击的视图 %@",view);   
  35.      
  36.     //NO scroll不可以滚动 YES scroll可以滚动   
  37.     return NO;   
  38. }   
  39. @end 

重写了- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view方法和- (BOOL)touchesShouldCancelInContentView:(UIView *)view方法。

其中(BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view,是用户点击黄色区域内,先触发这个方法,当返回YES时,touch事件作用到黄色视图上,当返回no时,红色可以上下滚动。

(BOOL)touchesShouldCancelInContentView:(UIView *)view是发送tracking前,先作用这个方法。

下面是点击黄的区域的日志:

2011-06-02 10:19:42.469 scrollTouch[38255:207] 用户点击了scroll上的视图<MyView: 0x4e26f90; frame = (1 3; 100 200); layer = <CALayer: 0x4e270a0>>,是否开始滚动scroll
2011-06-02 10:19:42.658 scrollTouch[38255:207] 用户点击的视图 <MyView: 0x4e26f90; frame = (1 3; 100 200); layer = <CALayer: 0x4e270a0>>

二、添加mySrollView到根视图上

  1. - (void)viewDidLoad   
  2. {   
  3.     [super viewDidLoad];   
  4.       
  5.     myScrollView *view=[[myScrollView alloc] initWithFrame:CGRectMake(10, 9, 300, 400)];   
  6.     [view setUserInteractionEnabled:YES];   
  7.     [view setScrollEnabled:YES];   
  8.       
  9.     //NO 发送滚动的通知 但是就算手指移动 scroll也不会动了 YES 发送通知 scroo可以移动   
  10.     [view setCanCancelContentTouches:YES];   
  11.     [view setBounces:NO];   
  12.     // NO 立即通知touchesShouldBegin:withEvent:inContentView 看是否滚动 scroll   
  13.     [view setDelaysContentTouches:NO];   
  14.     [view setContentSize:CGSizeMake(300, 900)];   
  15.     [self.view addSubview:view];   
  16.     [view release];   
  17. }  

三、MyView视图的实现

  1. #import "MyView.h"  
  2. @implementation MyView  
  3. - (id)initWithFrame:(CGRect)frame   
  4. {   
  5.     self = [super initWithFrame:frame];   
  6.     if (self) {   
  7.         [self setBackgroundColor:[UIColor yellowColor]];   
  8.     }   
  9.     return self;   
  10. }  
  11.  
  12. - (void)dealloc   
  13. {   
  14.     [super dealloc];   
  15. }  
  16. @end 

小结:IOS UI学习 ScrollViewTouch事件作用子视图的内容介绍我那了,希望本文对你有所帮助!

源代码:https://easymorse-iphone.googlecode.com/svn/trunk/scrollTouch/

本文来自:http://wangjun.easymorse.com/?p=1308

【编辑推荐】

  1. iOS学习笔记 多核编程和内存管理
  2. iOS学习之路 获取日期间隔方法
  3. iOS学习之路 窗口操作
  4. iOS 4.2支持HTML5新特性
  5. iOS开发 UIViewController内存管理

 

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-08-03 17:32:17

IOS UIScrollVi touch

2013-05-21 09:54:39

Web前端

2011-09-05 12:49:59

Sencha Touc事件

2011-08-17 10:09:25

iPhone开发UIWebViewTouch事件

2014-10-15 10:09:12

iOS 8Touch ID开发

2013-04-24 11:15:56

Android开发Touch事件传递机制

2015-07-08 16:46:05

iOS键盘

2011-05-11 10:28:03

2011-08-22 10:49:42

Cocos2d 开发CCLayerTouch事件

2013-06-14 13:50:28

iOS开发移动开发警告视图

2011-04-02 17:21:29

sql server视图

2014-10-13 09:57:31

SwiftTouch ID验证iOS 8

2011-10-26 10:32:05

Sencha Touc数据视图

2011-06-15 16:11:51

UIKitCocoa TouchiOS

2011-06-27 15:39:51

Cocoa Touch

2013-04-24 11:11:20

Android开发touch事件发生传递

2019-12-04 14:30:43

事件日志Windows 10Windows

2017-01-04 10:18:00

React NativScrollViewAndroid

2011-05-31 15:41:00

Cocoa TouchCocoaiOS

2013-03-29 11:06:24

iOS开发滚动视图UIScrol
点赞
收藏

51CTO技术栈公众号