DrawRect是系统自己调用的, 它是当View显示的时候自动调用. 8、画线(基本步骤描述) //1.获取跟View相关联的上下文 CGContextRef ctx = UIGraphicsGetCurrentContext...当创建一个UIBezierPath对象之后,我们可以使用它的stroke和fill方法在current graphics context中去渲染它,这两个方法的底层的实现,就是获取上下文,拼接路径,把路径添加到上下文...在调用这些方法之前,我们要进行一些其他的任务去确保正确的绘制path,以及path的设置。 使用UIColor类的方法去stroke和fill想要的颜色。...首先要确定圆才能确定圆弧,圆孤它就圆上的一个角度嘛。还是使用UIBezierPath的自带的初始化方法。...,但是填充需要一个封闭的路径才能填充,所以画扇形的方法为: 1.先画一个圆弧 2.再添加一个一根线到圆心: 3.然后封闭路径:[path closePath],该方法会自动从路径的终点到路径的起点封闭起来
一言不合先上效果图: ①、自定义的UIPageControl是继承于UIView,封装好的,可以设置图标大小,形状,图片 ,颜色,间隔,当然,需要的话,也可以自定义图标视图;详情请按快捷键Ctrl +...②、创建有占位视图的UITextView,主要涉及NSTextStorage、NSLayoutManager、NSTextContainer、UIBezierPath几个类,主要代码如下: NSString...initWithString:title]; [textStorage addAttributes:attributeDictionary range:NSMakeRange (0, [title length])]; //布局管理...UIBezierPath *newPath1 = [UIBezierPath bezierPathWithRect:imageRect]; textContainer.exclusionPaths =...就没有作用了 textView.scrollEnabled = NO; textView.textContainerInset = UIEdgeInsetsMake (0,0,0,0); //自动布局后容器的
这个 mask 的 CALayer 是添加到哪里,那里就可以显示出来。 既然有了这个属性,那么就好办多了。...【已解决】UIView添加到KeyWindow上面自动会被 Release ?忽略我 GB_ROOT_WINDOWS多一个 s单词的手误吧。 我们当时新下载进入首页的时候会弹出很多的弹框?...比如 强制更新提示(只有 APP 无法使用 很少出现) 蒙版提示(没有弹出蒙版的才出现) 新人大礼包(三天一次) 注册通知确认框 评分弹框 。。。。。。...A点的位置,我们不可能让使用的人给出 B点的位置,这样以后适配很麻烦。...*/ @property (nonatomic, copy) NSString *tipText; 效果图有的文本居左,有的居右,我们需要让外部设置布局方式 /** * 文本的对其方式 */ @
注意,当收到内存不足警告时,NSCache会自动释放内存。所以每次访问NSCache,即使上一次已经加载过,也需要判断返回值是否为空。...; UIView的transform是可以用仿射变换矩阵来控制平移、放大缩小等。...= CGAffineTransformMakeScale(1.2, 1.2); }]; 2、匀速运动、交错效果 right是项目封装的一个属性,本质是对UIView的frame进行操作; 两朵云...alpha的变化,但是UIView的block动画不好实现重复效果; UIView的alpha对应的是layer的opacity属性,设定好起始、过度和结束的状态,实现闪烁的效果。...属性来实现; 同样使用CAKeyframeAnimation实现,设定好初始、中间、结束状态,动画时间已经重复次数,并添加到layer,完成旋转效果; CAKeyframeAnimation*
当需要画图时我们一般创建一个UIView子类, 重写其中的drawRect方法 再drawRect方法中利用UIBezierPath添加画图 UIBezierPath的使用方法: (1)创建一个Bezier...(2)使用方法moveToPoint:去设置初始线段的起点。 (3)添加line或者curve去定义一个或者多个subpaths。 (4)改变UIBezierPath对象跟绘图相关的属性。...也可以设置filled path的属性usesEvenOddFillRule 我们直接上demo, 创建一个BezierView继承自UIView并重写drawRect方法 #import "BezierView.h...添加到Controller中 #import "ViewController.h" #import "BezierView.h" #define SCREEN_WIDTH [UIScreen mainScreen...我们可以用UIBezierPath的bezierPathWithRect:CGRect(rect)方法来画矩形, 代码如下 - (void)drawRect:(CGRect)rect { //
但实际上UIView是对CALayer封装,在CALayer的基础上再添加交互功能。UIView的显示必须依赖于CALayer。...layer.png CALayer 最常用的两个子类: CAGradientLayer(用于颜色渐变的实现) // 创建 UIView 用来承载渐变色 UIView *myView = [[UIView...CAShapeLayer动画仅仅限于沿着边缘的动画效果,它实现不了填充效果 我们可以使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形...这面这个例子就是使用 CAShapeLayer与UIBezierPath以及CABasicAnimation结合在一起,实现的动态画图。 ?...,这时候就可以使用CAAnimationGroup. duration 动画持续时间,值得一提的是,如果添加到group里的子动画不设置此属性,group里的duration会统一设置动画
前言: setNeedsDisplay异步执行的。它会自动调用drawRect方法,这样可以拿到 UIGraphicsGetCurrentContext,就可以绘制了。...一、着手 我定义了一个UIView的子类,用于演示使用setNeedsDisplay,这个CircleView子类会在draw(_ rect: CGRect)方法内简单绘制一个圆,它有一个颜色属性,这是我们将要设置用来改变圆的颜色...一般来说,使用框架控件,当您设置属性(如显示标签或值)时,您将会使用该属性,这样会导致重新绘制控件,因为系统会实现对控件drawRect方法的调用。...而我们自定义了自己的UIView子类,所以我们需要处理影响显示的控件的更新。在改变颜色的情况下,当然需要我们自己控制重新绘制。...这是因为视图的缓存机制,即便视图布局发生改变,也只是作为缓存。
1、UIView+drawRect+UIBezierPath 重写drawRect能够自动生成Context,所以可以在drawRect方法里面画图形 - (void)drawRect:(CGRect...[[UIColor orangeColor] setFill]; [p fill]; } 2、UIView+drawRect+context 获取到drawRect自动生成的context,在context...使用UIGraphicsPushContext切换到一个全新的绘图context。 使用UIKit绘制图形B。...使用场景是: 当前正在绘制图形A。 使用UIGraphicsBeginImageContext将旧的绘图context入栈,创建新的绘图context并使用。 绘制图形B。...视图即UIView,并不是直接显示在屏幕上,而是在创建视图对象的时候视图对象会自动创建一个层,而视图对象把要显示的东西绘制在层上,待到需要显示时硬件将所有的层拷贝,然后按Z轴的高低合成最终的显示结果
我们在应用中创建一个新的 CADisplayLink 对象,把它添加到一个runloop中,并给它提供一个 target 和 selector,它在屏幕刷新的时候调用, 一但 CADisplayLink...例如一个视频应用使用时间戳来计算下一帧要显示的视频数据。在UI做动画的过程中,需要通过时间戳来计算UI对象在动画的下一帧要更新的大小等等。 ...(1) CALayer 实际上UIView是对CALayer封装,在CALayer的基础上再添加交互功能。UIView的显示必须依赖于CALayer。...我们同样可以跟新建view一样新建一个layer,然后添加到某个已有的layer上,同样可以对layer调整大小、位置、透明度等。...,并且 UIView 的尺寸样式都由内部的 Layer 所提供。
UIView动画 设置UIView形变动画有两种常见用到的属性,.frame,.transform,所以有的人也可以分别称之为: ① frame动画 ② transform动画 这两种动画只需要在动画语法中适当的位置...,基于UIView和CALayer的属性设置变化值即可。...UIView的 CGAffineTransform 类型属性:animatedView.transform 一般是View的旋转,拉伸移动等属性,是二维的,通常使用都是前缀CGAffineTransform...如果在程序中改变了某个控件的transform,那么请不要使用这个控件的frame计算 子控件 的布局,应该使用bounds+center代替。 3....,负责控制动画的持续时间和速度,是个抽象类,不能直接使用,应该使用它具体的子类 3.3 CAAnimation类的属性 带*号代表来自CAMediaTiming协议的属性) *duration:动画的持续时间
View UIView *actView = ({ UIView *view = [[UIView alloc] initWithFrame:CGRectMake...将动画添加到view的layer层 [actView.layer addAnimation:basicAnimation forKey:@"first"]; ?...kCAFillModeBackwards相同 kCAFillModeRemoved//移除 这个属性使用的时候要设置removedOnCompletion = NO, duration, 是动画持续时间...内容是NSValue封装的CGpoint 还有一个变量Path可以设置, 这个属性可以用UIBezierPath来设定特殊形状的路径, 如果有设置path属性, values属性就不会生效了 上代码...将动画添加到view的layer层 [actView.layer addAnimation:group forKey:@"first"]; ?
Core Animation的动画执行过程是在后台操作的.不会阻塞主线程. 要注意的是, Core Animation是直接作用在CALayer上的.并非UIView。...CAAnimation继承结构 ---- 一、 CAAnimation CAAnimation类是所有动画对象的父类,负责控制动画的持续时间和速度等,是个抽象类,不能直接使用,应该使用它具体的子类...例子: UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(50, 100, 250, 100)]; animKey.path...self.index + 1]; // 切换图片 self.imgViewIcon.image = [UIImage imageNamed:imgName]; // 把转场动画添加到对应的控件上...view:需要进行转场动画的视图 options:转场动画的类型、效果,枚举类型 animations:将改变视图属性的代码放在这个block中 completion:动画结束后,会自动调用这个
哈哈~ Come on~下面这张图纯粹是为了简书当作封面使用的。也不知道为什么,以前简书还能自动把GIF的第一桢当作封面,现在不好使了。 ?...创建步骤: 创建关键帧动画对象 设置属性 添加到要作用的layer上 如果使用rect椭圆的方式,动画会不连贯,停顿一下。...我们创建一个UIBezierPath,让小飞机沿着这个路径运动。...它类似于一个子图层,相对于父图层(即拥有该属性的图层)布局,但是它却不是一个普通的子图层。不同于其他能够在父图层中绘制出图像的子图层,mask图层定义了父图层的部分可见区域。...因为在工作中碰到的大部分动画都是通过UIView的动画block实现,其他都基本上都是需要用到CAShapeLayer。我们下次玩点好玩的吧~ 如果还有兴趣,可以看看本系列的其他文章哈。
-->需要图形上下文,保存绘图信息; 然后图形上下文必须跟view相关联,才能将内容绘制到View上面 自定义UI控件的步骤: 1)新建一个类,继承自UIView 2)实现 - (void...上的layoutSubviews事件 35 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件 36 */ 37 - (void)layoutSubviews...连体字符是指某些连在一起的字符,它们采用单个的图元符号。0 表示没有连体字符。1 表示使用默认的连体字符。2表示使用所有连体符号。默认值为 1(注意,iOS 不支持值为 2)。...字母紧排的效果依赖于字体。值为 0 表示不使用字母紧排。默认值为0。...在 iOS 中,总是使用横排文本,0 以外的值都未定义。
知名的2D物理引擎 Box2d Chipmunk 使用步骤 要想使用UIDynamic来实现物理仿真效果,大致的步骤如下 创建一个物理仿真器(顺便设置仿真范围) 创建相应的物理仿真行为(顺便添加物理仿真元素...UIDynamicItem协议的对象 UIView默认已经遵守了UIDynamicItem协议,因此任何UI控件都能做物理仿真 UICollectionViewLayoutAttributes类默认也遵守...//view参数:是一个参照视图,表示物理仿真的范围 - (instancetype)initWithReferenceView:(UIView *)view; UIDynamicAnimator的常见方法...- (void)removeAllBehaviors; UIDynamicAnimator的常见属性 //参照视图 @property (nonatomic, readonly) UIView* referenceView...; //添加到物理仿真器中的所有物理仿真行为 @property (nonatomic, readonly, copy) NSArray* behaviors; //是否正在进行物理仿真 @property
这篇博文的重点不在于如何用使用贝塞尔曲线,而是利用贝塞尔划线的功能来封装一个画图板。 ...画图板的截图如下,上面的白板就是我们的画图板,是自己封装好的一个UIView,下面会详细的介绍如何封装这个画图板,下面的控件用来控制我们画图板的属性以及Undo,Redo和保存功能。...一.封装画图板 其实上面的白板就是一继承于UiView的一个子类,我们可以在这个子类中添加我们画图板相应的属性和方法,然后实例化成对象添加到ViewController中,当然为了省事添加白板的时候是通过...storyboard来完成的,读者也可以自己实例化然后手动的添加到相应的ViewController中。 ...1.封装白板的第一步是新建一个UIView的子类MyView,然后添加相应的属性和方法。
如果是位移动画则考虑使用BasicAnimation或者KeyframeAnimation实现, 需要的话再搭配缓动函数 #3....比较复杂的动画则考虑是否用UIBezierpath一帧帧来画 今天我们模仿做一个场景切换加载等待动画, 比如这样的 ? 我们分析下这张图的构成 #1. 一个灰色的背景 #2. 一个白色的圆环 #3....一个闭合的圆弧(白色部分) 看起来不是简单的位移动画了, 我们用UIBezierPath加CADisplayLink一帧一帧来画试试看 灰色的背景, 这个比较简单, 我们直接创建一个UIView子类,...背景颜色设置为灰色 白色的圆环, 可以用UIBezierPath直接画一个圆,注意调整线的宽度 So easy //添加外圆 UIBezierPath *apath = [UIBezierPath...然后在Controller中创建计时器, 改变_count的值达到动画的效果 上代码: 先创建一个UIView子类, #import @interface MyView
之前讲过使用UIBezierPath在UIView的drawRect中绘图, 今天我们讲下另外一种方式: CAShaperLayer 先说说使用CAShapeLayer的优点: GPU执行, GPU执行...按照之前的思路是创建一个UIView子类, 用UIBezierPath画一个外围的不闭合圆弧, 在画中间点圆 代码量不是很多弹也不少, 那假如用CAShapeLayer实现时怎么样子的呢?...: path 可以看到,这里用的是UIBezierPath生成一个path,然后取他的CGPath来获取路径的。...下面我们再使用CAShapeLayer绘制一些特殊的形状 ?...比如hud这个, 我们之前用UIBezierPath在UIView的DrawRect中画画过, 相对比较简单 我们用CAShapeLayer事实看。
https://www.jianshu.com/p/09f4e36afd66 什么是CALayer: 总结:能看到的都是uiview,uiview能显示在屏幕上是因为它内部的一个层calyer层。...在创建uiview的时候,uiview的内部会自动创建一个层(calayer对象)通过uiview的layer属性可以访问这个层。...换句话说,uiview本身并不具备显示功能,它的内部的层才有显示功能。 CALayer的基本功能 通过操作CALayer对象,可以调整uiview的一些外观属性。...比如阴影,圆角,边框的颜色等、 项目中的具体使用 1.做渐变。...两种方式,一种是使用 n张图片去循环,这样的话对内存的开销比较大,不建议使用,第二种就是采用CALayer的相关属性 加上核心动画来实现:代码如下: //2.渐变转换为图形形成动画 CALayer
bounds); typedef UIView *(^ConrnerRadius) (CGFloat radius); typedef UIView *(^BorderColor) (UIColor...* color); typedef UIView *(^BorderWidth) (CGFloat width); typedef UIView *(^ShadowColor) (UIColor...); typedef UIView *(^ShadowOpacity) (CGFloat opacity); typedef UIView *(^ShowVisual) (void); typedef...UIRectCorner 默认UIRectCornerAllCorners @property(nonatomic, strong, readonly)ConrnerBounds conrnerBounds; // 在使用约束布局时必传...因为我切圆角的实现方法 UIBezierPath *radiusPath = [UIBezierPath bezierPathWithRoundedRect:CGRectEqualToRect(CGRectZero