zoukankan      html  css  js  c++  java
  • UIScrollView入门与框架设计

    一.概述

    1.UIScrollView的contentSize, contentOffSet, contentInsets的作用和使用.

    2.UIScrollView的一整个滚动过程的生命周期(开始滚动, 正在滚动, 结束滚动, 惯性减速结束滚动).

    3.ScrollView的缩放

    4.分页控件的基本实现和封装实现

    二.核心

    2.1 contentOffSet与contentInsets

    contentOffSet

    作用:

    contentOffSet指的是内容的左上角和UIScrollView的左上角的差值(偏移量).其中向下为Y, 向右为X的偏移量.(也就是说是UIScrollView控件的偏移位置)

    至于是正是负.主要看的是内容相对于ScrollView滚动的方向.一开始内容左上角和ScrollView的左上角是重叠的.而在使用过程中, 向上和向右滚动是不可能的, 因为一这样滚动, 就看不到ScrollView就有不在内容里的部分, 只要ScrollView左上角不在内容里, 那么其偏移量就是负.

    contentInsets

    作用:这个属性十分重要, 主要是要在当UIScollView的内容被某些控件遮挡住的时候使用.

    使用:这个时候可以让内容向下滚, 也就是contentOffSet的Y值为负.接着设置contentInsets就是内容的外边距.(额外的滚动范围).为正的.这时候这部分额外的滚动访问就会顶住, 使内容不会回弹.从而实现了不被某些控件遮挡的效果.

    2.2 UIScorllView滚动的过程生命周期

    Tips: 初步理解代理

    作用:

    代理就是用在当控件发生了某些事情, 但是自己不想做监听来处理, 把这些事情交给控件(对象)的代理去处理.代理对象可以是任意对象, 谁都可以来做这个控件的代理, 但是要遵守代理协议, 其目的主要是, 为了方便敲出对应的监听方法, 实现这些监听方法, 并且称为改控件的代理对象, 就可以监听控件的行为.

    代理方法的规范:

    1.代理方法一般是以控件名为开头, 如UIScollView的代理方法, 都是scrollViewXX.UITableView的代理方法, 都是tableViewXXX.这是一种约定俗成的规范

    2.代理对象必须是weak或者assign

    滚动过程

    手指开始拖拽: willBeginDragging
    正在滚动: didScroll, 也会在代码设置setContentSet时候调用
    手指结束拖拽: DidEndDragging:willDecelerate
    惯性停止滚动: DidEndDecelerating:

    2.3 掌握ScrollView的缩放

    Tips: option按键 加鼠标可以在模拟器中进行缩放.

    缩放监听

    所要缩放控件的监听比较特殊, 不是以ScrollView开头.

    决定要缩放的内容: viewForZoomingInScrollView:

    返回的控件只能是UIScrollView内的子控件.因为缩放的内容只能是UIScollView内的内容.

    缩放的生命周期

    开始缩放: WillBeginZooming
    正在缩放: DidZoom
    结束缩放: DidEndZooming:withView:atScale

    2.4 分页控件的实现和封装

    分页控件:

    基本思路: 根据需求, 创建N个UIImageView进行控件的显示.接着将其添加到UIScrollView当中, 并且UIImageView的宽高就是UIScrollView的宽高.接着开启UIScrollView的pageEnabled属性就可以进行分页.

    优化思路:图片要用到时候再去加载, 而不是一下子加载N个ImageView.并且我们一开始只创建3个ImageView. 当3个ImageView拖到最左边, 将最左边的时候.将最左边的显示到最右边.

    引导页控件的实现:

    引导页控件的实现十分简单, 就是利用UIScrollView.此时的UIScrollView是占据一整个屏幕, 接着再开启UIScrollView的pageEnabled属性, 开启后当你进行scrollView的拖拽, 其会以ScrollView的大小自动切割每一页的宽高.

    核心技术:

    layoutSubviews的调用时刻

    layoutSubviews的调用时刻, 当控件尺寸改变的时候是其中一种比较经典的调用, 当然还有其它时刻, 但并不是当frame一改变就调用, 而是在消息循环(runloop)的时候才调用, 没做一次循环检查一边UI界面的修改, 如界面颜色的修改,frame的变化, 在这个循环检查结束后, 才一口气将所有的东西渲染上去, 把UI修改掉, 所以layoutSubviews并不是马上调用.如果尺寸一样就不会调用

    消息循环结束时刻:

    1.只要是同一个方法的, 就是处在同一个消息循环中, 不太可能说每个方法可一个消息循环

    2.类似于点击按钮的一些UI事件, 点完后消息循环就结束了, 因为它要马上最响应.

    加载xib(initWithFrame, initWithCoder, awakeFromNib的区别)

    加载xib只能通过loadNibXXX这种方式加载.不能通过alloc , init.后者除非是控制器, 对xib不适用.xib创建控件的方式, 本质上是调用initWithCoder(awakeFromNib, awakeFromNib在initWithCoder调用完后调用, 但是它在SB或xib中都能调用, 要对子控件做初始化操作, 最好是在awakeFromNib中做, 因为initWithCoder中还在解析子控件)而不是initWithFrame.

    Tips:

    1.NS_DEPRECATED_IOS(开始的版本, 结束的版本, "建议");

    这个一般用在版本更新的时候, 如果相关方法觉得不好用, 用新的接口进行代替的时候, 提示使用者.

  • 相关阅读:
    八、总结
    第5章、Kafka监控
    十一、总结
    十、图形化的客户端和监控工具
    九、zookeeper四字监控命令
    八、zookeeper 开源客户端curator介绍
    七、Zookeeper原理
    六、zookeeper 事件监听机制
    五、zookeeper的javaApi
    四、zookeeper的Acl权限控制
  • 原文地址:https://www.cnblogs.com/objectc/p/5004953.html
Copyright © 2011-2022 走看看