UIScrollView,点击、滑动翻页事件的区分以及如何直接获取UIScrollView上的点击事件
2014-05-14 01:01
447 查看
转:/article/9655048.html
最近看到有人问这个问题:在UIScrollView上添加了一个View,View上面有图片等元素,需要对单击和滑动事件进行区分。这样的问题有以下几个经常会用到的地方:
(1)点击UIScrollView上的图片,跳转到其他页面;同时不影响UIScrollView的滑动操作。
(2)在阅读浏览类产品会经常用到,点击屏幕的中间区域,隐藏/显示状态栏或导航条;同时不影响UIScrollView的滑动翻页操作。
有解决方法事在点击区域添加一个透明的Button,但个人感觉比较复杂,而且效果并不好。以下是我个人的解决方法:
首先了解下UIScrollView对于touch事件的接收处理原理:UIScrollView重载hitTest 方法,并总会返回itself 。所以所有的touch 事件都会进入到它自己里面去了。内部的touch事件检测到这个事件是不是和自己相关的,或者处理或者除递给内部的view。
为了检测touch是处理还是传递,UIScrollView当touch产生一个timer。
(1)如果150ms内touch未产生移动,它就把这个事件传递给内部view;
(2)如果150ms内touch产生移动,开始scrolling,不会传递给内部的view。(如当你touch一个table时候,直接scrolling,你touch的那行永远不会highlight。)
(3)如果150ms内touch未产生移动并且UIScrollView开始传递内部的view事件,但是移动足够远的话,且canCancelContentTouches = YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling。(如当你touch一个table, 停止了一会,然后开始scrolling,那一行就首先被highlight,但是随后就不在高亮了)
先前提到的在UIScrollView内部的view点击区域添加透明Button的解决方法,就是需要设置canCancelContentTouches = YES,而且还需重写UIScrollView的touchesShouldCancelInContentView:(UIView *)view方法,在view为UIButton的时候,返回YES。不然点击到button上的事件已经被button接收了,无法cancle掉。另外针对阅读浏览页面,一般手指都会停留在UIScrollView滚动,如果需要隐藏/显示状态栏或导航条,则会出现每点击一次就出现隐藏/显示问题。
解决方法:该问题主要的难题要判断单击事件。由于150ms很小,因此基本上手指一接触到UIScrollView就会传递到内部的view上,此时内部的view需对这个touch进行时间节点的判断,判断它是一个单击事件,然后执行单击操作。
1、TestView是ScrollView的subview,也可也是继承UIScrollView
TestView.h
[c-sharp]
view plaincopy
@interface TestView : UIView
{
UIImageView *imageView;
NSTimeInterval touchTimer; //记录touch时间,来控制点击和滑动判断
}
@property(nonatomic, retain) UIImageView *imageView;
@property(nonatomic, assign) NSTimeInterval touchTimer;
TestView.m
[c-sharp]
view plaincopy
@implementation TestView
#pragma mark -
#pragma mark Touch Method
@synthesize imageView;
@synthesize touchTimer;
//thouchesBegan 获取到touch的时间点
- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
self.touchTimer = [touch timestamp];
}
//touchesEnded,touch事件完成,根据此时时间点获取到touch事件的总时间,
- (void)touchesEnded:(NSSet *)touches
withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
self.touchTimer = [touch timestamp] - self.touchTimer;
NSUInteger tapCount = [touch tapCount];
CGPoint touchPoint = [touch locationInView:self];
//判断单击事件,touch时间和touch的区域
if (tapCount == 1 && self.touchTimer <= 3 && CGRectContainsPoint(self.imageView.frame, touchPoint))
{
//进行单击的跳转等事件
}
}
解决UIScrollView截获touch事件的一个极其简单有效的办法
当UIScrollView将touch事件截获时,我们可以要写个UIScrollView的类别,把事件从UIScrollView传出去!
然后重写nextResponder的touch方法就可以了。
最近看到有人问这个问题:在UIScrollView上添加了一个View,View上面有图片等元素,需要对单击和滑动事件进行区分。这样的问题有以下几个经常会用到的地方:
(1)点击UIScrollView上的图片,跳转到其他页面;同时不影响UIScrollView的滑动操作。
(2)在阅读浏览类产品会经常用到,点击屏幕的中间区域,隐藏/显示状态栏或导航条;同时不影响UIScrollView的滑动翻页操作。
有解决方法事在点击区域添加一个透明的Button,但个人感觉比较复杂,而且效果并不好。以下是我个人的解决方法:
首先了解下UIScrollView对于touch事件的接收处理原理:UIScrollView重载hitTest 方法,并总会返回itself 。所以所有的touch 事件都会进入到它自己里面去了。内部的touch事件检测到这个事件是不是和自己相关的,或者处理或者除递给内部的view。
为了检测touch是处理还是传递,UIScrollView当touch产生一个timer。
(1)如果150ms内touch未产生移动,它就把这个事件传递给内部view;
(2)如果150ms内touch产生移动,开始scrolling,不会传递给内部的view。(如当你touch一个table时候,直接scrolling,你touch的那行永远不会highlight。)
(3)如果150ms内touch未产生移动并且UIScrollView开始传递内部的view事件,但是移动足够远的话,且canCancelContentTouches = YES,UIScrollView会调用touchesCancelled方法,cancel掉内部view的事件响应,并开始scrolling。(如当你touch一个table, 停止了一会,然后开始scrolling,那一行就首先被highlight,但是随后就不在高亮了)
先前提到的在UIScrollView内部的view点击区域添加透明Button的解决方法,就是需要设置canCancelContentTouches = YES,而且还需重写UIScrollView的touchesShouldCancelInContentView:(UIView *)view方法,在view为UIButton的时候,返回YES。不然点击到button上的事件已经被button接收了,无法cancle掉。另外针对阅读浏览页面,一般手指都会停留在UIScrollView滚动,如果需要隐藏/显示状态栏或导航条,则会出现每点击一次就出现隐藏/显示问题。
解决方法:该问题主要的难题要判断单击事件。由于150ms很小,因此基本上手指一接触到UIScrollView就会传递到内部的view上,此时内部的view需对这个touch进行时间节点的判断,判断它是一个单击事件,然后执行单击操作。
1、TestView是ScrollView的subview,也可也是继承UIScrollView
TestView.h
[c-sharp]
view plaincopy
@interface TestView : UIView
{
UIImageView *imageView;
NSTimeInterval touchTimer; //记录touch时间,来控制点击和滑动判断
}
@property(nonatomic, retain) UIImageView *imageView;
@property(nonatomic, assign) NSTimeInterval touchTimer;
TestView.m
[c-sharp]
view plaincopy
@implementation TestView
#pragma mark -
#pragma mark Touch Method
@synthesize imageView;
@synthesize touchTimer;
//thouchesBegan 获取到touch的时间点
- (void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
self.touchTimer = [touch timestamp];
}
//touchesEnded,touch事件完成,根据此时时间点获取到touch事件的总时间,
- (void)touchesEnded:(NSSet *)touches
withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
self.touchTimer = [touch timestamp] - self.touchTimer;
NSUInteger tapCount = [touch tapCount];
CGPoint touchPoint = [touch locationInView:self];
//判断单击事件,touch时间和touch的区域
if (tapCount == 1 && self.touchTimer <= 3 && CGRectContainsPoint(self.imageView.frame, touchPoint))
{
//进行单击的跳转等事件
}
}
解决UIScrollView截获touch事件的一个极其简单有效的办法
当UIScrollView将touch事件截获时,我们可以要写个UIScrollView的类别,把事件从UIScrollView传出去!
@implementation UIScrollView (UITouch) - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { if(!self.isDragging) { [[self nextResponder] touchesBegan:touches withEvent:event]; } [super touchesBegan:touches withEvent:event]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { if(!self.isDragging) { [[self nextResponder] touchesMoved:touches withEvent:event]; } [super touchesMoved:touches withEvent:event]; } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if(!self.isDragging) { [[self nextResponder] touchesEnded:touches withEvent:event]; } [super touchesEnded:touches withEvent:event]; } @end
然后重写nextResponder的touch方法就可以了。
相关文章推荐
- UIScrollView,点击、滑动翻页事件的区分
- UIScrollView,点击、滑动翻页事件的区分
- UIScrollView,点击、滑动翻页事件的区分
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 如何监听UIimageview的点击事件以及如何控制UIimageview显示圆形
- QTableView区分鼠标点击事件的左键和右键以及QSortFilterProxyModel重新排序的问题
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 如何为一个按钮(View)设置任意多次点击事件以及可以同时响应多个多次点击事件
- iOS WebView 如何通过js获取网页中所有图片并加入点击事件,实现浏览图片的功能
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击
- 自定义ViewGroup (支持margin,gravity以及水平,垂直排列,滑动和点击事件)
- 如何解决UIScrollView中添加UITapGestureRecognizer跟UIButton点击事件冲突
- 如何解决UIScrollView把UITableViewCell的点击事件屏蔽
- 进击的KFC:iOS WebView 如何通过js获取网页中所有图片并加入点击事件,实现浏览图片的功能
- TextView如何给其中的某一段文字添加点击事件?
- 传递UIScrollView的滑动事件到其子视图中
- 转自原文地址:IOS UIScrollview UIImageView点击事件处理
- 如何获取ie窗口中用户点击最小化事件?