UIScrollView
UIScrollView对滑动和缩放提供原生支持,API使用也非常方便
最简单的用法
只要初始化UIScrollView,然后设置contentSize,再放入subview,就可以了。例:
UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:rect]; scroll.contentSize = CGSizeMake(width, height); [scroll addSubview: subview];
为什么内容无法滚动
在so和各种论坛上最常见的问题,就是为什么ScrollView无法滚动,一般都是因为没有设置contentSize,或者contentSize比UIScrollView自身的bound更小
基本上可以这么理解:UIScrollView是一个容器,其中放了subview。如果contentSize比UIScrollView的 size还要小,那么不需要滚动就能一屏显示全,所以就不会产生滚动条。实际上,滚动的不是UIScrollView自己,而是它所容纳的subview
为什么drawRect中用CoreGraphics画的图形无法滚动
简单来说,因为滚动的并不是UIScrollView,而是它的content view也就是subview。如果CoreGraphics直接画在UIScrollView上就不能滚动,而是要画在subview上
下面是一个错误的例子片段:
@interface LosLineChart : UIScrollView @end @implementation -(void) drawRect { UILabel *label; [self addSubview:label]; CGContextRef context = UIGraphicsGetCurrentContext(); CGContextMoveToPoint(context, anchorPoint.x, anchorPoint.y); CGContextAddLineToPoint(context, anchorPoint.x, anchorPoint.y + maxHeight); CGContextStrokePath(context); } @end
上面的代码,LosLineChart自身就是ScrollView的实例,然后label是它的subview,因此label是可滚动的。而直线是直接画在LosLineChart上的,所以无法滚动
正确的做法应该是:
UIScrollView *scroll; LosLineChart *chart; scroll.contentSize = CGSizeMake(width, height); [scroll addSubview:chart];
LosLineChart本身不是ScrollView,而是放进ScrollView里,这样用CG画的图形,也就可以滚动了。总之就是记住一句话:滚动的不是UIScrollView,而是它的subview