美文网首页iOS 之路
视图:重绘与 UIScrollView

视图:重绘与 UIScrollView

作者: 对歌当酒 | 来源:发表于2016-04-08 09:54 被阅读125次

    当用户触摸视图时,视图会收到 touchesBegan:withEvent: 消息,该消息用来处理触摸事件。

    产生一个随机的 UIColor 对象,示例代码:

    // 获取三个0到1之间的数字
    float red = (arc4random() % 100) / 100.0;
    float green = (arc4random() % 100) / 100.0;
    float blue = (arc4random() % 100) / 100.0;
    UIColor *randomColor = [UIColor colorWithRed:red
                                           green:green
                                            blue:blue
                                           alpha:1.0];
    self.circleColor = randomColor;
    
    • 运行循环和重绘视图

    iOS 应用启动时会开始一个运行循环 (run loop) 。运行循环的工作是监听事件,例如触摸。当事件发生时,运行循环会为相应的事件找到合适的处理方法,这些处理方法会调用其他方法,以此类推。只有当这些方法都执行完,控制权才会再次回到运行循环。

    此时,运行循环首先会检查是否有等待重绘的视图(即收到过 setNeedsDisplay 消息的视图),然后向所有等待重绘的视图发送 drawRect: 消息,最后绘制。

    以文本框输入为例,示意图如下:


    视图在运行循环中重绘自己

    iOS SDK 中提供的视图对象会自动在显示内容发生改变时向自身发送 setNeedsDisplay 消息,例如 UILabel。而自定义的 UIView 子类,则需手动向其发送 setNeedsDisplay 消息,示例代码如下:

    - (void)setCircleColor:(UIColor *)circleColor {
        _circleColor = circleColor;
        [self setNeedsDisplay];
    }
    

    这样再点击视图就可以看到颜色变化了。如图:


    颜色变了
    • 类扩展

    BNRHypnosisView.m 文件的顶部 (@implementation 之前 ) 添加的这三行代码,如下:

    @interface BNRHypnosisView ()
    @property (strong, nonatomic) UIColor *circleColor;
    @end
    

    称为 BNRHypnosisView 的类扩展。

    作用:声明只在类的内部使用的属性和方法。可以保持头文件简洁,避免内部实现细节的暴露。

    • UIScrollView

    UIScrollViewUIView 的子类,也可以使用 initWithFrame: 消息初始化,还可以作为子视图添加到其他视图。

    添加 UIScrollView 后的视图结构如图所示:

    加入 UIScrollView 后的视图层次结构

    设置分页:

    [scrollView setPagingEnabled:YES]; //分页显示
    

    若不设置分页,如果有多个对象时,可能出现如下效果(即屏幕同时显示多个视图的一部分):


    未设置分页效果

    分页实现原理:
    UIScrollView 对象会根据其 bounds 的尺寸将 contentSize 分割成多个尺寸相同的区域。拖动结束后,UIScrollView 实例会自动滚到并显示其中一个区域。

    代码地址:
    https://github.com/Ranch2014/iOSProgramming4ed/tree/master/05-RedrawingAndUIScrollView/Hypnosister

    《iOS编程(第4版)》 笔记

    相关文章

      网友评论

        本文标题:视图:重绘与 UIScrollView

        本文链接:https://www.haomeiwen.com/subject/jximlttx.html