糖果派对官方网站_可以赌钱的糖果游戏_手机版
iOS Autolayout使用学习

iOS Autolayout使用学习

作者:网络编程    来源:未知    发布时间:2020-04-04 18:52    浏览量:

其一法子是用来重绘的。

一.为何要使用autolayout

  1. 更便于适配种种设备,一套代码适用三种设备(碎片化不再只是安卓的痛)。
  2. autolayout +storyboard 在不写一行代码的情况下,就足以对相对轻易的页面达成布局,那样ViewController里大概View里的有关结构的代码将会少超多,大家的代码越发关注职业逻辑本人。
    3 .Xcode本人的可视化编制程序更抓牢劲,裁减了新人开辟门槛。
  3. 更苍劲的表明技能。未来的spring + structs 布局只可以描述父亲和儿子关系视图的布局,可是autolayout不只能够发挥兄弟视图之间的构造,也能够表达同二个rootView视图等级次序下的两样视图之间的布局,举个例子视图与祖父视图的结构关系等。
    ps:当然也可能有一部分不应当使用autolayout的原因,例如质量难题,比方对于频仍改进的页面(在storyboard里校正几十三个限定够酸爽的)等,具体决计于实际行使情形。


一、UIViewController 的生命周期

  • drawRect在以下情况下会被调用:

二.几个概念

