【UIKit】UIView基础学习
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基础学习相关推荐
- 零基础学习 iOS 开发
作者:匿名用户 链接:https://www.zhihu.com/question/22000647/answer/114700565 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- 【转】oracle PLSQL基础学习
[转]oracle PLSQL基础学习 --oracle 练习: /**************************************************PL/SQL编程基础****** ...
- python创建对象的格式为_Python入门基础学习(面向对象)
python基础学习笔记(四) 面向对象的三个基本特征: 封装:把客观事物抽象并封装成对象,即将属性,方法和事件等集合在一个整体内 继承:允许使用现有类的功能并在无须重新改写原来的类情况下,对这些功能 ...
- 虚幻引擎虚拟现实开发基础学习教程
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.93 GB |时长:5h 15m 了 ...
- 动画产业基础学习教程 Rad How to Class – Animation Industry Fundamentals
如何分类--动画产业基础 大小解压后:6.2G 含课程素材 1920X1080 mp4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 信息: 绘画技巧.解剖学.角色设计.透视和整体讲故事--这门 ...
- Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender
Blender纹理基础学习视频教程 CGCookie – Fundamentals of Texturing in Blender Blender纹理基础学习视频教程 CGCookie – Funda ...
- ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course
ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后:4.96G 语言:英语+中英文字幕(机译)时长 ...
- 0基础学好python难不难_零基础学习Python难不难?Python有什么优势?
原标题:零基础学习Python难不难?Python有什么优势? Python是一种计算机程序设计语言.首先,我们普及一下编程语言的基础知识.用任何编程语言来开发程序,都是为了让计算机干活,比如下载一个 ...
- 计算机一级ps2019,2019年计算机一级考试PS基础学习点子:PS菜单中英文对照表.docx...
2019 年计算机一级考试 PS 基础学习点子: PS 菜单中英文对照表 PS菜单中英文对照表 一.File New 2.Open 3.Open As 4.Open Recent Close 6.Sa ...
最新文章
- Install pysnmp for django
- MS SQL Server存储过程
- 【机器学习入门】深入浅出聚类算法!如何对王者英雄聚类分析,探索英雄之间的秘密...
- 监控主机安装需要材料
- Java讲课笔记19:throw关键字、自定义异常与垃圾回收
- cuSPARSE库:(四)不同矩阵格式在内存中的存储方式
- php 获取header auth,php CURL Auth请求头和响应头获取
- Linux下rpm安装jdk17
- error C4703: 使用了可能未初始化的本地指针变量
- 小米8SE 解BL锁教程 申请BootLoader解锁教程
- 短信后台功能与通道路由模块客户通道选择短信平台开发|国际短信通道短信后台源码
- php seo技巧,十个对排名最有效的SEO​技巧
- Filecoin(FIL) 交易离线签名
- 都是古人抓紧时间发奋苦读的典范
- HTML5 JavaScript CSS 表单实现购物优惠打折
- 内心的强大,永远胜过外表的浮华
- OpenGL渲染管线之简单示例(五)
- 500万补贴!武汉市企业牵头承担国家科技项目配套补贴对象标准及申报流程
- 复杂json转MAP对象
- 小米平板1刷lineageOS 16.0 教程