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

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

原文地址:https://www.cnblogs.com/objectc/p/5004953.html