在之前的文章iOS的性能优化中我详细介绍了卡顿产生的原因,这里不做赘述,总结成一句话就是:GPU或者CPU的消耗过大,导致在一次同步信号之间没有准备完成,没有内容提交,导致掉帧。...而Texture的最大特点就是能够极大地优化卡顿问题,其优化原理如下: 布局:iOS的Autolayout在性能上是存在瓶颈的,并且只能在主线程进行计算,因此Texture弃用了AutoLayout,自己设计了一套布局方式...上图是常见的UIView和CALayer的关系:View持有Layer用于展示,View本身会响应触摸事件。 ? ? 上面两图展示了ASNode、UIView以及CALayer三者的关系。...布局 AsyncDicplayKit拥有自己的一套成熟的布局方案,虽然语法比Masonry等(对AutoLayout的封装)要复杂,但是其性能却比AutoLayout好得不是一点点。...AsyncDisplayKit提供了ASLayout的几个子类,后面会有介绍。 从插入单个简单布局到更多更复杂的布局规则,变化堆放排列配置。
* 注意: 对于可动态确定布局的部分,如tableView中的cell,直接自行从xib初始化即可,不必继承于 MCComponent. */ @interface MCComponent :...* * @param isFromXib 是否从xib或sb初始化此类. * * 注意: 无论此类是否从xib或sb初始化,组件内部都将从xib文件初始化....的子类的.h/.m与一个同名的 .xib 文件组成,如MCTextComponent.h, MCTextComponent.m, MCTextComponent.xib.此时应把XIB的File's Owder...核心理论基础: AutoLayout中,如何唯一确定元素在不同尺寸屏幕上的位置? 既定方案,必须基于AutoLayout,至于AutoLayout与Frame的区别于优势,不做赘述....@interface YFViewComponent : UIView /** * 子视图配置信息. * * 子类应重写覆盖此方法.
模糊效果 FXBlurView - 是一个UIView子类,支持iOS5.0以上版本,支持静态,动态模糊效果,继承与UIView的模糊特效。...至少在storyboard中创建时会喜欢。在代码中纯手工创建约束灰常痛苦,但幸运的是我们有了SnapKit,在板中用上它,你可以简单直观地编写约束了。...UIView-AutoLayout - 弃用PureLayout,其中包括OS X支持:https://github.com/smileyborg/PureLayout。...Cartography - Cartography是用来声明Swift中的Auto Layout,无需输入任何字符串就职设置自己Auto Layout的约束声明。...UIView-FDCollapsibleConstraints - 一个AutoLayout辅助工具,最优雅的方式解决自动布局中子查看的动态显示和隐藏的问题。
随后 GPU 会把渲染结果提交到帧缓冲区去,随后等待下一次 VSync(垂直同步信号) 到来时,视频控制器会逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。...当在操作 UI 时,比如改变了 Frame、更新了 UIView/CALayer 的层次时,或者手动调用了 UIView/CALayer 的 setNeedsLayout/setNeedsDisplay...5 Autolayout 对于复杂视图来说常常会产生严重的性能问题。...随着视图数量的增长,Autolayout 带来的 CPU 消耗会呈指数级上升 6 尽量减少在短时间内大量图片的显示,尽可能将多张图片合成为一张进行显示。... CALayer 的 border、圆角、阴影、遮罩(mask),CASharpLayer 的矢量图形显示,通常会触发离屏渲染(offscreen rendering),而离屏渲染通常发生在 GPU 中。
对此你在应用中,应该尽量减少不必要的属性修改。 当视图层次调整时,UIView、CALayer 之间会出现很多方法调用与通知,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。...Autolayout Autolayout 是苹果本身提倡的技术,在大部分情况下也能很好的提升开发效率,但是 Autolayout 对于复杂视图来说常常会产生严重的性能问题。...尽管这实现起来非常麻烦,但其带来的优势也非常大,CoreText 对象创建好后,能直接获取文本的宽高等信息,避免了多次计算(调整 UILabel 大小时算一遍、UILabel 绘制时内部再算一遍);CoreText...如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。...图像的绘制 图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的地方就是 [UIView drawRect:] 里面了。
帧率 即 Frame Rate,单位 fps,是指 gpu 生成帧的速率,如 33 fps,60fps,越高越好。...GPU 向 Back Buffer 中写数据,屏幕从 Frame Buffer 中读数据。...屏幕进入下一个刷新周期时,从 Frame Buffer 中取出的是“老”数据,而非正在产生的帧数据,即两个刷新周期显示的是同一帧数据。...这里有一个背景:屏幕视频控制器只会从屏幕对应的帧缓存中一帧一帧的取数据,而不会从其他的缓冲区中取数据,所以我们想把其他缓冲区(也就是屏幕外缓冲区)中的内容显示到屏幕上,需要把屏幕外缓冲区渲染的结果提交到屏幕的缓冲区...task.didDisplay(self, NO); }); return; } // 从当前上下文获取图片
CPU 计算好显示内容(如:视图的创建、布局计算、图片解码、文本绘制)提交至 GPU,GPU 渲染完成后将渲染结果存入帧缓冲区,视频控制器会按照 VSync 信号逐帧读取帧缓冲区的数据,经过数据转换后最终由显示器进行显示...在这种情况下,GPU 会预先渲染一帧放入一个缓冲区中,用于视频控制器的读取。当下一帧渲染完毕后,GPU 会直接把视频控制器的指针指向第二个缓冲器。 ?...对此你在应用中,应该尽量减少不必要的属性修改。 当视图层次调整时,UIView、CALayer 之间会出现很多方法调用与通知,所以在优化性能时,应该尽量避免调整视图层次、添加和移除视图。...如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。...图像的绘制 图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的地方就是 [UIView drawRect:] 里面了。
模糊效果 FXBlurView - 是一个UIView子类,支持iOS5.0以上版本,支持静态、动态模糊效果,继承与UIView的模糊特效。...至少在storyboard中创建时会喜欢。 在代码中纯手工创建约束灰常痛苦,但幸运的是我们有了SnapKit,在board中用上它,你可以简单直观地编写约束了。...UIView-AutoLayout - Deprecated in favor of PureLayout, which includes OS X support:https://github.com...UIView-FDCollapsibleConstraints - 一个AutoLayout辅助工具,最优雅的方式解决自动布局中子View的动态显示和隐藏的问题。...FXLabel - FXLabel是一个功能强大使用简单的类库,通过提供一个子类改进了标准的UILabel组件,为字体增加了阴影、内阴影和渐变色等,可以被用在任何标准的UILabel中。
本文从比较老的Frame到新生AutoLayout都进行了浅显的总结,希望对大家的UI布局学习有所帮助 ---- Frame 父试图是使用的AutoLayout ,如果子试图的Frame = supeView.Frame...AutoLayout(动画中使用是个弱点) 使用SDAutoLayout 不光是为了横竖屏的适配(通过判断屏幕方向,重置 Frame 也可以做到),是为了TablevIew中cell ...使用了这么久, 对于父试图是 Button / UITextFeild等非UIView的直接子类,布局其子视图时,这里面的约束是不生效的。...我们可以在XIB、StoryBoard中通过拉线的形式给控件视图添加布局约束,通过苹果强大的可视化界 IB(Interface Builder)我们能够轻松的使用AutoLayout完成界面视图的布局。...就表示当前这个试图的左边到父试图左边的距离,当这个试图是同一层级的参照的话,就表示当前试图的左边到参照试图右边的距离,依次类推,传入的这个CGFloat值需要是一起的值才行,如果这个值是组合值的话就要加()如:
Autolayout Autolayout 是苹果本身提倡的技术,在大部分情况下也能很好的提升开发效率,但是 Autolayout 对于复杂视图来说常常会产生严重的性能问题。...如果想要绕开这个机制,常见的做法是在后台线程先把图片绘制到 CGBitmapContext 中,然后从 Bitmap 直接创建图片。目前常见的网络图片库都自带这个功能。...图像的绘制 图像的绘制通常是指用那些以 CG 开头的方法把图像绘制到画布中,然后从画布创建图片并显示这样一个过程。这个最常见的地方就是 [UIView drawRect:] 里面了。...YYAsyncLayer 是 CALayer 的子类,当它需要显示内容(比如调用了 [layer setNeedDisplay])时,它会向 delegate,也就是 UIView 请求一个异步绘制的任务...我写了一个简单的工具 YYDispatchQueuePool,为不同优先级创建和 CPU 数量相同的 serial queue,每次从 pool 中获取 queue 时,会轮询返回其中一个 queue。
自动布局 02 Mar 2016 Comments 前言 最近遇到一个复杂视图:根控制器里面有上下两个子控制器,子控制器中各自实现类似PageView的视图,然后PageView的每一页是一个WebView...采用子控制器的原因是因为防止所有的逻辑代码都混在根控制器中,所以没有使用nicklockwood 的iCarousel 或SwipeView ,而是采用了之前一直在用的SCPageViewController...记录下自动布局中遇到的几个坑。...关于Autolayout的调试 刚开始使用Autolayout遇到下面的警告人容易让人气馁。经常不知所措而放弃了使用Autolayout。...MASConstraintMaker *make) { make.bottom.equalTo(lastView); // bottom = lastView}]; 不过对于我的项目来讲计算的太蛋疼了,于是偷了个懒,因为从pageview
该属性表示autoresizingMask和autolayout两种方式的转换。这个属性对于在代码中生成的view来说默认是true,而对于IB中拖出来的view来说默认是false....IB will do this for you. */ 从以上的描述中,我们可以知道在使用AutoResizing布局时,AutoLayout会根据autoResizing来创建同等行为的constraint...而当我们确定选择使用AutoLayout添加自己的约束的时候,我们必须设置此属性为NO,XIB中这个属性默认是NO。...在实际的使用过程中,我还需要注意两点: 1.当我们设置这个属性为YES的时候,view的布局结果由AutoResizingMask,frame,center这些因素共同决定,如果再在其上添加AutoLayout...那么AutoLayout在开发中具体如何使用呢,这其实分为两种情况,一种是借助xib中的约束功能通过连线的方法实现。
关于Autolayout的调试 刚开始使用 Autolayout 遇到下面的警告人容易让人气馁,经常不知所措而放弃了使用 Autolayout。...AutoLayout 关于 update 的几个方法 UIView 是我们经常使用的一个基本控件,其中有几个基本的布局方法需要清楚。...通常在 updateConstraints 方法中实现必须要更新的约束,在设置或者解除约束、更改约束的优先级或者常量值,或者从视图层级中移除一个视图时都会设置一个内部的标记 update constarints...AutoLayout 与 Frame 在使用 AutoLayout 的时候可能也会同时也会用到 frame,比如需要用到 layer 的时候,想让 layer 的尺寸是由其它视图尺寸设定的,而这个视图又是由约束控制布局的...(132 328; 150 80); layer = > 3、在 dispatch_after 里面可以拿到真实的 frame ,或许是因为设置约束和获取
尺寸比较固定,都是4英寸屏幕的时候,在计算App的尺寸时,只要稍微根据Window的size稍微计算一下就可以了,但是前年iPhone6以及iPhone6Plus的推出,作为开发者就会警觉为了多机型的适配,使用AutoLayout...是势在必行的一件事情了,但是说实话,我在用了AutoLayout之后真的觉得挺不方便的。...这里要注意的一点就是Masonry中能够添加AutoLayout的一共有三个函数。...mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(lastView.mas_bottom); }]; 从scrollView...总而言之Masonry是一个非常优秀的AutoLayout库,能够节省大量的开发时间,适合我这种喜欢纯代码的iOSer。
在iOS开发中,我们知道有一个共同的基类——NSObject,但是对于界面视图而言,UIView是非常重要的一个类,UIView是很多视图控件的基类,因此,对于UIView的学习闲的非常有必要。...下面主要通过学习UIView.h文件来了解UIView主要提供了那些方法和属性,从UIView.h的源码来看,UIView.h的结构主要分为4个部分: 常用枚举类型的定义,主要包括 视图动画曲线 UIViewAnimationCurve...中,如分段控制文本对齐方式或在游戏中方向键 123 UISemanticContentAttributeForceLeftToRight, //!...mark - 系统自动调用(留给子类去实现) 263 /** 添加自视图完成后调用 */ 264 - (void)didAddSubview:(UIView *)subview; 265 /** 将要移除自视图时调用...的关键帧动画 */ 422 @interface UIView (UIViewKeyframeAnimations) 423 424 /** 创建一个动画块对象,可用于为当前视图设置基于关键帧的动画
(其实也不是不可取,很多iOS开发者做屏幕适配的时候不是用的autoresizing或autolayout,而是以代码的方式动态获取屏幕的尺寸,然后根据屏幕的尺寸来写死子控件的frame。...使用这种方式你会在代码中无辜增加很多if...else... 的条件判断语句。另一种方式是获取到屏幕的尺寸后,按照控件和屏幕的比例来设置控件的frame,其本质上也是写死frame。...从开发的角度,重复繁琐的代码会牵绊住开发者的进度;从程序设计角度,这样的设计思路不够高级,且日后不易于拓展和维护。)...代码中的autoresizingMask和storyBoard中尺寸检查器中的Autoresizing是一回事。iPhone5开始,Xcode添加了autolayout功能。...如把tableView设置为此属性,那么无论viewController的view是多大,都能自动铺满 ?
也可以说是从UI最不流畅的一种我们慢慢优化,从而实现了这5种解决方案。当然我们是观察屏幕的FPS来判断屏幕在操作时是否卡顿。...也就是每秒刷新60帧,如果低于60帧的话那就是掉帧了,如果掉帧掉的多的话就会明显的看出卡顿。上述截图中右下方的黑色图标就是我们封装的FPSDisplay工具。...大体原理就是在获取时,如果缓存字典中没有相应的对象就进行创建并加入缓存,然后返回该对象。如果缓存中已经有该对象,则直接返回。核心代码如下。 ?...下方是使用这种方式最终的运行效果,从该效果中可以看出,效果还是蛮OK的。虽然有些掉帧,但是还是非常流畅的,这种流畅度是可以接受的。如果你不想使用第三方库的话,这种方式还是一个比较好的解决方案的。 ?...大部分工作都在基类中去实现了,而子类中只提供了使用Cell的策略。这就是策略模式的好处,便于扩充,如果有类似的页面,子类只提供Cell的类型即可。
关于Autolayout和Masonry自动布局的几个坑 自动布局 02 Mar 2016 0 Comments 前言 最近遇到一个复杂视图:根控制器里面有上下两个子控制器,子控制器中各自实现类似PageView...记录下自动布局中遇到的几个坑。...关于Autolayout的调试 刚开始使用Autolayout遇到下面的警告人容易让人气馁。经常不知所措而放弃了使用Autolayout。...||*UIView:0x7f9481c9d990-AMBIGUOUSLAYOUTforUIView:0x7f9481c9d990.minX{id:13},UIView:0x7f9481c9d990.minY...MASConstraintMaker*make){make.bottom.equalTo(lastView);// bottom = lastView}]; 不过对于我的项目来讲计算的太蛋疼了,于是偷了个懒,因为从pageview
Masonry手写Autolayout专题 Masonry常规开发指导整理自此篇文档(可别说我转载不注明出处哦,^_^),后面加入了笔者在实际开发使用过程中遇到过的一些问题,希望对你有所帮助。...*sv = [UIView new]; //在做autoLayout之前 一定要先将view添加到superview上 否则会报错 [self.view addSubview:sv]; //mas_makeConstraints...mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(lastView.mas_bottom); }]; 头部效果 尾部效果 从scrollView...1.1.5 [高级] 横向或者纵向等间隙的排列一组view 很遗憾 autoLayout并没有直接提供等间隙排列的方法(Masonry的官方demo中也没有对应的案例)但是参考案例3我们可以通过一个小技巧来实现这个目的为此我写了一个...Masonry 在TableCell中增加子控件时,无法正常使用Masonry来进行布局,可能是Cell重用引起的。
,然后从帧缓存读取数据到视频控制器上,最终显示在屏幕上。...在 iOS 中有双缓存机制,有前帧缓存、后帧缓存,这样渲染的效率很高。 屏幕成像原理 我们所看到的动态的屏幕的成像其实和视频一样也是一帧一帧组成的。...那么针对 CPU 和 GPU 有以下优化方案: CPU 尽量用轻量级的对象 如:不用处理事件的 UI 控件可以考虑使用 CALayer; 不要频繁地调用 UIView 的相关属性 如:frame、bounds...、transform 等; 尽量提前计算好布局,在有需要的时候一次性调整对应属性,不要多次修改; Autolayout 会比直接设置 frame 消耗更多的 CPU 资源; 图片的 size 和 UIImageView...,但区别是,基类定义的虚函数,子类可以实现也可以不实现,而抽象函数子类一定要实现。