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(开始的版本, 结束的版本, "建议");
这个一般用在版本更新的时候, 如果相关方法觉得不好用, 用新的接口进行代替的时候, 提示使用者.
UIScrollView入门与框架设计的更多相关文章
- nginx的入门到框架设计
mac上安装nginx 安装与启动 安装 brew install nginx 命令 通过 Homebrew 下载的软件默认位置在 /usr/local/Cellar 应该ln-s 加连接就能全局 n ...
- 【ASP.NET Core快速入门】(六)配置的热更新、配置的框架设计
配置的热更新 什么是热更新:一般来说,我们创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOptions改成IOptionsSnap ...
- 菜鸟入门【ASP.NET Core】6:配置的热更新、配置的框架设计
配置的热更新 什么是热更新:这个词听着有点熟悉,但到底是什么呢? 一般来说:创建的项目都无法做到热更新:即项目无需重启,修改配置文件后读取到的信息就是修改配置之后的 我们只需要吧项目中用到的IOpti ...
- 一个入门rpc框架的学习
一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通 ...
- Android基础-系统架构分析,环境搭建,下载Android Studio,AndroidDevTools,Git使用教程,Github入门,界面设计介绍
系统架构分析 Android体系结构 安卓结构有四大层,五个部分,Android分四层为: 应用层(Applications),应用框架层(Application Framework),系统运行层(L ...
- 前端MVVM框架设计及实现
最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的Avalon开始了,我2013年写过一个关于MVC MV ...
- 前端MVVM框架设计及实现(二)
在前端MVVM框架设计及实现(一)中有一个博友提出一个看法: “html中使用mvvm徒增开发成本” 我想这位朋友要表达的意思应该是HTML定义了大量的语法标记,HTML中放入了太多的逻辑,从而增加了 ...
- JavaScript 框架设计
JavaScript 高级框架设计 在现在,jQuery等框架已经非常完美,以致于常常忽略了JavaScript原生开发,但是这是非常重要的. 所以,我打算写一个简单的框架,两个目的 熟练框架的思想 ...
- JavaScript 框架设计(二)
JavaScript 高级框架设计 (二) 上一篇,JavaScript高级框架设计(一)我们 实现了对tag标签的选择 下来我们实现对id的选择,即id选择器. 我们将上一篇的get命名为getTa ...
随机推荐
- c语言结构体4之结构体引用
struct mystruct{ char str[23];}; 1结构体变量不能整体引用 struct data m: printf("%s",m);//m是结构体变量 2 st ...
- Annotation(一)——注解开发介绍
<p>在编程中,一直强调的一点就是注释的编写,注释的规范等等.尤其是越是核心,程序越复杂,逻辑越多的清空下,注释的编写对我们以后的阅读代码,维护软件起着至关重要的作用.一款软件有着好的注释 ...
- 详细介绍如何使用kindEditor编辑器
今天群里的朋友问我能不能写个kindEditor编辑器的使用教程,说是弄了半天没有搞定.由于PHP啦后台正好用了这个编辑器,我有写经验,正好教他的同时写出来分享给大家. kindEditor编辑器是一 ...
- iOS学习之 plist文件的读写
在做iOS开发时,经经常使用到到plist文件, 那plist文件是什么呢? 它全名是:Property List,属性列表文件,它是一种用来存储串行化后的对象的文件.属性列表文件的扩展名为.pli ...
- QT5 r 加入qwtplot3d 三维库
qwtplot3d是基于QtOpenGL开发的,也是qwt库的三维库,我使用的是qwtplot3d-0.2.7.zip版本. 步骤跟编译qwt库一样(不明白可以看回前面写的一篇文章“Q ...
- dataset导出成excel
之前网上查找了很多关于这类的代码.要不是中文乱码,要不是就是太复杂.这个是我用过最好用的. //ds为数据源,filename为保存的文件名 publicvoidCreateExcel(DataSet ...
- WinForm窗体设置
属性: 软件启动后在屏幕中间 StartPosition = CenterScreen取消放大按钮 MaximizeBox = false不能拖动边框 FormBorderStyle = FixedD ...
- Ado.net对象
Connection对象主要提供与数据库的连接功能 Command 对象用于返回数据,修改数据,运行存储过程以及发送或检索参数信息的数据库命令. DataReader对象通过Command对象提供从数 ...
- EasyUI layout动态设置Split属性
switch (rowData.ISREGISTERTASK) { case 0: 显示north分割线 $('#RightContent').la ...
- Geodatabase - 创建要素类.
在NET中,会遇到以“_2”结尾的属性,这些属性是可写的. 以下代码在已有工作空间下,创建一个新的点要素类: //例如,personalDBPath=@"G:\doc\gis\1.400\d ...