先把这个控件与你的成员变量连接起来,viewDidLoad里面就可以获取到
let x = yourViewframeoriginxlet y = yourViewframeoriginy
let width = yourViewframesizewidth
let height = yourViewframesizewidth
当我们对一个UIView使用了autolayout自动布局之后,也就意味着我们放弃了传统的通过设置view的frame等方式手动的修改、确定这个view的位置、尺寸属性。甚至从某种程度上讲,我们应该忘记view的frame属性:它的确定不再取决于我(手动的直接修改),而是通过我们在 storyboard或者code中提供的约束条件(constraints),通过一个自动布局引擎(苹果为autolayout采用的是 Cassowary布局引擎,参考文档: 点击打开链接 ),计算出这个view的frame。因此我们可以认为使用了autolayout的view的frame属性是一个只读的属性。在代码里认为的改动这个view的frame并不能对这个view的frame产生真正的效果(事实也确实如此)。
iOS绘制的过程:
CPU和GPU相互协作
一CPU计算frame,的解码,通过数据总线将需要绘制的纹理交给GPU
二GPU负责处理纹理的混合,顶点变化和计算,像素点的计算渲染到帧缓冲区
总结:
1在渲染的时候,CPU对其进行解压缩,CPU对要压缩的会进行缓存,防止解压缩的性能消耗
2图形的渲染过程是->加载->计算Frame->解码->解码后的位图通过数据总线传到GPU->GPU获取Frame->顶点变换->光栅化->根据纹理坐标获取相应的每个像素点的颜色值(如果有透明度还要对相应的像素点进行计算)->渲染到帧缓存区->渲染到屏幕
1尽量用轻量级的对象,比如用不到事件处理的地方,可以考虑使用CAlayer取代UIView;能用基本数据类型,就别用NSNumber类型。
2不要频繁地跳用UIVIew的相关属性,比如frame、bounds、transform等属性,尽量减少不必要的修改
3尽量提前计算好布局,在有需要时一次性调整对应的布局,不要多次修改属性
4Autolayout会比直接设置frame消耗更多的CPU资源
5的size最好刚好跟UIImageView的size保持一致
6控制一下线程的最大并发数量
7尽量把耗时的 *** 作放到子线程
8文本处理(尺寸的计算,绘制)
9处理(解码、绘制)
1尽量减少视图数量和层次
2GPU能处理的最大纹理尺寸是4096x4096,一旦超过这个尺寸,就会占用CPU资源进行处理,所以纹理尽量不要超过这个尺寸
3尽量避免短时间内大量的显示,尽可能将多张合成一张显示
4减少透明的视图(alpha<1),不透明的就设置opaque为yes
5尽量避免出现离屏渲染
1On-SCreen Rendering:当前屏幕渲染,在当前用语显示的屏幕缓冲区进行渲染 *** 作。
2Off-Screen Rendring: 离屏渲染,在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染 *** 作
一般造成的 *** 作:
(1)光栅化,layershouldRasterize = YES
(2)遮罩,layermask
(3)圆角,同时设置layermaskToBounds = Yes,LayercornerRadis 大于0
考虑通过CoreGraphics绘制裁剪圆角,或者美工提供圆角
(4)阴影,layershadowXXX
如果设置了layershadowPath就不会产生离屏渲染
需要在当前视图绘制完成之后才能进行阴影和遮罩,圆角等的 *** 作,就会造成离屏渲染
为什么耗性能
1需要创建新的缓冲区;
2离屏渲染的整个过程,需要多次切换上下文环境,先是从当前屏幕切换到离屏;等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上,又需要将上下文环境从离屏切换到当前屏幕
当在 *** 作 UI 时,比如改变了 Frame、更新了 UIView/CALayer 的层次时,或者手动调用了 UIView/CALayer 的 setNeedsLayout/setNeedsDisplay方法后,这个 UIView/CALayer 就被标记为待处理,并被提交到一个全局的容器去。
苹果注册了一个 Observer 监听 BeforeWaiting(即将进入休眠) 和 Exit (即将退出Loop) 事件,回调去执行一个很长的函数:
_ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv()。这个函数里会遍历所有待处理的 UIView/CAlayer 以执行实际的绘制和调整,并更新 UI 界面。
这个函数内部的调用栈大概是这样的:
• addsubview 的时候 触发的
• CPU会为layer分配一块内存用来绘制bitmap,叫做backing store
• layer创建指向这块bitmap缓冲区的指针,叫做CGContextRef
• 通过CoreGraphic的api,也叫Quartz2D,绘制bitmap
• 将layer的content指向生成的bitmap
CPU性能瓶颈:
创建对象会分配内存,对象过多,比较消耗 CPU 资源 。
GPU功能
GPU处理的单位是Texture
基本上我们控制GPU都是通过OpenGL来完成的,但是从bitmap到Texture之间需要一座桥梁,Core Animation正好充当了这个角色:
Core Animation对OpenGL的api有一层封装,当我们的要渲染的layer已经有了bitmap content的时候,这个content一般来说是一个CGImageRef,CoreAnimation会创建一个OpenGL的Texture并将CGImageRef(bitmap)和这个Texture绑定,通过TextureID来标识。
这个对应关系建立起来之后,剩下的任务就是GPU如何将Texture渲染到屏幕上了。
GPU性能瓶颈
因此,GPU的挑战有两个:
• 将数据从RAM搬到VRAM中
• 将Texture渲染到屏幕上
这两个中瓶颈基本在第二点上。渲染Texture基本要处理这么几个问题:
Compositing:
Compositing是指将多个纹理拼到一起的过程,对应UIKit,是指处理多个view合到一起的情况,如
如果view之间没有叠加,那么GPU只需要做普通渲染即可。 如果多个view之间有叠加部分,GPU需要做blending。
加入两个view大小相同,一个叠加在另一个上面,那么计算公式如下:
因此,view的层级很复杂,或者view都是半透明的(alpha值不为1)都会带来GPU额外的计算工作。
应用应当尽量减少视图数量和层次,并在不透明的视图里标明 opaque 属性以避免无用的 Alpha 通道合成。
大部分设计都用autolayout。
IOS开发者常用的布局方式:手写Frame、自动布局(AutoLayout)、xib、storyboard等方式。
制作滚屏网页首先需要创建“格线系统”,顺着格线作为参照来设计,任何一个“Frame”右侧面板都会有“Auto layout”。
ios8中可以使用一套UI就可以适配所有的尺寸,包含各尺寸的iphone及ipad。用到的技术是AutoLayout+sizeclass但在未推出自动布局autolayout之前的ios版本,就需要多套UI来适配iphone,ipad了。
一、autoresizingMask
这是IOS旧的约束实现方式,而且只能用于约束父子关系的控件,约束子控件相对于父控件的位置关系。支持的约束种类有:
typedefNS_OPTIONS(NSUInteger, UIViewAutoresizing) {
UIViewAutoresizingNone =0,
UIViewAutoresizingFlexibleLeftMargin =1<<0,
UIViewAutoresizingFlexibleWidth =1<<1,
UIViewAutoresizingFlexibleRightMargin =1<<2,
UIViewAutoresizingFlexibleTopMargin =1<<3,
UIViewAutoresizingFlexibleHeight =1<<4,
UIViewAutoresizingFlexibleBottomMargin =1<<5
};
UIViewAutoresizingNone:不随父View的变化而变化
UIViewAutoresizingFlexibleLeftMargin:相对父布局左边距d性变化,右边距固定
UIViewAutoresizingFlexibleRightMargin:相对父布局右边距d性变化,左边距固定
UIViewAutoresizingFlexibleTopMargin:相对父布局上边距d性变化,底部边距固定
UIViewAutoresizingFlexibleBottomMargin:相对父布局底部边距d性变化,顶部边距固定
UIViewAutoresizingFlexibleWidth:相对父布局的宽度等比缩放
UIViewAutoresizingFlexibleHeight:想对父布局的高度等比缩放
注意:所有的属性都是位移运算,因此可以叠加
如:设置约束,距离左边d性,距离上部d性以及宽度d性
selfview1autoresizingMask = UIViewAutoresizingFlexibleLeftMargin| UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;
二、AutoLayout
AutoLayout是从autoresizingMask演化而来的,因此需要禁用autoresizingMask的方式。
translatesAutoresizingMaskIntoConstraints = NO;
AutoLayout的功能强大,可以设置任意View的约束关系。但添加约束有对应的规则,规则如下:
1、针对View的独立属性,不需要依赖其他View,则将约束添加到自己上面
//设置View的宽度
NSLayoutConstraint widthConstraint = [NSLayoutConstraint constraintWithItem:selfview1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeWidth multiplier:10 constant:200];
//设置View的高度
NSLayoutConstraint heightConstraint = [NSLayoutConstraint constraintWithItem:selfview1 attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:10 constant:200];
[selfview1addConstraint:widthConstraint];
[selfview1addConstraint:heightConstraint];
2、针对有依赖关系的情况,有以下规则:
(1)两个同层级view之间的约束关系,添加到他们共同的父view上
(2)两个不同层级上的view之间的约束关系,添加到他们最近的共同的父view上
(3)两个有层次关系的view之间的约束关系,添加到层次较高的view上
请谨记此规则,如果添加错了则会崩溃:( 我将约束添加到了自己上面,没有添加到父View上 )
2020-04-17 17:35:42950274+0800 ConstraitLayoutTest[1216:429986] [LayoutConstraints] The view hierarchy is not prepared for the constraint:
When added to a view, the constraint's items must be descendants of that view (or the view itself) This will crash if the constraint needs to be resolved before the view hierarchy is assembled Break on -[UIView(UIConstraintBasedLayout) _viewHierarchyUnpreparedForConstraint:] to debug
2020-04-17 17:35:42951995+0800 ConstraitLayoutTest[1216:429986] [LayoutConstraints] View hierarchy unprepared for constraint
Constraint:
Container hierarchy:
<UIView: 0x101407f90; frame = (0 0; 0 0); layer = <CALayer: 0x28344f560>>
View not found in container hierarchy: >
That view's superview: NO SUPERVIEW
2020-04-17 17:35:42953478+0800 ConstraitLayoutTest[1216:429986] Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view Does the constraint reference something from outside the subtree of the view That's illegal constraint: view:>'
First throw call stack:
(0x237f97ea0 0x237169a40 0x237e9e674 0x23897bd60 0x2651378c8 0x265137d94 0x265138494 0x100d9a3f0 0x100d99bac 0x26479620c 0x26479663c 0x2646c91f8 0x2646bd4cc 0x2647a7b24 0x2647aaa38 0x2647ab09c 0x2647aa990 0x2647aaccc 0x100d989e8 0x264d5e768 0x2647ec6d0 0x2647ec9f0 0x2647eb9f0 0x264d9818c 0x264d993f0 0x264d786ec 0x264e4457c 0x264e46f74 0x264e3fa64 0x237f281cc 0x237f2814c 0x237f27a30 0x237f228fc 0x237f221cc 0x23a199584 0x264d5d054 0x100d98be8 0x2379e2bb4)
libc++abidylib: terminating with uncaught exception of type NSException
Message from debugger: The LLDB RPC server has crashed The crash log is located in ~/Library/Logs/DiagnosticReports and has a prefix 'lldb-rpc-server' Please file a bug and attach the most recent crash log
以上就是关于swift 3 怎么获取一个View控件 autolayout约束 之后的 width height x y全部的内容,包括:swift 3 怎么获取一个View控件 autolayout约束 之后的 width height x y、如何对使用了autolayout的UIView添加动画、iOS图片绘制渲染,View渲染等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)