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

原文地址:https://www.cnblogs.com/allanliu/p/4254066.html