UIView基础介绍

官网文档:

  • View programming Guide for iOS
  • UIView Class Reference [常用属性和方法]
  • UIKit User Interface Catalog

UIView简介

UIView 算得上是iOS中就基础重要的显示控件,大部分控件都是基于其而来,它具有展示、响应、动画等基础特点,也是自定义的基础控件的最佳选择。

UIView无法响应点击事件情况:

  • 透明度小于0.001
  • 视图被影藏
  • 用户交互被设置为false

Frame/bounds/center的理解

绝对坐标系:屏幕的左上角是坐标原点(0,0);横向为X轴,纵向为Y轴;向左边移动X值减小,向右边移动X值增加;向下边移动Y值增加,向上边移动Y值减小;

每个视图的起始位置和大小由Frame来确定,frame是一个CGRect类型的属性,CGRect是一个结构体,里面有两个变量origin和size,其中origin是一个CGPoint点,指的是视图左上角的那个点的位置,决定了视图的位置;size是CGSize类型的,决定了视图的大小;

Frame:视图在其父视图坐标系中的位置和大小,建议大家在控件初始化之后,紧接着就去设置Frame,设置完成后,假如涉及到修改控件的位置、大小等,就需要再去修改Frame;

Bounds:视图在其自己的坐标系中的位置和大小。Bounds属性中,视图的bounds.origin始终是(0,0),因此bounds属性最核心的作用是设置视图的大小,即bounds.size,当需要去修改视图大小的时候,可以修改bounds.size;

Center:视图中心点在父视图坐标系中的坐标,当需要修改视图对象的位置时,可以修改Center属性。

坐标系转换:[传送门]

视图的变形【transform】

相关知识点参考开发文档CGAffineTransformReference

在开发过程中,经常需要对视图对象的样式进行修改,常见的修改操作有位移、放大/缩小、旋转等。当涉及到视图位移的时候,可以修改视图的center以及frame属性;当涉及到视图的缩放以及旋转操作时,推荐修改视图的transform属性

1、位移

当需要修改视图对象的位置时(上移、下移、左移、右移),可以通过修改视图对象的center和frame属性。提示,point由x和y构成。该方法沿固定x轴或者y轴移动

第二中位移方法是沿初始移动边方向移动,比如发生旋转后移动方向将变换。

使用方法:public func CGAffineTransformTranslate(t:CGAffineTransform, _ tx: CGFloat, _ ty: CGFloat) -> CGAffineTransform

2. 放大和缩小【scate:比例、放大】

第一种方法可以修改视图对象的bounds.size属性,第二种方法是直接修改视图对象的transform【变形】属性

利用方法:public func CGAffineTransformScale(t:CGAffineTransform(放大对象【myView.transform】), _ sx: CGFloat(放大或缩小比例), _ sy: CGFloat) -> CGAffineTransform

3、旋转【rotate:旋转】

通过修改视图对象的transform属性,可以实现视图的顺时针旋转以及逆时针旋转,此时需要使用到如下函数,其中,angle属性是旋转的角度。

利用方法:public func CGAffineTransformRotate(t:CGAffineTransform, _ angle: CGFloat) -> CGAffineTransform

4、重置transform属性

当需要重置transform属性时,可以进行如下设置。但要注意的是:假如需要完全重置一个视图的样式,除了重置transform属性之外,还需要重置frame, center, bounds。

myView.transform=CGAffineTransformIdentity

视图的层次与构成

图层的处理有代码和IB两种方法,最好不要混搭使用,这里我选择用IB处理图层,有一个总原则,后产生的视图层在最外层 。

常用属性和方法:

    public var superview: UIView? { get }//父视图public var subviews: [UIView] { get }//所有子视图public var window: UIWindow? { get }//视图所在Windowpublic func removeFromSuperview()public func insertSubview(view: UIView, atIndex index: Int)public func exchangeSubviewAtIndex(index1: Int, withSubviewAtIndex index2: Int)public func addSubview(view: UIView)public func insertSubview(view: UIView, belowSubview siblingSubview: UIView)public func insertSubview(view: UIView, aboveSubview siblingSubview: UIView)public func bringSubviewToFront(view: UIView)public func sendSubviewToBack(view: UIView)public func didAddSubview(subview: UIView)public func willRemoveSubview(subview: UIView)public func willMoveToSuperview(newSuperview: UIView?)public func didMoveToSuperview()public func willMoveToWindow(newWindow: UIWindow?)public func didMoveToWindow()public func isDescendantOfView(view: UIView) -> Bool // returns YES for self.public func viewWithTag(tag: Int) -> UIView? // recursive search. includes self// Allows you to perform layout before the drawing cycle happens. -layoutIfNeeded forces layout earlypublic func setNeedsLayout()public func layoutIfNeeded()public func layoutSubviews() //

视图的动画

1.哪些属性可以采用动画?只要是可以修改变化的属性大都可以用动画,动画效果对系统资源消耗不是很高。

2.实现动画播放的方法类CAAnimation Class Reference

视图响应用户交换事件

相关文档:UIGestureRecognizer Calss Reference

1、相关属性

UIView类中,userInteractionEnabled属性可以用来定义视图类对象是否能够响应用户点击。对于某些UIView的子类,例如UILabel,UIImageView,该属性默认情况下是关闭的,因此如果需要响应手势等交互事件,需要修改该属性的值为YES。

