UIScrollView滚动的原因,可以看UIScrollView 原理。
我在这里简单的描述一下,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。
#import <UIKit/UIKit.h>
@interface myScrollView : UIScrollView {
}@end
具体的实现:
#import "myScrollView.h"
#import "MyView.h"
@implementation myScrollView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setBackgroundColor:[UIColor redColor]];
MyView *myView=[[MyView alloc] initWithFrame:CGRectMake(1, 3, 100, 200)];
[self addSubview:myView];
[myView release];
}
return self;
}- (void)dealloc
{
[super dealloc];
}- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view
{
NSLog(@"用户点击了scroll上的视图%@,是否开始滚动scroll",view);
//返回yes 是不滚动 scroll 返回no 是滚动scroll
return YES;
}
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
NSLog(@"用户点击的视图 %@",view);
//NO scroll不可以滚动 YES scroll可以滚动
return NO;
}
@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到根视图上:
- (void)viewDidLoad
{
[super viewDidLoad];
myScrollView *view=[[myScrollView alloc] initWithFrame:CGRectMake(10, 9, 300, 400)];
[view setUserInteractionEnabled:YES];
[view setScrollEnabled:YES];
//NO 发送滚动的通知 但是就算手指移动 scroll也不会动了 YES 发送通知 scroo可以移动
[view setCanCancelContentTouches:YES];
[view setBounces:NO];
// NO 立即通知touchesShouldBegin:withEvent:inContentView 看是否滚动 scroll
[view setDelaysContentTouches:NO];
[view setContentSize:CGSizeMake(300, 900)];
[self.view addSubview:view];
[view release];
}
三、MyView视图的实现。
#import "MyView.h"
@implementation MyView
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setBackgroundColor:[UIColor yellowColor]];
}
return self;
}- (void)dealloc
{
[super dealloc];
}@end
from:http://wangjun.easymorse.com/?p=1308
相关推荐
UIScrollView代理触摸实现_图片缩放UIScrollView代理触摸实现_图片缩放
UIScrollView 原理 iOS开发
iOS:UIScrollView实现轮播,UIScrollView实现轮播,UIScrollView实现轮播
UIScrollView 响应touchEvent事件。 UIScollView的move与touchMove共存。
UIScrollView、UIScrollView基本用法、UIScrollView详解,UIScrollView常用方法
IOS UIScrollView + UIButton 实现页面和顶部标签页水平滚动效果,可以运用到实际项目中
UIScrollView不能响应UITouch事件的解决办法,原因是:UIView的touch事件被UIScrollView捕获了。 解决办法:让UIScrollView将事件传递过去。于是最简单的解决办法就是加一个UIScrollView的category。这样每个用到...
BHSwapBack-UIScrollView 您可以在scrollview滚动时向后滑动视图控制器 地方看到蓬勃发展的gif 知道手势原理就这么简单
该Demo是UIScrollView和UIWebView结合EGO实现下拉刷新的demo
少scrollview版的自动轮播图,同时可以手动滑动,左右循环滚动。
uiscrollview加载图片时非常占用内存,对scrollview进行优化使其能使用tabview的重用机制
自定义view,实现UIScrollView自动滚动和手动滚动的结合
UIScrollView使用在故事板中使用自动布局来实现滚动, 这个demo是垂直方向的滚动 相关介绍在 http://blog.csdn.net/h1101723183/article/details/41895479
只有到达有边缘的时候,才滑动,如一个屏幕显示4个,只有第一个跟第四个会触发滑动效果,从左往右点击,第四个变回第一个,从右往...他们本身所在的区域块是可左右滑动的。代码实现简单,逻辑清楚,可以学习并尝试自己实现
一个列表demo,底部是个scrollView,上面放了四个tableView, 可通过上方四个Button控制显示那个按钮;也可以左右滑动切换tableView,上方红线联动。
Xib中使用UIScrollView的AutolayoutDemo。主要思路:給scrollView添加一个contentView,设置contentView的top ,left,right,bottom的约束与scrollView为0,再设置contentView水平居中,然后设置contentView的高度约束...
对应这种页面结构应该毫无疑问是最底层是一个纵向滚动的scrollView,它的页面上面放一个固定高度的header,紧接着下面一个支持横向滚动切换的容器scrollView,容器上面才是各个页面具体的tableView,如下图: ...
本Deno用scrollView很简单的实现了图片的无限循环滚动,且支持pageControl.zip
利用AutoLayout对UiScrollView进行布局,实现简单的引导页。
所用控件:UIScrollView、UIPageControl。实现页面视图滚动缩放效果。