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(开始的版本, 结束的版本, "建议");

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

  • 相关阅读:
    HDU 4472 Count DP题
    HDU 1878 欧拉回路 图论
    CSUST 1503 ZZ买衣服
    HDU 2085 核反应堆
    HDU 1029 Ignatius and the Princess IV
    UVa 11462 Age Sort
    UVa 11384
    UVa 11210
    LA 3401
    解决学一会儿累了的问题
  • 原文地址:https://www.cnblogs.com/objectc/p/5004953.html
Copyright © 2011-2022 走看看