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

本文详细介绍了使用CoreGraphics进行绘图的基本方法,包括路径绘制、矩形绘制、阴影效果及线性渐变的实现方式。文章通过实例展示了如何创建路径、绘制对角线和矩形,并进一步讲解了阴影和渐变效果的具体应用。

构造路径


通常,一系列点组合一起构成一个形状,而若干个形状组合在一起可以构造一个路径,路径可以规则也可以不规则,随意组合。通过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);

然后就变成了这样



比较丑,凑合看吧- -

以上为本篇文章全部内容,欢迎指正和交流。转载注明出处~
### 安装 RabbitMQ Server 3.8.32 on CentOS 7CentOS 7安装特定版本的 RabbitMQ Server(如 3.8.32)可以通过下载官方提供的 `.rpm` 包并使用 `yum` 或 `dnf` 进行安装。以下是详细的步骤: 1. **添加 Erlang Solutions 仓库** RabbitMQ 依赖于 Erlang,因此需要先安装合适的 Erlang 版本。可以使用 Erlang Solutions 提供的仓库来安装 Erlang。 ```bash curl -fsSL https://packages.erlang-solutions.com/rpm/centos/erlang_solutions.asc | sudo rpm --import - echo "deb https://packages.erlang-solutions.com/rpm/centos-7-x86_64/ stable main" | sudo tee /etc/yum.repos.d/erlang-solutions.repo ``` 2. **安装 Erlang** 安装适用于 RabbitMQ 的 Erlang 版本。RabbitMQ 3.8.x 需要 Erlang 21.x 到 23.x 之间的版本。 ```bash sudo yum install -y esl-erlang ``` 3. **下载 RabbitMQ 3.8.32 RPM 包** 可以从 [RabbitMQ 官方网站](https://www.rabbitmq.com/releases/rabbitmq-server/) 下载特定版本的 `.rpm` 包。 ```bash wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.32/rabbitmq-server-3.8.32-1.el7.noarch.rpm ``` 4. **安装 RabbitMQ Server** 使用 `yum` 或 `rpm` 命令安装下载的 `.rpm` 包。 ```bash sudo yum install -y rabbitmq-server-3.8.32-1.el7.noarch.rpm ``` 5. **启动 RabbitMQ 服务** 安装完成后,启动 RabbitMQ 服务并设置为开机自启。 ```bash sudo systemctl enable rabbitmq-server sudo systemctl start rabbitmq-server ``` 6. **启用管理插件** 如果需要使用 Web 管理界面,可以启用管理插件。 ```bash sudo rabbitmq-plugins enable rabbitmq_management ``` 7. **创建管理员用户** 创建一个具有管理权限的用户,并为其分配权限。 ```bash sudo rabbitmqctl add_user admin your_password sudo rabbitmqctl set_user_tags admin administrator sudo rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" ``` 8. **配置防火墙** 如果系统启用了防火墙(如 `firewalld`),需要开放 RabbitMQ 的端口(默认为 5672,管理界面为 15672)。 ```bash sudo firewall-cmd --permanent --add-port=5672/tcp sudo firewall-cmd --permanent --add-port=15672/tcp sudo firewall-cmd --reload ``` 9. **验证安装** 可以通过以下命令检查 RabbitMQ 的状态和集群信息。 ```bash sudo systemctl status rabbitmq-server sudo rabbitmqctl cluster_status ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值