系统在很多时候会去调用这个方法: 1.初始化不会触发layoutSubviews,但是如果设置了不为CGRectZero的frame的时候就会触发。...autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews 当我们在某个类的内部调整子视图位置时...drawRect在以下情况下会被调用: 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。...然后系统自动调用drawRect:方法。 3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。...不实际调整视图。 sizeToFit 会根据sizeThatFits返回的最佳大小进行调整视图。
setNeedsLayout 方法以标记该视图(或者它的子视图)为需要进行布局更新 -调用 setNeedsDisplay 或者 setNeedsDisplayInRect...: 方法以标记该视图(或者它的子视图)需要进行重画 -通知 Controller 有数据变化 如果一个视图的几何结构改变了,UIKit 会更新它的子视图 如果任何视图的任何部分被标记为需要重画...> 方法,以调整当前视图及其子视图的布局。...setNeedsDisplayInRect: 会给当前 UIView 立一个 flag,以表示后续应该调用 drawRect: 方法,以进行视图重绘...---- View Drawing Cycle Apple 官方文档已经明确说明,开发者不应该直接调用 layoutSubviews 与 drawRect:</code
layoutSubviews在下面情况下会被调用: 1、init初始化不会触发layoutSubviews 可是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero...layoutSubviews, 当我们在某个类的内部调整子视图位置时,须要调用。 反过来的意思就是说:假设你想要在外部设置subviews的位置,就不要重写。...刷新子对象布局 -layoutSubviews方法:这种方法,默认没有做不论什么事情,须要子类进行重写 -setNeedsLayout方法: 标记为须要又一次布局,异步调用layoutIfNeeded...刷新布局,不马上刷新,但layoutSubviews一定会被调用 -layoutIfNeeded方法:假设,有须要刷新的标记,马上调用layoutSubviews进行布局(假设没有标记,不会调用layoutSubviews...) 假设要立即刷新,要先调用[view setNeedsLayout],把标记设为须要布局,然后立即调用[view layoutIfNeeded],实现布局 在视图第一次显示之前,标记总是“须要刷新
时,其内部会自动创建CALayer图层对象(即UIView的关联图层),UIView调用drawRect:方法进行绘图,并且将所有的内容绘制到自己的图层上,绘制完毕后,系统会将图层拷贝到屏幕上,于是就完成了...视图的的职责就是创建并管理这个图层,以确保子视图在层级关系中添加或者被移除的时候,它们的关联图层也同样对应在层级关系树当中有相同的操作。...CALayer就会转而尝试调用此的方法; - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx; 在调用方法2之前,CALayer...主动绘制 我们需要显式的调用-display方法;这不同于UIView,当图层显示到屏幕上时,CALayer不会自动重绘它的内容,CALayer把重绘的决定权交给了开发者; 2.绘制特点 尽管没有使用...)坐标系下的点或者矩形转换为另一个图层(或视图)坐标系下的点或者矩形;开发过程中我们通常操作的对象都是视图,所以下面以视图为例简单演示其用法:首先创建添加两个宽高都是100*100的橙色、紫色视图在控制器的
而setNeedsLayout会默认调用layoutSubViews,处理子视图中的一些数据。...一般来说,使用框架控件,当您设置属性(如显示标签或值)时,您将会使用该属性,这样会导致重新绘制控件,因为系统会实现对控件drawRect方法的调用。...的调用,但结果同样不会更新。...drawRect的UIView子类时,需要在需要重绘时指示给系统。...因为drawRect不能被手动调用,所以您需要使用setNeedsDisplay方法告诉系统完成绘图, 四、添加setNeedsDisplay 所以接下来,我们需要添加setNeedsDisplay
LayoutSubviews 子类可以重写此方法,因为需要更精确执行他们子视图的布局。...只有当 autoresizing 和基于约束的行为的子视图不提供你想要的行为,应重写此方法。 该方法不应直接调用。...如果你想要强制布局更新,下一次绘图更新之前 应当反向调用 setNeedsLayout 方法,如果您想要立即更新您的视图的布局,请调用 layoutIfNeeded 方法。...7.removeFromSuperview PS: init初始化不会触发layoutSubviews drawRect 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect...4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect PS: 重绘操作在drawRect方法中完成,不建议直接调用drawRect方法,当然调用此方法,结果没有任何效果的
/Core Graphics/Core Image---->GPU Drive-->GPU 图层树/视图树 一个UIView(视图)对应一个CALayer(图层),CALayer对应显示的数据其有个content...代表Bitamp,渲染流程后的Bitmap被存储在content属性中(这个bitmpa也叫back store)UIView代表视图树对应的CALayer对应图层树 分离UIView和CALayer的目的在于...是为了适配MAC OS系统,MAC OS系统中定义CFImage和NSImage都起作用 2.自己基于顶点来处理数据,手动绘制 顶点的需要自己计算纹理,光照信息用于片段主色器显示颜色 UIView中有一个drawRect...方法用于实现自定义绘制,由Core Graphics处理绘制寄宿图, 实现原理:drawRect是CALayer的方法,CALayer中有一个delegete代理的属性,UIView实现了这个代理的协议...) :添加子视图,调用layoutSubviews,计算视图布局 注意:减少视图层级,视图创建 Display(绘制视图) Core Grphics进行视图绘制,得到图元信息(对比与Android的canvas
1、布局(Layout) 调用layoutSubviews方法; 调用addSubview:方法; 会造成CPU和I/O瓶颈; 2、显示(Display) 通过drawRect绘制视图; 绘制...当绘制完成后,视图的像素会被渲染到屏幕上;当下次再次调用视图的-setNeedsDisplay,将会再次调用-drawRect方法。...更新内容时,会启用离屏渲染,所以更新代价较大,只能用于静态内容;而且如果光栅化的元素100ms没有被使用将被移除,故而不常用元素的光栅化并不会优化显示。...GroupOpacity=YES,子 layer 在视觉上的透明度的上限是其父 layer 的opacity。当父视图的layer.opacity != 1.0时,会开启离屏渲染。...不要使用不必要的mask,可以预处理图片为圆形;或者添加中间为圆形透明的白色背景视图。即使添加额外的视图,会导致额外的计算;但仍然会快一点,因为相对于切换上下文,GPU更擅长渲染。
layoutSubviews在以下情况下会被调用: 1、init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero...layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。 反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。...刷新子对象布局 –layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写 -setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局...,不立即刷新,但layoutSubviews一定会被调用 -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews...) 如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局 在视图第一次显示之前,标记总是“需要刷新
而setNeedsDisplay会调用自动调用drawRect方法,这样可以拿到UIGraphicsGetCurrentContext,就可以画画了。...而setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。...事例的截图如下: 其中右面的文字和绿色部分是用一个子视图封装的。...整个布局是我在主视图中添加了一个ContentView视图,在ContentView视图中添加了一个ArticleView视图。...接下来在ContentView中添加ArticleView视图。
对于子线程来说,runloop是懒加载的,只有当我们使用的时候才会创建,所以在子线程用定时器要注意:确保子线程的runloop被创建,不然定时器不会回调。...13 介绍下layoutSubview和drawRect layoutSubviews调用情况 init初始化UIView不会触发调用 addSubview会触发调用 改变view的width和...看情况,可能有调用 drawRect调用情况 如果UIView没有设置frame大小,直接导致drawRect不能被自动调用。...drawRect在loadView和viewDidLoad这两个方法之后调用 调用sizeToFit后自动调用drawRect 通过设置contentMode值为UIViewContentModeRedraw...讲 讲你的使 场景以及使 时的注意事项 1.给扩展添加属性 2.替换系统方法的的实现 22.讲讲iOS事件响应链的原理 1、响应者链通常是由视图(UIView)构成的; 2、一个视图的下一个响应者是它视图控制器
在绘制发生的时候如果使用的是系统提供的视图,绘制工作会自动得到处理。然而,如果是自定义视图,则必须重写drawRect:方法,在此提供相应的绘制代码。...一旦drawRect:方法被调用,就可以使用任何的UIKit、Quartz 2D、OpenGL ES等技术对视图的内容进行绘制了。 ...触发视图重新绘制的动作有如下几种: 当遮挡你的视图的其他视图被移动或删除操作的时候; 将视图的hidden属性声明设置为NO,使其从隐藏状态变为可见; 将视图滚出屏幕,然后再重新回到屏幕上; 显式调用视图的...,不管有没有上下文,只要在View上面画东西,都得要在DrawRect方法中去写 5、如何添加绘制文字属性? ...drawAsPatternInRect:(CGRect *)rect:在指定的rect区域内平铺图片,如果一张图片不够用,则会在剩下的地方重新放置该图片,图片的大小尺寸不会改变。
UIView显示在屏幕上归功于CALayer,通过调用drawRect方法来渲染自身的内容,调节CALayer属性可以调整UIView的外观, UIView继承自UIResponder,比起CALayer...树形结构,也可以向它的layer上添加子layer,来完成某些特殊的显示。...loadView用来自定义view,只要实现了这个方法,其他通过xib或storyboard创建的view都不会被加载 看懂控制器view创建的这个图就行 [image] IBOutlet连出来的视图属性为什么可以被设置成...drawRect方法依赖Core Graphics框架来进行自定义的绘制 缺点:它处理touch事件时每次按钮被点击后,都会用setNeddsDisplay进行强制重绘;而且不止一次,每次单点事件触发两次执行...当你调用 setNeedsDisplay 方法时, UIKit 将会把当前图层标记为dirty,但还是会显示原来的内容,直到下一次的视图渲染周期,才会将标记为 dirty 的图层重新建立Core Graphics
视图在层级关系中可以互相嵌套,一个视图可以管理它的所有子视图的位置。 在iOS中,所有的视图都是从UIView这个基类派生出来的。...1.3 平行的层级关系 每个UIView都对应着一个CALayer,视图的职责是创建并管理这个图层,以确保党子视图在层级关系中添加或者被移除的时候,他们对应的图层也同样的在对应的层级关系树中有相同的操作...如果UIView检测到-drawRect:被调用,会自动给视图分配一个寄宿图。这个寄宿图的像素尺寸等于视图大小乘以contentsScale。...如果你不需要寄宿图,不要写这个方法,会造成资源浪费,详细部分见《内存恶鬼drawRect》 视图在屏幕上出现的时候-drawRect:会自动被调用。...在blueLayer上显式调用了-display。因为当图层显示在屏幕上时,CALayer不会自动重绘,这和UIView不同。需要手动调用。 我们没有调用masksToBounds。
今天,笔者主要整理一下对drawRect方法的理解和使用。 默认情况下,该方法在视图加载过程中不做任何人处理。...当子类使用Core Graphics和UIKit绘制视图内容时就需要在该方法中添加绘制的代码。 drawRect简介 drawRect方法在UIView的使用上起着十分关键的作用。...重绘作用:重写该方法以实现自定义的绘制内容 drawRect调用场景 视图第一次显示的时候会调用。...异步调用drawRect,但是绘制视图的动作需要等到下一个绘制周期执行,并非调用该方法立即执行; - (void)setNeedsDisplayInRect:(CGRect)rect;:标记为需要局部重绘...若子类继承自其他View类则需要调用super方法以实现重绘。 若使用UIView绘图,只能在drawRect:方法中获取绘制视图的contextRef。
[1240] 从上图可以看出,在滑动过程中CPU占用特点是: * 滑动时CPU占用率高、空闲时CPU占用率底 * 主线程CPU占用高、子线程CPU占底 根据上述特点我们可以做如下优化: 预加载,...可在子线程中进行的任务 * 图片解码 * 文本渲染,UILabel和UITextview都是在主线程渲染的,当显示大量文本时,CPU的压力会非常大。...而drawRect使用CPU绘图,相比之下会很慢,而且十分耗CPU \* CAShapeLayer占用内存更少。因为不会创建寄宿图,因此无论多大都不会占用太多内存。...所以,尽量不要让图片和视图的大小超过这个值。 * **视图的混合 (Composing)** 当多个视图(或者说 CALayer)重叠在一起显示时,GPU 会首先把他们混合到一起。...为了避免这种情况,可以尝试开启 CALayer.shouldRasterize 属性,但这会把原本离屏渲染的操作转嫁到 CPU 上去。
UIView 的子 View 树形结构,它们分别可以有自己的 SubView 和 SubLayer,可以向它的 RootLayer 上添加子 layer,来完成一些页面效果,比如说渐变等。...这里说的 view 的 layer 是指 view 的 RootLayer,对于后添加上去的子 Layer 还是会有隐式动画的。 页面渲染流程 那么为什么 CALayer 可以呈现可视化内容呢?...} CALayer渲染流程 上图是 CALayer 在渲染之前的流程,我们可以稍微进行归纳一下: 当调用 [UIView setNeedsDisplay] 时,实际上会直接调用底层 layer 的同名方法...drawRect: 方法才会被调用到; 如果没有 delegate,会调用 layer 的 drawInContext 方法,也就是我们可以重写的 layer 的该方法,此刻会被调用到; 注意 drawRect...坐标系改了,那么所有子视图的位置也会跟着改变。
I iOS设置视图cornerRadius属性失效的解决方案 1.1 解决步骤 1、尝试设置_numberLab.clipsToBounds = YES;2、尝试设置 [self.numberLab layoutIfNeeded...它有什么作用 masksToBounds指在设置子layer在超出父layer时是否被裁剪,YES表示裁剪,NO表示不裁剪,默认是NO;通常在通过设置layer.cornerRadius属性实现圆角效果时要设置...masksToBounds和clipsToBounds是不同的,前者指子layer层在超出父layer时是否被裁剪(masksToBounds是CALayer的属性),而后者指子view在超出父view...表格视图(UITableView)主要用来罗列展示数据项如果数据量很大,那么表格中将需要同样多的cell视图来显示,而cell的大量创建和初始化会造成内存压力,影响界面的流畅性,因此对表格视图的加载优化十分重要...⑤ 尽量手动Drawing视图提升流畅性,而不是直接子类化UITableViewCell,然后覆盖drawRect方法,因为cell中不是只有一个contentview。
中了,而一个 VC 执行viewWillAppear 时必定是 self.navigationController 的 topViewController即栈顶的视图。...中跟试图的初始化是需要时间的,你在VC根试图初始化之前调用绘制UI的方法当然是不会有效果出现的。...setNeedsLayout会默认调用layoutSubViews,就可以处理子视图中的一些数据。...**综上两个方法都是异步执行的,layoutSubviews方便数据计算,drawRect方便视图重绘。...**drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或 者 setNeedsDisplayInRect,让系统自动调该方法。强行调用也不会起作用的。
*)subview 参数 subview 被添加做子视图的视图对象 讨论 被子类重写用来执行额外的命令当子视图添加到接收者。...2.在容器视图中设置转换。 3.在容器视图中移除子视图。 4.在容器视图中添加子视图。 5.结束动画块。...4.2.2 (未解决)DrawRect如何清空之前内容 4.2.3 DrawRect之后注意用hitTest:withEvent:方法处理事件接收 //用户触摸时第一时间加载内容 - (UIView*...如果一个子视图的区域超过父视图的bound区域(父视图的clipsToBounds属性为NO,这样超过父视图bound区域的子视图内容也会显示),那么正常情况下对子视图在父视图之外区域的触摸操作不会被识别...,因为父视图的pointInside:withEvent:方法会返回NO,这样就不会继续向下遍历子视图了。
领取专属 10元无门槛券
手把手带您无忧上云