一.概述

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. 深入了解Json转变为map的思想,附源代码2

    最近在做一个投票情况的用例,返回的结果打算放到JSON中 数据库的结果集如上图所示:optionkey代表选项,optionval代表其值 第一次做的时候考虑应该键值对应的关系,所以前台接到的json ...

  2. matlab遗传算法

    function [xv,fv] = myGA(fitness, a, b, NP, NG, Pc, Pm, eps) % 用遗传算法求解一维无约束优化问题 % % 待优化的目标函数 fitness ...

  3. Performance Tuning guide 翻译 || 前言

    CSDN 对格式支持比較弱,能够到http://user.qzone.qq.com/88285879/blog/1399382878 看一致的内容. 前言Preface 包含例如以下几个小节 l Au ...

  4. js将日期格式的时候转换成时间搓

    自己写的一个方法 function split_time(time){//将当前时间转换成时间搓  例如2013-09-11 12:12:12   var arr=time.split(" ...

  5. Sonar入门(五):使用 Sonar 进行代码质量管理

    Sonar 概述 Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具. 与持续集成工具(例如 Hudson/Jenkins ...

  6. 【剑指offer】左旋转字符串

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27366485 题目描写叙述: 汇编语言中有一种移位指令叫做循环左移(ROL),如今有个简单 ...

  7. Android服务Service总结

    转自 http://blog.csdn.net/liuhe688/article/details/6874378 富貴必從勤苦得,男兒須讀五車書.唐.杜甫<柏學士茅屋> 作为程序员的我们, ...

  8. [转]iOS hybrid App 的实现原理及性能监测

    转自:http://www.cocoachina.com/ios/20151118/14270.html iOS hybrid App 的实现原理及性能监测 2015-11-18 11:39 编辑:  ...

  9. FileZilla 安装配置参考

    http://www.admin10000.com/document/72.html 解决 NAT issue https://wiki.filezilla-project.org/Network_C ...

  10. C#中public、private、protected、internal、protected internal (转载)

    在C#语言中,共有五种访问修饰符:public.private.protected.internal.protected internal.作用范围如下表:访问修饰符 说明public 公有访问.不受 ...