转载

UIKit 框架之<UIScrollView>

前言

github: https://github.com/xfxfxf

简书: http://www.jianshu.com/p/305b88e79586

之前翻译了一下 raywenderlich 的文章,考虑到是用 Swift 写的,准备到了年底再完完整整的翻译一下,现在的主流还是 OC,等苹果真正稳定了 Swift 以后,那时再详解一下。

UIKit 框架里面的几个视图非常重要, UIScrollViewUITableViewUICollectionView 都是很常用。因为功能强大,所以很多朋友都会弄混淆一些概念,那么这篇文章就先从 UIScrollView 着手,全面剖析里面的各种属性和方法,这样用起来就会得心应手。

由于本篇是概括性文章,一定程度上引用了他人的文章,在此感谢原作者!

来源: http://blog.csdn.net/ch_soft/article/details/6947695/

图解篇

UIKit 框架之&lt;UIScrollView&gt;

contenSize
顾名思义,表示内容的宽和高,从图上也能清晰的看到,就是表示一张图的宽和高。

contentInset
这个就是在 contentSize 外面加的白色的部分,图上看的清清楚楚。

UIKit 框架之&lt;UIScrollView&gt;

contentOffset
这个属性是是个 CGPoint 类型,表示现在视图上看到的那个点,距离图片真实原点的位置。

UIKit 框架之&lt;UIScrollView&gt;

因为 contentOffset 的那个点不是从 contentInset 的原点开始的,所以如果滑动到如图上所示的位置,于是就有了负值。

理论篇

在滚动的过程中,实际上就是 contentOffset 的值在不断变化,当手指触摸后, UIScrollView 会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件,那么 UIScrollView 发送 tracking events 到被点击的 subview 上面。如果在计时器到点前发生了移动事件,那么 UIScrollView 取消 tracking 然后自己发生滚动。

可以重载子类

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view;

决定自己是否接受 touch 事件

- (BOOL)touchesShouldCancelInContentView:(UIView *)view;

开始发送 tracking messages 给 subview 的时候调用这个方法,决定是否发送 tracking messages 消息到 subview。

返回 NO -> 发送,表示不取消

返回 YES -> 不发送,表示会取消

属性篇

@property(nonatomic,readonly,getter=isTracking)     BOOL tracking;

当 touch 后还没有拖动的时候值是 YES ,否则 NO

@property(nonatomic,readonly,getter=isZoomBouncing)  BOOL zoomBouncing;

当内容放大到最大或者最小的时候值是 YES ,否则 NO

@property(nonatomic,readonly,getter=isZooming)       BOOL zooming;

当正在缩放的时候值是 YES ,否则 NO

@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;

当滚动后,手指放开但是还在继续滚动中。这个时候是 YES ,其他时候是 NO

@property(nonatomic)         CGFloat                      decelerationRate

设置手指放开后的减速率

@property(nonatomic) CGFloat maximumZoomScale;

表示放大的最大倍数

@property(nonatomic) CGFloat minimumZoomScale;

表示缩小的最小倍数

@property(nonatomic,getter=isPagingEnabled) BOOL          pagingEnabled;

当值为 YES 的时候,就会产生翻页那种效果

@property(nonatomic,getter=isScrollEnabled) BOOL          scrollEnabled;

决定是否可以滚动

@property(nonatomic) BOOL delaysContentTouches;

当值为 YES 的时候,用户一旦触碰,然后再一定时间内没有移动, UIScrollView 会发送 tracking events,然后用户移动手指足够长度触发滚动事件,这个时候, UIScrollView 发送了 -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 到 subview,然后 UIScrollView 开始滚动。假如值为 NOUIScrollView 发送 tracking events 后,就算用户移动手指, UIScrollView 也不会滚动。

@property(nonatomic)         BOOL                         showsHorizontalScrollIndicator;

滚动时是否显示水平滚动条

@property(nonatomic)         BOOL                         showsVerticalScrollIndicator;

滚动时是否显示垂直滚动条

@property(nonatomic)         BOOL                         bounces;

默认是 YES ,就是滚动超过边界会有反弹回来的效果,如果设置为 NO ,那么滚动到边界就会立刻停止

@property(nonatomic) BOOL  bouncesZoom;

这个效果反映在缩放上面,如果缩放超过最大缩放,就会有反弹效果,加入设置为 NO ,则达到最大或者最小的时候立刻停止

@property(nonatomic,getter=isDirectionalLockEnabled) BOOL directionalLockEnabled;

默认是 NO ,可以在垂直和水平方向同时运动。当值为 YES 的时候,加入一开始是垂直或者水平运动,那么接下来会锁定另外一个方向的滚动。加入一开始是对角方向滚动,则不会禁止某个方向

@property(nonatomic)         UIScrollViewIndicatorStyle   indicatorStyle;

滚动条的样式,基本只是设置颜色

@property(nonatomic)         UIEdgeInsets                 scrollIndicatorInsets;

设置滚动条的位置

方法篇

直接上代码看

#pragma mark UIScrollViewDelegate //只要滚动了就会触发 - (void)scrollViewDidScroll:(UIScrollView *)scrollView;  { //  NSLog(@" scrollViewDidScroll");   NSLog(@"ContentOffset  x is  %f,yis %f",scrollView.contentOffset.x,scrollView.contentOffset.y); } //开始拖拽视图 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;  {  NSLog(@"scrollViewWillBeginDragging"); } //完成拖拽 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;  {  NSLog(@"scrollViewDidEndDragging"); } //将开始降速时 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;  {  NSLog(@"scrollViewWillBeginDecelerating"); } //减速停止了时执行,手触摸时执行 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;  {  NSLog(@"scrollViewDidEndDecelerating"); } //滚动动画停止时执行,代码改变时出发,也就是setContentOffset改变时 - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; {  NSLog(@"scrollViewDidEndScrollingAnimation"); } //设置放大缩小的视图,要是uiscrollview的subview - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;  {  NSLog(@"viewForZoomingInScrollView");   return viewA; } //完成放大缩小时调用 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale;  {   viewA.frame=CGRectMake(50,0,100,400);  NSLog(@"scale between minimum and maximum. called after any 'bounce' animations"); }// scale between minimum and maximum. called after any 'bounce' animations //如果你不是完全滚动到滚轴视图的顶部,你可以轻点状态栏,那个可视的滚轴视图会一直滚动到顶部,那是默认行为,你可以通过该方法返回NO来关闭它 - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;  {   NSLog(@"scrollViewShouldScrollToTop");  returnYES; } - (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;    {   NSLog(@"scrollViewDidScrollToTop"); } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {  // Return YES for supported orientations   return (interfaceOrientation == UIInterfaceOrientationPortrait); } @end 

总结

对于 UIScrollView 的详解,不仅是一个总结,也是一个回顾,只有很清楚了其中的各种细节以后,将来自己写第三方库的时候也能写出很漂亮的代码来。

正文到此结束
Loading...