另外,multipleTouchEnabled属性用于设置视图对象能否支持多点触控,默认情况下,其取值是NO。这些都是可以再IB中设置的

2、添加手势【gesture:手势  recognize:识别】

对于视图类对象,都可以通过添加手势的方法,来响应用户的交互。一个视图类对象,可以添加多个手势。例如,在一些游戏App中,一个按钮的点击以及长按可以对应不同的操作。UIView类中,与手势相关的属性和方法如下:

public var gestureRecognizers: [UIGestureRecognizer]?//交互手势个数

public funcaddGestureRecognizer(gestureRecognizer: UIGestureRecognizer)//添加交互手势

public funcremoveGestureRecognizer(gestureRecognizer: UIGestureRecognizer)//移除手势

添加手势响应的步骤

1.创建一个交互手势对象,一般使用UIGestureRecognizer的子类,自行查看

创建对象时注意,要实现Selecto方法(及产生交互之后的处理)【可能会遇到的问题:selector访问权问题】,targe一般为自身

2、再将对象添加手势

3、自定义视图类实现touches系列方法

由于UIView继承自UIResponder,因此UIView也同时具有UIResponder的属性和方法。在UIResponder类的定义中,提供了一些响应用户点击操作的方法,如下所示。在自定义视图类中,如果需要响应用户的点击操作,也可以通过重写这些方法来实现用户交互。

需要特别注意的一点是:视图类能够响应用户交互的范围,一定不能超出视图frame所划定的区域,大家可以做一个测试:在父视图中再添加一个更大的子视图,点击超出父视图的范围,看看是否可以调用touchesBegan:方法。

内容模式(contentMode)

凡事带有Scanle的图片都会拉伸

凡事带有Aspect的,图片都会保持原来的宽高比,图片不会变形

scaleAspectFit:图片拉伸完全显示在View中(可能变形)

显示图片时,最好视图大小与图片大小一致,达到不失真,进行比例拉伸。

图片拉伸

Xcode中提供了Slicing功能专门用来裁剪图片。通过Slicing功能,可以设置固定不需要拉伸的区域,以及需要拉伸的区域。这个功能是针对图片的设置,不需要针对UIView去做任何的操作。选择Assets.xcassets,选中某个图片,并点击右下角的Show Slicing,

自定义视图

Define The Custom View

控件改变坐标系(convertRecr)

【UIKit】UIView基础学习相关推荐

  1. 零基础学习 iOS 开发

    作者:匿名用户 链接:https://www.zhihu.com/question/22000647/answer/114700565 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  2. 【转】oracle PLSQL基础学习

    [转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...

  3. python创建对象的格式为_Python入门基础学习(面向对象)

    python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...

  4. 虚幻引擎虚拟现实开发基础学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...

  5. 动画产业基础学习教程 Rad How to Class – Animation Industry Fundamentals

    如何分类--动画产业基础 大小解压后:6.2G 含课程素材 1920X1080 mp4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 信息: 绘画技巧.解剖学.角色设计.透视和整体讲故事--这门 ...

  6. Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender

    Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Funda ...

  7. ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course

    ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后:4.96G 语言:英语+中英文字幕(机译)时长 ...

  8. 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?

    原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...

  9. 计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...

    2019 年计算机一级考试 PS 基础学习点子: PS 菜单中英文对照表 PS菜单中英文对照表 一.File New 2.Open 3.Open As 4.Open Recent Close 6.Sa ...

最新文章

  1. Install pysnmp for django
  2. MS SQL Server存储过程
  3. 【机器学习入门】深入浅出聚类算法!如何对王者英雄聚类分析,探索英雄之间的秘密...
  4. 监控主机安装需要材料
  5. Java讲课笔记19:throw关键字、自定义异常与垃圾回收
  6. cuSPARSE库:(四)不同矩阵格式在内存中的存储方式
  7. php 获取header auth,php CURL Auth请求头和响应头获取
  8. Linux下rpm安装jdk17
  9. error C4703: 使用了可能未初始化的本地指针变量
  10. 小米8SE 解BL锁教程 申请BootLoader解锁教程
  11. 短信后台功能与通道路由模块客户通道选择短信平台开发|国际短信通道短信后台源码
  12. php seo技巧,十个对排名最有效的SEO​技巧
  13. Filecoin(FIL) 交易离线签名
  14. 都是古人抓紧时间发奋苦读的典范
  15. HTML5 JavaScript CSS 表单实现购物优惠打折
  16. 内心的强大,永远胜过外表的浮华
  17. OpenGL渲染管线之简单示例(五)
  18. 500万补贴!武汉市企业牵头承担国家科技项目配套补贴对象标准及申报流程
  19. 复杂json转MAP对象
  20. 小米平板1刷lineageOS 16.0 教程

热门文章

  1. 【leetcode】97. Interleaving String
  2. CentOS 7.X 安装 Gitlab 笔记
  3. python学习:函数传参数
  4. Fraunhofer ISE多结太阳能电池效率达30.2%
  5. JAVA常见算法题(十三)
  6. python调用zabbix api接口实时展示数据
  7. 无线渗透--wifiphisher之wifi钓鱼获取wifi密码
  8. 找工作 50道编程题Java实现(32-50)
  9. IDEA 构建为了打 jar 包的工程,包含 maven 打 jar 包的过程
  10. 【Latex】一些使用