IOS View编程指南笔记

2024-09-06 00:48
文章标签 笔记 编程 ios 指南 view

本文主要是介绍IOS View编程指南笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们所看到的程序

对于一切IOS APP来说,我们看的的内容,都是UIView所呈现的。

UIView如场景,UIWindow如舞台,UIView粉墨登场在UIWindow这个舞台上,使我们看到丰富多彩的界面UI。UIWindow本身没有任何内容,它只提供了一个场所来让这些UIView来显示,切换。

通常,一个APP仅有一个UIWindow作为显示的场所,当我们要进行多屏显示时,才会使用到多个UIWindow。

UIView的基本结构

1、UIView附着于UIWindow上,只有放在UIWindow上的View,才能被我们看到。

2、UIView本身又可作为容器显示并管理SubView,使界面更丰富。

3、每个UIView都有一个对应的Core Animation Layer类对象作支持。Layer类对象一般是CALayer类对象。该对象存储对应UIView对象的一些信息数据,并处理UIView的动画操作。

有了CALayer对象,主要会提供如下几点作用:

(1)CALayer对象存储了对应UIView对象的信息数据,这可以使UIView的渲染次数大大减少,我们可以尽可能的直接读取CALayer对象里面的存储的已经渲染过的数据,而不需要每次都要渲染UIView。

(2)正是因为CALayer对象存储了UIView的信息,才使得UIView的当前内容可以被操作,进而实现UIView的动画效果。

(3)我们可以通过直接操作CALayer对象来实现更丰富灵活的显示及动画效果。

UIWindow, UIView, Core Animation Layer对象关系如下图所示:


View的等级及SubView的管理

如前所述,UIView可以添加子View,进而形成superView,subView这样的父子逻辑关系。

subView被父View放到一个子View队列里面进行管理。

view显示的层级关系

最后加入的view会遮挡前面的view。

事件响应链(Event responder chain

当App获取到用户的操作事件后,会首先将该event传递给发生该事件最上层的subview,若该subview不响应该事件,则会传递至该view的superview进行响应,这样一直传递下去,直到该事件被响应或由程序丢弃不处理为止。这就是所谓的Event responder chain。


View的内容绘制周期

在IOS中,UIView类采取一种按需策略来绘制View的显示内容。所谓按需策略,就是指仅当你明确告知系统需要对View进行内容重绘时,系统才会调用你的绘制函数重新绘制VIew的内容,否则,系统在大多数情况下仅使用View的内容快照图片来代替View的内容显示。

具体实现如下:

1、当一个View第一次显示在屏幕时,系统会自动调用View的绘制函数,完成内容显示,同时,为内容保留一份快照图片。

2、若View的内容不发生改变,则在大多数情况下,系统仅使用快照图片来表示View内容。这里注意,系统不会主动询问是否View的内容发生了改变,需要你主动通知系统内容发生改变从而更新View显示内容。

3、当你对View的内容做出了改变,调用

 setNeedsDisplay or setNeedsDisplayInRect:

方法通知系统内容发生改变,需要重绘View界面。

4、系统得知内容发生改变后,不会立即重绘View界面,而是当这轮run loop结束,准备重绘内容时,才会对改变内容的View进行重绘。

5、当系统对View进行重绘时,流程并不是统一的。对于自定义的View而言,我们需要重写

drawRect: 方法。

当然,也可以通过直接改变View对应的Layer对象的方式来改变View的内容。

6、当系统完成对View的重绘后,会采集一张新的内容快照来代表View的内容来用作多数时间的View显示。

注意,一般的View的几何形变(如拉伸缩小,不会引起内容重绘,而仅仅是内容快照的拉伸缩小)。


View的内容模式

如前所述,当View显示在屏幕上后,系统会用一张快照来代替表示内容。

这会照成这么一种情况,当我们更改View的frame等属性时,其内容(内容快照),并不一定会同时改变。对于内容显示的方式,取决于UIView对象的Content Modes.默认的系统会采取UIViewContentModeScaleToFill模式,使内容快照拉伸填充满整个View区域。Content Mode的几个形式如下图:



注意,当设置了View的ContentMode后,每一次View的几何形变都会引起系统调用View的drawRect:方法来重绘View,因此应当避免使用该属性,同时对于系统View,我们绝不应该用属性。

View的坐标系统

IOS系统的坐标系统如下所示:



UIWindow, UIView都有自己的坐标系统。对于UIView常用的属性Frame,Bound,Center其属性是相对于不同坐标系统的。具体如下:

A view object tracks its size and location using its framebounds, and center properties:

  • The frame property contains the frame rectangle, which specifies the size and location of the view in its superview’s coordinate system. 

  • The bounds property contains the bounds rectangle, which specifies the size of the view (and its content origin) in the view’s own local coordinate system. 

  • The center property contains the known center point of the view in the superview’s coordinate system.

总结一下,就是view的frame,center属性其坐标系统均是对于其superview的坐标系统来说的。而bounds属性,则是对其自己的坐标系统来说的。

Frame, Center, Bounds的相互关系
Frame,Center都是相对view的superview坐标系统来说的,所以可以用作subview在superview中的定位与大小。对于位移运动,推荐改变Center属性来实现,因为Frame属性在一些变形中是不存在的。
Frame,Center,Bounds互相影响着对方,具体如下:
  • When you set the frame property, the size value in the bounds property changes to match the new size of the frame rectangle. The value in the center property similarly changes to match the new center point of the frame rectangle.

  • When you set the center property, the origin value in the frame changes accordingly.

  • When you set the size of the bounds property, the size value in the frame property changes to match the new size of the bounds rectangle.

View的Runtime交互模型

我们可以通过触摸等动作,和view进行实时的交互。
IOS系统中,用户动作与View的交互模型大致如下:
1、用户触摸屏幕,该事件硬件识别,并被发给了UIKit Framework。
2、该触摸事件被UIKit Framework包装成UIEvent类对象,并发给对应的事件响应View。
3、在事件响应View中,我们可以通过对应的函数,来捕获到当前的UIEvent事件(手势识别机制或重写touch系列响应函数)。
4、在View中我们自定义代码做出响应,如:
  • 调用setNeedsLayout 方法,让系统重新布局(即让系统在下一轮更新过程中,主动调用我们重写的layoutSubviews 
  • 调用 setNeedsDisplay or setNeedsDisplayInRect: 方法,让系统对View内容进行重绘。(即让系统在下一轮内容更新过程中,主动调用我们重写的drawRect: )函数。
  • 更改UIView的属性,或通知某个controller对象。

关于View使用的Tips

Apple官方对View的使用做出若干建议,个人感觉比较重要的摘要如下:
1、尽量设置View的Opaque属性为YES。当View的Opaque属性设置为YES时,UIKit框架就不会在去检查View后面是否有可以渲染的东西(因为你已经明确说明该View是不透明的),提高UIKit框架渲染速度。
2、不要在已有的UIControlr对象中添加subview。我们对于UIControl对象的使用,应该尽量保持原生态。虽然对UIControl添加自己的subview技术是可行的,但这么做是危险的。因为当Apple更新版本时,UIControl对象的实现细节可能会改变,而导致我们添加了subview的程序运行失败。

参考资料:
Apple官方文档
View Programming Guide for iOS
https://developer.apple.com/library/prerelease/ios/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW16



这篇关于IOS View编程指南笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140530

相关文章

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow