首页 > 代码库 > UIScrollView

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

UIScrollView