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"); }