UIKit和Core Graphics绘图——构造路径,阴影以及渐变扩展

UIKit与Core Graphics绘图技术详解 Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、遮蔽、图像数据管理、图像的创建、遮罩以及PDF文档的创建、显示和分析。为了从感官上对这些概念做一个入门的认识,你可以运行一下官方的example code。 阅读详情

构造路径


通常,一系列点组合一起构成一个形状,而若干个形状组合在一起可以构造一个路径,路径可以规则也可以不规则,随意组合。通过Core Graphics很容易管理路径。

主要用到的函数或方法:

CGPathCreateMutable() 创建可变路径的方法
CGContextAddPath 将路径加入到上下文中
CGContextDrawPath绘制路径
CGPathRelease 路径也需要释放

用路径画一组对角线


- (void)drawRect:(CGRect)rect
{
    // Drawing code
    [self drawTwoLines];
}

- (void)drawTwoLines
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, screenRect.origin.x, screenRect.origin.y);
    CGPathAddLineToPoint(path, NULL, screenRect.size.width, screenRect.size.height);
    CGPathMoveToPoint(path, NULL, screenRect.size.width, screenRect.origin.y);
    CGPathAddLineToPoint(path, NULL, screenRect.origin.x, screenRect.size.height);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddPath(context, path);
    CGContextSetLineWidth(context, 1.0f);
    [[UIColor blueColor] setStroke];
    CGContextDrawPath(context, kCGPathStroke);      //第二个参数为画路径的样式,这里为描线,也可以有填充或者既描线也填充
    
    CGPathRelease(path);
}

效果




绘制多个矩形


- (void)drawRect:(CGRect)rect
{
    // Drawing code
    //[self drawTwoLines];
    [self drawTwoRects];
}

- (void)drawTwoRects
{
    CGMutablePathRef path = CGPathCreateMutable();
    
    CGRect rect1 = CGRectMake(20, 20, 200, 100);
    CGRect rect2 = CGRectMake(20, 200, 200, 80);
    CGRect rects[] = {rect1, rect2};
    
    CGPathAddRects(path, NULL, (const CGRect *)rects, 2);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddPath(context, path);
    CGContextSetLineWidth(context, 2.0f);
    
    [[UIColor yellowColor] setFill];    //填充颜色
    [[UIColor blackColor] setStroke];   //线条颜色
    
    CGContextDrawPath(context, kCGPathFillStroke);  //设置既填充也描线
    
    CGPathRelease(path);
}


效果



绘制阴影


使用上下文绘制阴影主要用到两个函数

CGContextSetShadow()
三个参数,图形上下文,偏移量(CGSize),模糊值。
CGContextSetShadowWithColor()
增加了一个参数,CGColorRef可以设置阴影的颜色

- (void)drawTwoRectsWithShadow
{
    CGMutablePathRef path = CGPathCreateMutable();
    
    CGRect rect1 = CGRectMake(55, 60, 150, 150);
    CGPathAddRect(path, NULL, rect1);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddPath(context, path);
    CGContextSetShadowWithColor(context, CGSizeMake(10, 10), 20.0f, [[UIColor grayColor] CGColor]);
    [[UIColor purpleColor] setFill];
    CGContextDrawPath(context, kCGPathFill);
    CGPathRelease(path);
    
    CGMutablePathRef path2 = CGPathCreateMutable();
    
    CGRect rect2 = CGRectMake(130, 290, 100, 100);
    CGPathAddRect(path2, NULL, rect2);
    CGContextAddPath(context, path2);
    [[UIColor yellowColor] setFill];
    CGContextDrawPath(context, kCGPathFill);
    
    CGPathRelease(path2);
}


由于我们没有对上下文SaveGState和Restore所以,绘制出来的两个矩形都会有阴影




渐变扩展


上篇文章的线性渐变使用的是CGGradientsCreateWithColors函数,这里我们使用细化到颜色成分构成的函数来进行CGGradientRef的初始化:
CGGradientCreateWithColorComponents
这里比之前函数增加了一个参数,元素数量,而且传入颜色数组也变为了颜色构成的数组。

如果想知道一个颜色比如[UIColor purpleColor]具体构成,可以调用CGColorGetComponents来获取其构成,返回一个数组,包括R,G,B以及alpha的值。

- (void)drawingGradient
{
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, (CGFloat[]){
        0.8, 0.2, 0.2, 1.0,
        0.2, 0.8, 0.2, 1.0,
        0.2, 0.2, 0.8, 1.0
    }, (CGFloat[]){
        0.0, 0.5, 1.0
    }, 3);
    
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextDrawLinearGradient(context, gradient, CGPointMake(100, 200), CGPointMake(220, 280), 0);
    
    CGContextRestoreGState(context);
    CGGradientRelease(gradient);
    CGColorSpaceRelease(colorSpace);
}

调用这个函数的效果:



