iOS应用开发中UIScrollView滚动视图的基本用法总结
在项目开发时遇到一个问题,我在UIViewController上面直接创建了一个UIScrollerView,把UIScrollerView作为一个子视图添加到了UIViewController,
又再UIScrollerView中添加了一个UISlider的组件,在手势滑动的过程中,很难滑动到UISlider这个控件,经常是滑动的时候UIScrollerView进行了滚动,
而UISlider这个控件没有滑动,让人很抓狂。
上网具体去了解了一下UIScrollerView的详解,终于彻底明白了问题出在哪里
下面引用一下前辈的总结,因为自己觉得没有他总结的详细
UIScrollView重载了hitTest方法,当手指touch的时候,UIScrollView会拦截所有event,然后等待150ms,在这段时间内,如果没有手指没有移动,当时间结束时,UIScrollView会发送trackingevent到子视图上,并且自身不滑动。在时间结束前,手指发生了移动,那么UIScrollView就会进行滑动,从而取消发送tracking。
看来是UIScrollView的问题。直接拖动UISlider,此时touch时间在150ms以内,UIScrollView会认为是拖动自己,从而拦截了event,导致UISlider接受不到滑动的event。但是只要按住UISlider一会再拖动,此时此时touch时间超过150ms,因此滑动的event会发送到UISlider上。
期间试过几种方法,只有一种可行,就是重写UIScrollView的hitTest方法:当滑动UISlider时,使UIScrollView不可滑动。
但是又出现了一个问题,我的UIScrollerView是直接继承了UIScrollerView,在UIViewController中是无法重写的UIScrollerView的hitTest方法的,所以需要重新创建一个view,继承UIScrollerView,然后再重写上述方法,然后再导入UIViewController中就可以轻松实现了。
下面来看一些UIScrollerView中一些比较常见的用法,说明都包含在注释中了:
-(void)viewDidLoad
{
[superviewDidLoad];
scrollView=[[UIScrollViewalloc]initWithFrame:CGRectMake(0,0,320,460)];
scrollView.backgroundColor=[UIColorredColor];
//是否支持滑动最顶端
// scrollView.scrollsToTop=NO;
scrollView.delegate=self;
//设置内容大小
scrollView.contentSize=CGSizeMake(320,460*10);
//是否反弹
// scrollView.bounces=NO;
//是否分页
// scrollView.pagingEnabled=YES;
//是否滚动
// scrollView.scrollEnabled=NO;
// scrollView.showsHorizontalScrollIndicator=NO;
//设置indicator风格
// scrollView.indicatorStyle=UIScrollViewIndicatorStyleWhite;
//设置内容的边缘和Indicators边缘
// scrollView.contentInset=UIEdgeInsetsMake(0,50,50,0);
// scrollView.scrollIndicatorInsets=UIEdgeInsetsMake(0,50,0,0);
//提示用户,Indicatorsflash
[scrollViewflashScrollIndicators];
//是否同时运动,lock
scrollView.directionalLockEnabled=YES;
[self.viewaddSubview:scrollView];
UILabel*label=[[UILabelalloc]initWithFrame:CGRectMake(0,200,320,40)];
label.backgroundColor=[UIColoryellowColor];
label.text=@"学习scrolleview";
[scrollViewaddSubview:label];
[labelrelease];
}
#pragmamark-
/*
//返回一个放大或者缩小的视图
-(UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView
{
}
//开始放大或者缩小
-(void)scrollViewWillBeginZooming:(UIScrollView*)scrollViewwithView:
(UIView*)view
{
}
//缩放结束时
-(void)scrollViewDidEndZooming:(UIScrollView*)scrollViewwithView:(UIView*)viewatScale:(float)scale
{
}
//视图已经放大或缩小
-(void)scrollViewDidZoom:(UIScrollView*)scrollView
{
NSLog(@"scrollViewDidScrollToTop");
}
*/
//是否支持滑动至顶部
-(BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView
{
returnYES;
}
//滑动到顶部时调用该方法
-(void)scrollViewDidScrollToTop:(UIScrollView*)scrollView
{
NSLog(@"scrollViewDidScrollToTop");
}
//scrollView已经滑动
-(void)scrollViewDidScroll:(UIScrollView*)scrollView
{
NSLog(@"scrollViewDidScroll");
}
//scrollView开始拖动
-(void)scrollViewWillBeginDragging:(UIScrollView*)scrollView
{
NSLog(@"scrollViewWillBeginDragging");
}
//scrollView结束拖动
-(void)scrollViewDidEndDragging:(UIScrollView*)scrollViewwillDecelerate:(BOOL)decelerate
{
NSLog(@"scrollViewDidEndDragging");
}
//scrollView开始减速(以下两个方法注意与以上两个方法加以区别)
-(void)scrollViewWillBeginDecelerating:(UIScrollView*)scrollView
{
NSLog(@"scrollViewWillBeginDecelerating");
}
//scrollview减速停止
-(void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
{
NSLog(@"scrollViewDidEndDecelerating");
}