一.概述

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

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

UIScrollView入门与框架设计的更多相关文章

  1. nginx的入门到框架设计

    mac上安装nginx 安装与启动 安装 brew install nginx 命令 通过 Homebrew 下载的软件默认位置在 /usr/local/Cellar 应该ln-s 加连接就能全局 n ...

  2. 【ASP.NET Core快速入门】(六)配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnap ...

  3. 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计

    配置的热更新 什么是热更新:这个词听着有点熟悉,但到底是什么呢? 一般来说:创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOpti ...

  4. 一个入门rpc框架的学习

    一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通 ...

  5. Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍

    系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...

  6. 前端MVVM框架设计及实现

    最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的Avalon开始了,我2013年写过一个关于MVC MV ...

  7. 前端MVVM框架设计及实现(二)

    在前端MVVM框架设计及实现(一)中有一个博友提出一个看法: “html中使用mvvm徒增开发成本” 我想这位朋友要表达的意思应该是HTML定义了大量的语法标记,HTML中放入了太多的逻辑,从而增加了 ...

  8. JavaScript 框架设计

    JavaScript 高级框架设计 在现在,jQuery等框架已经非常完美,以致于常常忽略了JavaScript原生开发,但是这是非常重要的. 所以,我打算写一个简单的框架,两个目的 熟练框架的思想 ...

  9. JavaScript 框架设计(二)

    JavaScript 高级框架设计 (二) 上一篇,JavaScript高级框架设计(一)我们 实现了对tag标签的选择 下来我们实现对id的选择,即id选择器. 我们将上一篇的get命名为getTa ...

随机推荐

  1. mysql 存储过程:提供查询语句并返回查询执行影响的行数

    mysql 存储过程:提供查询语句并返回查询执行影响的行数DELIMITER $$ DROP PROCEDURE IF EXISTS `p_get_select_row_number`$$ CREAT ...

  2. swift 模式

    原文:http://www.cocoachina.com/newbie/basic/2014/0612/8800.html 模式(pattern)代表了单个值或者复合值的结构.比如,元组(1, 2)的 ...

  3. [RxJS] Stopping a Stream with TakeUntil

    Observables often need to be stopped before they are completed. This lesson shows how to use takeUnt ...

  4. 细说php(六) 数组

    一.数组概述 1.1 数组是复合类型 1.2 数组中能够存储随意长度的数据, 也能够存储随意类型的数据 二.数组的类型 2.1 索引数组: 下标是顺序整数作为索引 <?php $user[0] ...

  5. Java 装箱、拆箱 包装器

    先说java的基本数据类型.java基本数据类型:byte.short.int.long.float.double.char.boolean 基本数据类型的自动装箱(autoboxing).拆箱(un ...

  6. 诡异的SpriteKit 游戏查错

    在Endless Runner 游戏中,做了一些atlas后,发现有个问题,当player跳跃起来的时候,发现他没有动画了,被默认的X图片代替.原来的图像是这样的. 在增加了一些动画后,我的效果就成这 ...

  7. oc随笔二:组合、继承

    在oc中如果没有使用ARC的话,手动管理内存一定要注意处理好“野指针”,通常我们在释放指针的指向的地址时,都要将指针赋值为nil,这样能有效的防止野指针.常用的关键字:retain.assign .s ...

  8. C# Serializable学习

    先上代码,感觉这个功能很给力啊. class Program { static void Main(string[] args) { //下面代码将对象Person进行序列化并存储到一个文件中 Per ...

  9. js中数组的检测方法

    在js中可以使用Object.prototype.toString.call()的来检测一个对象是否为一个数组 //检测数组 var a = [1, 2]; console.log(typeof a) ...

  10. eclipse修改字体

    修改xml字体: window→Preferences→General→Colors and Fonts→Basic→Text Font