上面带 (NSObjectState of Qatar的办法是NSObject提供的点子。其余的都以UIViewController 提供的点子。

  1. 万一在UIView起首化时未尝设置rect大小,将直接变成drawRect不被自动调用。drawRect调用是在Controller->loadView,Controller->viewDidLoad两艺术之后掉用的.所以不用操心在调节器中,那么些View的drawRect就从头画了.那样能够在调整器中安装有个别值给View(如若那么些View draw的时候要求利用某个变量值卡塔尔.
  2. 该方法在调用sizeToFit后被调用,所以能够先调用sizeToFit计量出size。然后系统活动调用drawRect:方法。
  3. 因而设置contentMode属性值为UIViewContentModeRedraw。那么将要历次设置或转移frame的时候自动调用drawRect:
  4. 直白调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不可能为0。
1.约束

自律直白的乃是描述视图的岗位、大小的关系音讯。譬如a视图的肥瘦是b视图的肥瘦的55%,a视图的x坐标离b视图左边10pt等。这个节制新闻会最后通过构造引擎转化为视图实际的frame,所以本质上通过自律与通过代码setFrame来安装视图的坐标、大小未有分裂(本质没不一样代表实际照旧有个别不同的)。

 

以上1,2推荐;而3,4不提倡

2.总计公式
<code>view1.attribute1 = mutiplier * view2.attribute2 + constant</code>

透过自律里面包车型客车事例,大约就足以猜出这么些公式了。 表示view1的某部属性(如中度)是view2的某些属性的(如宽度)的mutiplier倍 再增加constant。并且若是加多完约束,能改革的独有constant那么些个性。假若想改view2的attribute2就必须要删除了,再new二个constraint,即便能通过constant完结的就尽只怕通过退换constant达成,减少不供给的靶子生成和销毁。关于有怎样属性,能够看下iOS文书档案如下:

图片 1

属性描述

看名字就十分轻巧通晓了各样属性是神马意思了。

load   (NSObject)

  • 运用注意点:
3.优先级

各类约束皆有优先级UILayoutPriority,是二个float型值。优先级越高(最高1000),表示须求事情未发生前知足该左券束。因为可能大家给三个视图加多a,b八个约束,a与b是冲突的,然则又不想删除当中多个,那么能够透过安装优先级来消除那个难题。

initialize   (NSObject)

  1. 若使用UIView绘图,只能在drawRect:主意中获取相应的contextRef并绘制。假使在此外艺术中获得将取取得二个invalidate的ref并且无法用于画图。drawRect:格局不能够手动彰显调用,必得透过调用setNeedsDisplay 或者 setNeedsDisplayInRect,让系统自动调该措施。
  2. 若使用calayer绘图,只能在drawInContext:中(类似于drawRect)绘制,或许在delegate中的相应措施绘制。相仿也是调用setNeedDisplay等直接调用以上办法
  3. 若要实时画图,无法运用gestureRecognizer,只好利用touchbegan等办法来掉用setNeedsDisplay实时刷新显示器
4.封锁增加的义务

由此在storyboard里拉封锁,大家就如能够不用管约束增添在哪儿。可是假如我们手写约束的话,就须要调整将增加在哪个地方,上边是几个准则:
aState of Qatar.假诺view1和view2是同级的弟兄关系,那么限定增多到view1和view2的联手父view上
b卡塔尔国.如若view1,view2是父亲和儿子关系,那么足够的父view上
c卡塔尔.要是view1,view2未有直接的父view,那么加多在离他们多年来的父view上
d卡塔尔(قطر‎.对于这种不遵守别的view的自律(譬喻view1的幅度为20pt,也是就是view2 = nil)的情状,节制能够一直增加在view1的束缚数组里,实际测量试验中增加到view1的父view里也能健康工作(反正不驾驭怎么加的时候,假诺是多少个就加在近期的一齐父view上,假使独有协和,就加在本身的父view上卡塔尔(قطر‎;

init   (NSObject)

  • sizeToFit
5.sizeclasses

iOS Autolayout使用学习。苹果为了让构造与具体设备毫无干系,建议了指雁为羹设备的概念,也便是把器具的高抽象为compact, any, regular三种, 设备的宽也抽象为compact, any, regular二种,那样就一齐有9种配备了
对应提到得以看如下图(网图):

图片 2

设备对应涉及

透过在storyboard里筛选分裂sizeclasses:

图片 3

storyboard里的sizeclasses选项

再采取是或不是利用该视图:

图片 4

是或不是勾选

那样就足以成功在不相同器材上显得分化视图了。

initWithCoder

三.autolayout注意点

根本的专门的学问放前边说:autolayout和手写布局相似都是透过setFrame来退换视图的任务和尺寸,不过须求调节好时机才会赢得想要的结果。

initWithNibName

- sizeToFit 根据子视图的大小位置,调整视图,使其恰好围绕子视图, 也就是说自动适应子视图的大小,只显示子视图- sizeThatFits:size让视图计算最适合子视图的大小,即能把全部子视图显示出来所需要的最小的size
1.结构历程

先说下VC的生命周期的有个别进度

viewDidLoad -> viewWillAppear -> updateViewConstraints -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisAppear -> updateViewConstraints -> viewDidDisAppear</pre>

和布局相关的有
updateConstraints -> layoutSubViews -> drawRect
对应的解释:
当view校订限制(addConstraint, removeConstraint)会触发setNeedsUpdateConstraints,
而以此在layoutSubViews从前会触发updateConstraints,达成以往会调用layoutSubViews。
UIViewController在有个updateViewConstraints 方法,那几个办法其实是self.view 棉被服装置了setNeedsUpdateConstraints(第二回展示的时候),必然会调用这么些主意(与地点的批注保持一致了,第三次能够驾驭为为self.view扩充了各个束缚)。而这几个艺术的暗中同意实现是调用子view的updateConstraints方法,那样就自上而下的完结了结构。

尤为重要注意
以上七个艺术都亟待调用super方法,思疑是UIView 恐怕UIViewController里的那么些措施实现里会报告布局引擎去计算种种控件的Frame
在view的layoutSubViews也许ViewController的viewDidLayoutSubviews方法里后方可得到view的实际frame,所以当我们真正须要frame的时候须要在这里个时间点之后手艺取得

之所以在电动布局中,假设获得的frame的空子不对,恐怕就不会是我们想要的。
回过来想转手为啥就能够精晓viewDidLoad里经过setFrame的章程改善原本在storyboard里拖动的自律代码无效了,因为updateViewConstraints在viewDidLoad后实行,会覆盖掉此前的装置的frame,所以无效。若是大家在viewDidLayoutSubviews或然layoutSubViews之后去设置视图的frame则是实用的,但是不提议如此做,具体原因等下部提及动漫的时候大家再解释。

awakeFromNib   (NSObject)

  1. sizeToFit不有道是在子类中被重写,应该重写sizeThatFitssizeToFit会自行调用sizeThatFits方法;
  2. sizeThatFits盛传的参数是receiver当前的size,重临八个合乎的size
  3. sizeToFit能够被手动直接调用sizeToFitsizeThatFits办法都不曾递归,对subviews也不担负,只肩负和煦
2.触发ViewController自动布局的情况

此间只说iOS里最习觉得常的三种
a卡塔尔荧屏旋转
bState of QatarViewController由不足见到可知
接触自动构造都会调用ViewController的updateViewConstraints方法,因为要获得种种视图的控件frame,必得经过自律技巧取得。

loadView

UIViewController的布局进程

VC的生命周期的一对进度viewDidLoad -> viewWillAppear -> updateViewConstraints -> viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear -> viewWillDisAppear -> updateViewConstraints -> viewDidDisAppear

对应updateConstraints -> layoutSubViews -> drawRect当view改善节制(addConstraint, removeConstraint)会触发setNeedsUpdateConstraints,而以此在layoutSubViews早先会触发updateConstraints,达成以后会调用layoutSubViews。UIViewController在有个updateViewConstraints 方法,那些点子其实是self.view 被安装了setNeedsUpdateConstraints,必然会调用这几个措施(与地方的表达保持一致了,第叁次能够明白为为self.view扩充了种种束缚)。而以此格局的私下认可实现是调用子view的updateConstraints方法,那样就自上而下的做到了布局。

  • 那边须要留意的地点:
  1. 绝不要忘调用父类的艺术,制止偶发现身存的莫名的标题。
  2. 在view的layoutSubViews只怕ViewController的viewDidLayoutSubviews方法里后得以得到view的实际frame,所以当大家的确须求frame的时候须求在这里个时刻点之后才具取得。上边大家能够分解是为何viewDidLoad里透过setFrame的艺术改正原本在storyboard里拖动的约束代码无效了。因为updateViewConstraints在viewDidLoad后执行,会覆盖掉以前的设置的frame,所以无效。
3.动画

事前用frame的时候做动漫的时候

[UIView animateWithDuration::0.25  animations:^{
.view.frame = newFrame;
}];

今昔引入用校订约束来修正

_animationView2WidthConstraints.constant = 100;
[UIView animateWithDuration::0.25 animations:^{:^{
     [_animationView2.superview layoutIfNeeded];
}];

所以推荐用限制改善,是因为一旦荧屏发出旋转大概视图通过导航栏变得重复可知时,都会通过当前的封锁来测算各种视图的frame以用来结构。倘若接收setFrame格局给电动布局的视图作动漫,那么当爆发上边操作时,该视图会回到最早的姿容,那只怕不是大家想要的。
autolayout的着力采取就基本上了,还也许有更加多的架势或然手艺必要在实质上执行中逐年开采和透亮,接待大家有标题多多沟通。
PS:上边的洋洋架子是在Xcode7.1和iOS9.1里解锁的,也许相比老的本子有两样的一言一行哦_

viewDidLoad

重绘

-drawRect:rect方法:重写此方法,执行重绘任务 -setNeedsDisplay方法:标记为需要重绘,异步调用drawRect -setNeedsDisplayInRect:invalidRect方法:标记为需要局部重绘 layoutSubviews对subviews重新布局 layoutSubviews方法调用先于drawRect setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的 layoutIfNeeded遍历的不是superview链,应该是subviews链 drawRect是对receiver的重绘,能获得context。 

简单的讲,掌握view结构的长河,能够扶植您通晓View呈现的相关难点,解决一部分界面难点,合理利用上述办法对您自定义控件也可以有极大的救助。

-drawRect:rect方法:重写此方法,执行重绘任务-setNeedsDisplay方法:标记为需要重绘,异步调用drawRect-setNeedsDisplayInRect:invalidRect方法:标记为需要局部重绘sizeToFit会自动调用sizeThatFits方法;sizeToFit不应该在子类中被重写,应该重写sizeThatFitssizeThatFits传入的参数是receiver当前的size,返回一个适合的sizesizeToFit可以被手动直接调用sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己layoutSubviews对subviews重新布局layoutSubviews方法调用先于drawRectsetNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviewslayoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layoutlayoutIfNeeded遍历的不是superview链,应该是subviews链drawRect是对receiver的重绘,能获得contextsetNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘iPhone device的刷新频率是60hz,也就是1/60秒后重绘

先画一条线

- drawRect:rect { CGContextRef ctx = UIGraphicsGetCurrentContext(); //获取当前绘制环境 CGContextSetLineWidth; //设置线条宽度 CGContextSetStrokeColorWithColor(ctx, [[UIColor redColor] CGColor]);//设置线条颜色 CGContextBeginPath; //开始配置绘制路径 CGContextMoveToPoint(ctx, 100, 100); //设置起点为 CGContextAddLineToPoint(ctx, 200, 200); //添加一个直线到点 CGContextDrawPath(ctx, kCGPathStroke); //绘制路径}

图片 5效果图

此地分为两有的:

  1. 取妥帖前上下文并设置相关设置UIGraphicsGetCurrentContext()用来取得当前绘制景况,只好在drawRect里面获取该上下文。这里安装了线条宽度为2,线条颜色为乌紫。
  2. 制图路线绘制路线要以CGContextBeginPath()开头。直线、弧、曲线起头于近日点。空路线未有当前点,咱们必得调用CGContextMoveToPoint来安装第一身形路线的发轫点,只怕调用四个谋福函数来隐式地变成该职责。最终动用CGContextStrokePath()制图,也能够应用CGContextDrawPath()选料绘制方法。

CGContextRef状态

//保存CGContextRef当前的绘图状态,方便以后恢复该状态。CGContextSaveGState()函数保存的绘图状态,不仅包括当前坐标系统的状态,也包括当前设置的填充风格、线条风格、阴影风格等各种绘图状态。但 CGContextSaveGState()函数不会保存当前绘制的图形void CGContextSaveGState(CGContextRef__nullable c) //把CGContextRef的状态恢复到最近一次保存时的状态void CGContextRestoreGState(CGContextRef__nullable c)

坐标空间和变化UI基特是中兴 SDK的Cocoa Touch层的骨干framework,是Motorola应用程序图形分界面和事件驱动的根底,它和守旧的windows桌面相像,坐标系是y轴向下的; Core Graphics一个依照2D的图形绘制引擎,它的坐标系则是y轴向上的;而OpenGL ES是一加SDK的2D和3D绘制引擎,它采取右臂坐标系,它的坐标系也是y轴向上的,如若不思考z轴,在二维下它的坐标系和Quartz是相通的。

//缩放坐标系统该方法控制坐标系统水平方向上缩放 sx,垂直方向上缩放 sy。在缩放后的坐标系统上绘制图形时,所有点的 X 坐标都相当于乘以 sx 因子,所有点的 Y 坐标都相当于乘以 sy因子。void CGContextScaleCTM(CGContextRef__nullable c, CGFloat sx, CGFloat sy)//平移坐标系统 该方法相当于把原来位于  位置的坐标原点平移到 点。在平移后的坐标系统上绘制图形时,所有坐标点的 X坐标都相当于增加了 tx,所有点的 Y坐标都相当于增加了 ty。void CGContextTranslateCTM(CGContextRef__nullable c, CGFloat tx, CGFloat ty)//旋转坐标系统 该方法控制坐标系统旋转 angle 弧度。在缩放后的坐标系统上绘制图形时,所有坐标点的 X、Y坐标都相当于旋转了 angle弧度之后的坐标。void CGContextRotateCTM(CGContextRef__nullable c, CGFloat angle)//使用 transform变换矩阵对 CGContextRef的坐标系统执行变换,通过使用坐标矩阵可以对坐标系统执行任意变换。void CGContextConcatCTM(CGContextRef__nullable c, CGAffineTransform transform)//获取CGContextRef的坐标系统的变换矩阵CGAffineTransform CGContextGetCTM(CGContextRef__nullable c)

绘图属性设置相关函数

//设置绘制直线、边框时的线条宽度void CGContextSetLineWidth(CGContextRef__nullable c, CGFloat width)//设置线段端点的绘制形状。该属性支持如下三个值。typedef CF_ENUM(int32_t, CGLineCap) { kCGLineCapButt, //没有端点,线条结尾处直接结束,这是默认值。 kCGLineCapRound,//圆形端点,线条结尾处绘制一个直径为线条宽度的半圆。 kCGLineCapSquare//方形端点。线条结尾处绘制半个边长为线条宽度的正方形。需要说明的是,这种形状的端点与“butt”形状的端点十分相似,只是采用这种形式的端点的线条略长一点而已};void CGContextSetLineCap(CGContextRef__nullable c, CGLineCap cap)typedef CF_ENUM(int32_t, CGLineJoin) { kCGLineJoinMiter, // 这是默认的属性值。该方格的连接点形状如图1所示。 kCGLineJoinRound, // 稍微圆角, 该方格的连接点形状如图2所示。 kCGLineJoinBevel // 斜角,该方格的连接点形状如图3所示。};//设置线条连接点的风格,该属性支持如上三个值:void CGContextSetLineJoin(CGContextRef__nullable c, CGLineJoin join)//当把连接点风格设为meter风格时,该方法用于控制锐角箭头的长度*/void CGContextSetMiterLimit(CGContextRef__nullable c, CGFloat limit)
图1 图2 图3
kCGLineJoinMiter kCGLineJoinRound kCGLineJoinBevel
/* Linedash pattern允许我们沿着描边绘制虚线。我们通过在CGContextSetLineDash结构体中指定虚线数组和虚线相位来控制虚线的大小及位置。其中lengths属性指定了虚线段的长度,该值是在绘制片断与未绘制片断之间交替(实线、空白、实线、空白、实线....)。phase属性指定虚线模式的起始点,phase实际是虚线中实线长度的余数,当phase<length时向左偏移phase%length,phase>length向右偏移phase%length,phase或phase%length为0时不偏移。*/void CGContextSetLineDash(CGContextRef__nullable c, CGFloat phase,const CGFloat *__nullable lengths, size_t count)注意:CGContextSetLineDash的使用需要在存在路径的基础上。

图片 6虚线

其余装置

//设置弯曲的路径中的图形上下文的准确性。void CGContextSetFlatness(CGContextRef__nullable c, CGFloat flatness)//设置全局透明度void CGContextSetAlpha(CGContextRef__nullable c, CGFloat alpha)//设置CGContextRef的叠加模式。Quartz 2D支持多种叠加模void CGContextSetBlendMode(CGContextRef __nullable c, CGBlendMode mode)

绘制路线要以CGContextBeginPath()开始。

//开始创建路径.void CGContextBeginPath(CGContextRef__nullable c)//开始一个新的子路径点void CGContextMoveToPoint(CGContextRef__nullable c, CGFloat x, CGFloat y)//添加一条直线段从当前指向的void CGContextAddLineToPoint(CGContextRef__nullable c, CGFloat x, CGFloat y)/** * 从当前添加一个三次Bezier曲线 * @param cp1x 控制点1 x坐标 * @param cp1y 控制点1 y坐标 * @param cp2x 控制点2 x坐标 * @param cp2y 控制点2 y坐标 * @param x 直线的终点 x坐标 * @param y 直线的终点 y坐标 */void CGContextAddCurveToPoint(CGContextRef__nullable c, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y) /** * 从当前添加一个二次Bezier曲线 * @param cpx 控制点 x坐标 * @param cpy 控制点 y坐标 * @param x 直线的终点 x坐标 * @param y 直线的终点 y坐标 */void CGContextAddQuadCurveToPoint(CGContextRef__nullable c, CGFloat cpx, CGFloat cpy,CGFloat x,CGFloat y)//关闭当前上下文的子路径,且当前点和起点连接起来(需要在绘制之前调用)void CGContextClosePath(CGContextRef__nullable c)//添加一个矩形路径void CGContextAddRect(CGContextRef__nullable c, CGRect rect)//添加多个矩形路径void CGContextAddRects(CGContextRef__nullable c, const CGRect * __nullable rects, size_t count)//添加多条直线路径void CGContextAddLines(CGContextRef__nullable c, const CGPoint * __nullable points, size_t count)//根据一个矩形,绘制椭圆void CGContextAddEllipseInRect(CGContextRef__nullable c, CGRect rect)/** * 添加弧形路径 * @param x 中心点x坐标 * @param y 中心点y坐标 * @param radius 半径 * @param startAngle 起始弧度 * @param endAngle 终止弧度 * @param clockwise 是否逆时针绘制,1逆时针,0顺时针 */void CGContextAddArc(CGContextRef__nullable c, CGFloat x,CGFloat y,CGFloat radius,CGFloat startAngle,CGFloat endAngle,int clockwise)//这个函数使用一个序列的三次贝塞尔曲线创建一个弧 原理:首先画两条线,这两条线分别是 current point to 和 to .这样就是出现一个以为顶点的两条射线,然后定义半径长度,这个半径是垂直于两条射线的,这样就能决定一个圆了,如果当前点和第一个切点的弧是不平等的,那么会添加一条直线段从当前指向第一个切点。弧的终点成为新的当前点的路径void CGContextAddArcToPoin(CGContextRef __nullable c, CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat radius)

图片 7image

//添加路径到图形上下文void CGContextAddPath(CGContextRef__nullable c, CGPathRef__nullable path)

绘图路线

//使用绘制当前路径时覆盖的区域作为当前CGContextRef中的新路径,一般配合CGContextClip使用void CGContextReplacePathWithStrokedPath(CGContextRef__nullable c)//当前路径是否包含任何的子路径CGContextIsPathEmpty(CGContextRef__nullable c)//返回一个非空的路径中的当前点CGContextGetPathCurrentPoint(CGContextRef__nullable c)//返回包含当前路径的最小矩形CGContextGetPathBoundingBox(CGContextRef__nullable c)//返回当前上下文的路径的副本(CGPathRef __nullable)CGContextCopyPath(CGContextRef__nullable c)//检查当前路径中是否包含指定的点CGContextPathContainsPoint(CGContextRef__nullable c, CGPoint point, CGPathDrawingMode mode)

绘制方式

typedef CF_ENUM (int32_t, CGPathDrawingMode) { kCGPathFill, //填充 kCGPathEOFill, //奇偶填充 kCGPathStroke, //描边 kCGPathFillStroke, //描边并填充 kCGPathEOFillStroke //奇偶填充并描边};
kCGPathFill kCGPathEOFill kCGPathStroke kCGPathFillStroke kCGPathEOFillStroke
图1 图2 图3 图4 图5
//使用指定模式绘制当前CGContextRef中所包含的路径。void CGContextDrawPath(CGContextRef__nullable c, CGPathDrawingMode mode) //填充该路径包围的区域void CGContextFillPath(CGContextRef__nullable c)//使用奇偶规则来填充该路径包围的区域。奇偶规则指某个点被路径包围了奇数次则绘制该点,否则不绘制void CGContextEOFillPath(CGContextRef__nullable c)//使用当前 CGContextRef设置的线宽绘制路径void CGContextStrokePath(CGContextRef__nullable c)//填充rect代表的矩形void CGContextFillRect(CGContextRef__nullable c, CGRect rect)//填充多个矩形void CGContextFillRects(CGContextRef__nullable c, const CGRect * __nullable rects, size_t count)//使用当前 CGContextRef设置的线宽绘制矩形框void CGContextStrokeRect(CGContextRef__nullable c, CGRect rect)//使用指定线宽绘制矩形框void CGContextStrokeRectWithWidth(CGContextRef__nullable c, CGRect rect, CGFloat width)//清除指定矩形区域上绘制的图形void CGContextClearRect(CGContextRef__nullable c, CGRect rect)//填充rect矩形的内切椭圆区域void CGContextFillEllipseInRect(CGContextRef__nullable c, CGRect rect)//使用当前 CGContextRef设置的线宽绘制rect矩形的内切椭圆void CGContextStrokeEllipseInRect(CGContextRef__nullable c, CGRect rect)/** * 使用当前 CGContextRef 设置的线宽绘制多条线段 * @param c 当前上下文 * @param points 线段数组(必须成对出现,起点终点配对) * @param count 数组长度 */void CGContextStrokeLineSegments(CGContextRef__nullable c, const CGPoint * __nullable points, size_t count)//修改当前剪贴路径,使用非零绕数规则void CGContextClip(CGContextRef__nullable c)//修改当前剪贴路径,使用奇偶规则void CGContextEOClip(CGContextRef__nullable c)//剪切遮罩处理void CGContextClipToMask(CGContextRef__nullable c, CGRect rect, CGImageRef__nullable mask)//获取到了需要绘制的图形上下文的位置与大小CGRect CGContextGetClipBoundingBox(CGContextRef__nullable c)//剪切指定矩形区域外的部分void CGContextClipToRect(CGContextRef__nullable c, CGRect rect)//剪切指定多个矩形区域外的部分void CGContextClipToRects(CGContextRef__nullable c,const CGRect * rects, size_t count)

设置颜色

// 设置描边和填充色为红色[[UIColor redColor] set]// 设置填充色为绿色[[UIColor greenColor] setFill]// 设置描边色为黄色[[UIColor yellowColor] set]//使用指定颜色来设置该CGContextRef的填充颜色void CGContextSetFillColorWithColor(CGContextRef__nullable c, CGColorRef __nullable color)//使用指定颜色来设置该CGContextRef的线条颜色void CGContextSetStrokeColorWithColor(CGContextRef__nullable c, CGColorRef __nullable color)//颜色空间填充void CGContextSetFillColorSpace(CGContextRef__nullable c, CGColorSpaceRef__nullable space)//设置线框颜色空间void CGContextSetStrokeColorSpace(CGContextRef__nullable c, CGColorSpaceRef __nullable space)//设置填充颜色空间 CGFloat redColor[4] = {1.0,0,0,1.0};void CGContextSetFillColor(CGContextRef__nullable c,const CGFloat *__nullable components)//设置画笔颜色 CGFloat redColor[4] = {1.0,0,0,1.0};void CGContextSetStrokeColor(CGContextRef__nullable c,const CGFloat *__nullable components)//设置该CGContextRef使用位图填充void CGContextSetFillPattern(CGContextRef__nullable c, CGPatternRef__nullable pattern,const CGFloat * __nullable components)//设置该CGContextRef使用位图绘制线条、边框void CGContextSetStrokePattern(CGContextRef__nullable c, CGPatternRef__nullable pattern,const CGFloat * __nullable components)//设置该CGContextRef采用位图填充的相位void CGContextSetPatternPhase(CGContextRef__nullable c, CGSize phase)//使用灰色来设置该CGContextRef的填充颜色void CGContextSetGrayFillColor(CGContextRef__nullable c, CGFloat gray, CGFloat alpha)//使用灰色来设置该CGContextRef的线条颜色void CGContextSetGrayStrokeColor(CGContextRef__nullable c, CGFloat gray, CGFloat alpha)//使用RGB颜色模式来设置该CGContextRef的填充颜色void CGContextSetRGBFillColor(CGContextRef__nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)//设置画笔颜色void CGContextSetRGBStrokeColor(CGContextRef__nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)//使用CMYK颜色模式来设置该CGContextRef的填充颜色void CGContextSetCMYKFillColor(CGContextRef__nullable c, CGFloat cyan, CGFloat magenta, CGFloat yellow, CGFloat black, CGFloat alpha)//使用CMYK颜色模式来设置该CGContextRef的线条颜色void CGContextSetCMYKStrokeColor(CGContextRef__nullable c, CGFloat cyan, CGFloat magenta, CGFloat yellow, CGFloat black, CGFloat alpha)//在当前图形状态设置渲染意向void CGContextSetRenderingIntent(CGContextRef__nullable c, CGColorRenderingIntent intent)

图片UIKit是坐标系是y轴向下的; Core Graphics三个基于2D的图纸绘制引擎,它的坐标系则是y轴向上的;而OpenGL ES是One plusSDK的2D和3D绘制引擎,它应用右手坐标系,它的坐标系也是y轴向上的,假若不思谋z轴,在二维下它的坐标系和Quartz是均等的。所以图像绘制后会倒立过来,我们得以改善坐标系来管理;可能使用UIImage的drawInRect函数,该函数内部能自动管理图片的准确方向。

//绘制图像到图形上下文中void CGContextDrawImage(CGContextRef__nullable c, CGRect rect, CGImageRef __nullable image)//重复绘制的图像,扩展到提供的矩形,填补当前剪辑区域void CGContextDrawTiledImage(CGContextRef__nullable c, CGRect rect, CGImageRef __nullable image)//获取当前CGContextRef在放大图片时的插值质量CGInterpolationQuality CGContextGetInterpolationQuality(CGContextRef__nullable c)//设置图形上下文的插值质量水平void CGContextSetInterpolationQuality(CGContextRef__nullable c, CGInterpolationQuality quality)

只顾:因为UIKit和CG坐标系y轴相反,所以图片绘制将会上下颠倒。

1.可以通过修改当前坐标系来恢复。CGContextTranslateCTM(context, 0, height); CGContextScaleCTM(context, 1.0, -1.0); 2.使用UIImage的drawInRect函数,该函数内部能自动处理图片的正确方向UIGraphicsPushContext; [image drawInRect:CGRectMake(0, 0, width, height)]; UIGraphicsPopContext(); 

阴影

//设置阴影在X、Y方向上的偏移,以及模糊度和阴影的颜色void CGContextSetShadowWithColor(CGContextRef__nullable c, CGSize offset, CGFloat blur, CGColorRef __nullable color)//设置阴影在X、Y方向上的偏移,以及模糊度(blur值越大,阴影越模糊)。该函数没有设置阴影颜色,默认使用1/3透明的黑色(即RGBA{0, 0, 0, 1.0/3.0})作为阴影颜色void CGContextSetShadow(CGContextRef__nullable c, CGSize offset, CGFloat blur)

渐变

//绘制一个渐变填充定义的出发点和落脚点沿线变化void CGContextDrawLinearGradient(CGContextRef__nullable c, CGGradientRef __nullable gradient, CGPoint startPoint, CGPoint endPoint, CGGradientDrawingOptions options)//绘制一个沿着由所提供的开始和结束的圆限定的区域变化的渐变填充void CGContextDrawRadialGradient(CGContextRef__nullable c, CGGradientRef __nullable gradient, CGPoint startCenter, CGFloat startRadius, CGPoint endCenter, CGFloat endRadius, CGGradientDrawingOptions options)//使用指定的阴影的背景,填充剪切路径void CGContextDrawShading(CGContextRef __nullable c, __nullable CGShadingRef shading) //示例 CGContextRef context = UIGraphicsGetCurrentContext(); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); NSArray *colors = @[(__bridge id)UIColor.redColor.CGColor, (__bridge id)UIColor.yellowColor.CGColor]; CGGradientRef gradient = CGGradientCreateWithColors(colorSpace,(__bridge CFArrayRef)colors, NULL); CGPoint startPoint = CGPointMake(0, rect.size.height / 2); CGPoint endPoint = CGPointMake(rect.size.width, startPoint.y); CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation); CGGradientRelease; CGColorSpaceRelease(colorSpace);

文本

//设置当前字符间距void CGContextSetCharacterSpacing(CGContextRef__nullable c, CGFloat spacing)//设置要绘制文本的位置void CGContextSetTextPosition(CGContextRef__nullable c, CGFloat x, CGFloat y)//返回在绘制文本的位置CGPoint CGContextGetTextPosition(CGContextRef __nullable c)//设置当前文本矩阵void CGContextSetTextMatrix(CGContextRef__nullable c, CGAffineTransform t)//返回当前文本矩阵CGAffineTransform CGContextGetTextMatrix(CGContextRef__nullable c)//设置当前文本的绘图模式void CGContextSetTextDrawingMode(CGContextRef__nullable c, CGTextDrawingMode mode)//设置上下文的字体void CGContextSetFont(CGContextRef__nullable c, CGFontRef __nullable font)//设置上下文的字体大小void CGContextSetFontSize(CGContextRef__nullable c, CGFloat size)//在所提供的位置绘制字形void CGContextShowGlyphsAtPositions(CGContextRef__nullable c, const CGGlyph * __nullable glyphs, const CGPoint * __nullable Lpositions, size_t count)

PDF

//绘制一个PDF页面到当前的用户空间void CGContextDrawPDFPage(CGContextRef__nullable c, CGPDFPageRef __nullable page)

输出页面

//基于页面的图形上下文中开始了新的一页void CGContextBeginPage(CGContextRef__nullable c,const CGRect *__nullable mediaBox)//在基于页面的图形上下文结束当前的页面void CGContextEndPage(CGContextRef__nullable c)

上下文相关措施

//图形上下文的引用计数+1 (CGContextRef __nullable)CGContextRetain(CGContextRef__nullable c)//图形上下文的引用计数-1void CGContextRelease(CGContextRef__nullable c)//强制所有挂起的绘图操作在一个窗口上下文中立即被渲染到目标设备 void CGContextFlush(CGContextRef__nullable c)//将一个窗口的图像上下文内容更新,即所有的绘图操作都会在下次同步到窗口上void CGContextSynchronize(CGContextRef__nullable c)

抗锯齿

//设置该CGContextRef是否应该抗锯齿(即光滑图形曲线边缘,让字体渲染比较清晰 提高画质以使之柔和 )void CGContextSetShouldAntialias(CGContextRef__nullable c, bool shouldAntialias)//设置该CGContextRef是否允许抗锯齿void CGContextSetAllowsAntialiasing(CGContextRef__nullable c, bool allowsAntialiasing)

字体呈现

//设置该CGContextRef是否允许光滑字体void CGContextSetShouldSmoothFonts(CGContextRef__nullable c, bool shouldSmoothFonts)//设置该CGContextRef是否允许光滑字体void CGContextSetAllowsFontSmoothing(CGContextRef__nullable c, bool allowsFontSmoothing)//启用或禁用图形上下文中的子像素定位。void CGContextSetShouldSubpixelPositionFonts( CGContextRef __nullable c, bool shouldSubpixelPositionFonts)//设置是否允许图形上下文的子像素定位void CGContextSetAllowsFontSubpixelPositioning( CGContextRef __nullable c, bool allowsFontSubpixelPositioning)//在图形上下文中启用或禁用子像素量化。void CGContextSetShouldSubpixelQuantizeFonts( CGContextRef __nullable c, bool shouldSubpixelQuantizeFonts)//设置是否允许图形上下文的子像素量化void CGContextSetAllowsFontSubpixelQuantization( CGContextRef __nullable c, bool allowsFontSubpixelQuantization)

透明层

/* 开始一个透明层。 直到相应的调用CGContextEndTransparencyLayer,在指定范围内的所有后续绘制操作组合到一个完全透明的背景(它被视为一个单独的目标缓冲区从上下文)。在透明层中绘制需要三步: 1. 调用函数 CGContextBeginTransparencyLayer 2. 在透明层中绘制需要组合的对象 3. 调用函数 CGContextEndTransparencyLayer*/void CGContextBeginTransparencyLayer(CGContextRef__nullable c, CFDictionaryRef __nullable auxiliaryInfo)//开始透明度层,它的边界是指定的矩形,其内容是有界的void CGContextBeginTransparencyLayerWithRect( CGContextRef __nullable c, CGRect rect, CFDictionaryRef__nullable auxInfo)//结束一个透明层void CGContextEndTransparencyLayer(CGContextRef__nullable c)

客户空间对设施空间的生成

/* 获取Quartz转换用户空间和设备空间的仿射变换 */CGAffineTransform CGContextGetUserSpaceToDeviceSpaceTransform(CGContextRef__nullable c)/*———— 点 ————*//* 将一个CGPoint数据结构从一个空间变换到另一个空间(DeviceSpace). */CGPoint CGContextConvertPointToDeviceSpace(CGContextRef__nullable c, CGPoint point)/* 将一个CGPoint数据结构从一个空间变换到另一个空间(UserSpace). */CGPoint CGContextConvertPointToUserSpace(CGContextRef__nullable c, CGPoint point)/*———— 大小 ————*//* 将一个CGSize数据结构从一个空间变换到另一个空间(DeviceSpace). */CGSize CGContextConvertSizeToDeviceSpace(CGContextRef__nullable c, CGSize size)/* 将一个CGSize数据结构从一个空间变换到另一个空间(UserSpace). */CGSize CGContextConvertSizeToUserSpace(CGContextRef__nullable c, CGSize size)/*———— 矩形 ————*//* 将一个CGPoint数据结构从一个空间变换到另一个空间(DeviceSpace)。 */CGRect CGContextConvertRectToDeviceSpace(CGContextRef__nullable c, CGRect rect)/* 将一个CGPoint数据结构从一个空间变换到另一个空间(UserSpace)。 */CGRect CGContextConvertRectToUserSpace(CGContextRef__nullable c, CGRect rect)

viewWillAppear

updateViewConstraints

viewWillLayoutSubviews

viewDidLayoutSubviews

viewDidAppear

 

viewWillDisappear

viewDidDisappear

dealloc    (NSObject)

 

didReceiveMemoryWarning

 

二、load、initialize、init

load、initialize是继续的NSObject的主意。这一个在其它随笔里写过,就不详述了。大意说下。

在main方法还未实施的时候 就能够 加载全体类,调用全部类的load方法。 

诚如会在load中达成Method Swizzle。

开端化对象,调用alloc的时候会调用initialize方法。此时是分配内部存款和储蓄器。

init方法是在内部存款和储蓄器中成立好对象。

 

三、 initWithCoder、initWithNibName、awakeFromNib

 

1、initWithCoder、awakeFromNib

initWithCoder:反归档,假设指标是从文件分析来的 就能调用。

awakeFromNib: 从xib大概storyboard加载完成 会调用。
新建UIView的子类何况想在load nib的时候做一些开始化职业的时候 能够重写awakeFromNib。bundle在load nib后会给各个view对象发送二个awakeFromNib新闻。

 

2、用storyboard,顺序:

initialize -> initWithCoder -> awakeFromNib -> loadView

 

2、用Xib或许纯代码:

如果用[[VC alloc] init] 来发轫化:

initialize -> init -> initWithNibName -> loadView

 

如果用[[VC alloc] initWithNibName:@“VC” bundle:nil] 来初叶化:

initialize -> initWithNibName -> loadView

 

选择Xib来促成VC的时候,不要重写loadView方法。借使重写了loadView方法,则Xib中View就能够灰飞烟灭,形成空View。

下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.tk-web.com. bb电子糖果派对有限公司 版权所有