下面我们可以试图修改DrawLinearGradient函数的最后一个参数值来让渐变后边缘颜色扩展到整个屏幕。

    //CGContextDrawLinearGradient(context, gradient, CGPointMake(100, 200), CGPointMake(220, 280), 0);
    CGContextDrawLinearGradient(context, gradient, CGPointMake(100, 200), CGPointMake(220, 280), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);

然后就变成了这样



比较丑,凑合看吧- -

以上为本篇文章全部内容,欢迎指正和交流。转载注明出处~
CoreUI 动态bootstrap admin模板 动态的Bootstrap CoreUI模板,比GitHub开源版的多了不少功能,但是版本稍微早一些,比较适合新手研究学习,也适合老手直接动手改造!!! 立即下载

相关推荐

多臂老虎机——入门强化学习

多臂老虎机(Multi-Armed Bandit,MAB)问题是强化学习的经典入门例子,也是理解探索与利用(exploration-exploitation)平衡的重要案例。

qq_56683019的博客 2458

UIKit和Core Graphics绘图——绘制光泽,仿射变换与矩阵变换

绘制光泽 在一个矩形上绘制光泽其实可以通过在原有色彩的基础上绘制一层透明度较高的渐变来实现。首先先看以前绘制渐变的函数。 void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, CGColorRef endColor) { CGContextSaveGState(con...

jishublog 176

手机相机基础技术解析:从硬件到算法的全面指南

手机相机的成像过程可简化为的链路,其核心硬件包括 镜头、CMOS传感器、ISP(图像信号处理器) 以及配套的软件算法。

weixin_44239603的博客 2448

UIKit和Core Graphics绘图(二)——构造路径,阴影以及渐变扩展

构造路径 通常,一系列点组合一起构成一个形状,而若干个形状组合在一起可以构造一个路径,路径可以规则也可以不规则,随意组合。通过Core Graphics很容易管理路径。  主要用到的函数或方法:  CGPathCreateMutable()  创建可变路径的方法  CGContextAddPath 将路径加入到上下文中  CGContextDrawPath 绘制路径 

逢个场,作个戏 568

欧姆龙SYSMAC STUDIO如何与基恩士SR-1000进行EIP通信

简要介绍一下扫码枪和欧姆龙sysmac的配置

weixin_42031602的博客 4779

Win本地部署DeepSeek

Ollama 提供了简单的接口,用于创建、运行和管理这些模型,同时还维护了一个丰富的预构建模型库,可以轻松集成到各种应用程序中。重启ollama,具体操作为打开搜索ollama进程,将其结束进程,之后再执行相关模型下载命令即可,或重启电脑!Ollama支持多种DeepSeek模型版本,用户可以根据硬件配置选择合适的模型。配置添加系统环境变量OLLAMA_MODELS,设置其值为新的路径,点击确定应用。安装完成后,在终端输入以下命令,检查Ollama版本。:14B、32B或70B版本,适合高端GPU。

m0_67297673的博客 2389

UIKit和Core Graphics绘图——字符串,线条,矩形,渐变

概述 CoreGraphics也称为Quartz 2D 是UIKit下的主要绘图系统,频繁的用于绘制自定义视图。Core Graphics是高度集成于UIView和其他UIKit部分的。Core Graphics数据结构和函数可以通过前缀CG来识别。 视图可以通过子视图、图层或实现drawRect:方法来表现内容,如果说实现了drawRect:方法,那么最好就不要混用其他方法了,如图层

RannieR的技术博客 8840

【Gin框架入门到精通系列01】Gin框架介绍与环境搭建

本文是Gin框架入门到精通系列的第一篇,系统介绍Gin框架的基本概念、核心特性以及环境搭建。无论你是Go语言新手还是有经验的开发者,都能通过本文快速掌握Gin框架的基础知识,创建并运行你的第一个Gin应用。

GopherTribe的博客 1560

UIKit和Core Graphics绘图——绘制虚线,椭圆以及饼图

绘制虚线 虚线绘制主要调用CGContextSetLineDash函数。 这个函数有4个参数,除了一个是上下文外,phase为初始跳过几个点开始绘制,第三个参数为一个CGFloat数组,指定你绘制的样式,绘几个点跳几个点(下面为绘10个点,跳过5个),最后一个参数是上个参数数组元素的个数。 - (void)drawLineDash { CGContextRef con

RannieR的技术博客 3590

Power Automate实战:用SharePoint REST API批量处理列表数据(附JSON解析技巧)

本文深入探讨了如何利用Power Automate调用SharePoint REST API实现列表数据的批量自动化处理。文章详细解析了API的协同工作原理、高效的数据获取与筛选技巧,并重点分享了JSON数据解析的核心难点与实战解决方案,旨在帮助企业用户构建稳定可靠的数据处理流程,提升运营效率。

coffee的博客 769

ComfyUI-controlnet控制出图

提供加载预处理器节点。

Bu2n的博客 5494

Core Graphics 绘图

转自:http://blog.youkuaiyun.com/richard_rufeng/article/details/25146489 第一、UIKit:cocoa touch 框架,高层次的框架,允许开发人员创建视图、窗口、按钮和其他UI组件。同时将一些低级别的api引入到易于使用的高级别API中。 Quartz 2D:IOS上绘图的主要引擎;UIKit上就使用Quartz。 Core

C语言编程,IOS软件开发,张明生 730

YOLO11改进-注意力-引入自调制特征聚合模块SMFA

SMFA(自调制特征聚合模块): SMFA模块用于协同建模局部和非局部信息,它分为两个分支:一个是EASA(Efficient Approximation of Self-Attention,简化的自注意力分支),用于捕获非局部信息;另一个是LDE(Local Detail Estimation,局部细节估计分支),用于捕获局部细节。EASA通过对输入特征进行下采样,然后利用全局特征的方差进行调制,再与原始特征进行聚合,提取非局部结构信息。LDE分支则通过卷积操作提取输入特征中的高频局部信息。

qq_64693987的博客 2208

Swift中Core Graphics与UIKit如何结合使用

然而,在某些情况下,UIKit提供的界面组件可能无法满足我们的需求,这时就需要使用Core Graphics来进行更底层的绘图操作。在Swift中,Core Graphics的API主要包含在CoreGraphics框架中,通过该框架,我们可以使用Swift语言来调用这些API。方法中使用Core Graphics进行绘图外,我们还可以使用UIKit的CALayer与Core Graphics结合来实现更复杂的绘图效果。然后,我们使用Core Graphics的API在这个上下文中绘制了一个红色的圆形。

SherryMacadam的博客 1325

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

使用Core Graphics 进行iOS绘图

Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、遮蔽、图像数据管理、图像的创建、遮罩以及PDF文档的创建、显示和分析。为了从感官上对这些概念做一个入门的认识,你可以运行一下官方的example code。      iOS

萱的house 1959

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Core Graphics与OpenGL的关系

+demo 连接  http://blog.youkuaiyun.com/zhibudefeng/article/details/8463268 本文是《Programming iOS5》中Drawing一章的翻译,考虑到主题完整性,在翻译过程中我加入了一些书中没有涉及到的内容。希望本文能够对你有所帮助。 本文由海水的味道翻译,转载请注明译者和出处,请勿用于商业用途! Core Gra

u014773226的博客 3839

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IOS画图库 - Core Graphics/QuartZ 2D 和OpenGL ES

转自:http://blog.sina.com.cn/s/blog_79fded950101h3g4.html +demo 连接  http://blog.youkuaiyun.com/zhibudefeng/article/details/8463268 本文是《Programming iOS5》中Drawing一章的翻译,考虑到主题完整性,在翻译过程中我加入了一些书中没有涉及到的内容。希

Developer_Zhang的专栏 3395

iOS天空效果实现:Core Animation与Core Graphics实战指南

在iOS应用开发中,界面视觉效果优化是提升用户体验的关键环节。Core Animation作为iOS核心动画框架,通过硬件加速实现高性能的图层动画和渐变效果,而Core Graphics则提供了强大的2D绘图能力。这两种技术的结合能够创造出流畅自然的动态背景效果,特别适用于需要实时渲染的场景。在天气预报、旅行记录和游戏等应用中,天空背景效果是常见的视觉元素,通过代码实时生成天空渐变和云层动画,不仅可以减少应用体积,还能实现根据时间、天气条件动态调整的自适应效果。本文基于Core Animation和Core

cneo2012的博客 405

Core Graphics快速入门——从一行代码说起

Core Graphics入门想必每个第一次接触Core Graphics的开发者都被无数的API、混乱的代码逻辑折腾得头疼不已,甚至望而却步。即使是绘制一个简单的矩形也看上去非常繁琐。本文换一个角度,整理一下有关Core Graphics的知识,也算作是这段时间学习的总结。Core Graphics和UIKit的区别首先从概念上了解一下:根据苹果的描述,UIKit是我们最容易也是最常接触到的框架。

KT的iOS开发小站 3331

IOS上的图形和动画处理 CORE GRAPHICS

在cocoa touch 中一个应用程序是由多个窗口和视图构成。一个带有用户界面的应用程序至少包含一个窗口,同时可以包含一个或者多个视图。在cocoa Touch中,一个窗口是UIWindow的一个实例,通常,一个应用程序会打开主窗口,然后开发人员向窗口中添加各种视图:如按钮,标签,图像,或者自定义的控件。所有这些与UI相关的组件都由UIKit处理。 图形与动画:在IOS开发中 苹果公司向开

OnWay的专栏 596
上一篇: UIKit和Core Graphics绘图——字符串,线条,矩形,渐变
下一篇: UIKit和Core Graphics绘图——绘制虚线,椭圆以及饼图
RannieR
博客等级 码龄14年 180粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值