首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >似乎无法摆脱UIBezierPath中的行

似乎无法摆脱UIBezierPath中的行
EN

Stack Overflow用户
提问于 2013-07-16 20:17:25
回答 2查看 532关注 0票数 1

好吧,所以我需要一个圆形三角形。所以我所做的就是使用一种类似于我在其他矢量绘图程序中使用的技术。绘制三角形并使用笔画创建圆角。工作也像一个魅力,直到我需要减少阿尔法的颜色用来填充和笔画的UIBezierPath。出于某种原因,我一直得到这个嵌入的轮廓,它与填充和笔画的颜色不一样。不知怎么的,alpha值没有得到尊重。也许我在这里忽略了一些愚蠢的东西,但是,尽管我可能会尝试,但我无法得到阿尔法值低于1的三角形,这就是我得到的:

下面是简单的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    - (void)drawRect:(CGRect)rect
{
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint: CGPointMake(63.5, 10.5)];
    [path addLineToPoint: CGPointMake(4.72, 119.5)];
    [path addLineToPoint: CGPointMake(122.28, 119.5)];
    [path addLineToPoint: CGPointMake(63.5, 10.5)];
    [path closePath];
    path.miterLimit = 7;

    path.lineCapStyle = kCGLineCapRound;

    path.lineJoinStyle = kCGLineJoinRound;
    path.lineWidth = 8;

    UIColor *whiteAlph5 = [UIColor colorWithWhite:0.6 alpha:0.5];

    [whiteAlph5 setFill];
    [whiteAlph5 setStroke];


    [path fill];
    [path stroke];
}

如果这是我为填充和笔画设置的唯一颜色的话,我不明白为什么这条线不是"whiteAlpha5“。我想我可以画出圆角三角形,把曲线加到拐角处,但我只是好奇为什么这个happens.Thanks预先.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-16 22:36:40

这条线是因为你的笔画和填充是绘制到相同的像素。因为笔画和填充都是部分透明的,颜色就会累积起来。

解决这个问题的一种方法就是创建一条勾勒出你的圆角三角形的路径,然后填充它而不用抚摸它。

下面是一个类别的接口,它创建了一个概述圆形多边形的路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@interface UIBezierPath (MyRoundedPolygon)

+ (UIBezierPath *)my_roundedPolygonWithSides:(int)sides center:(CGPoint)center
    vertexRadius:(CGFloat)vertexRadius cornerRadius:(CGFloat)cornerRadius
    rotationOffset:(CGFloat)rotationOffset;

@end

以下是实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@implementation UIBezierPath (MyRoundedPolygon)

static CGPoint vertexForPolygon(int sides, CGPoint center, CGFloat circumradius, CGFloat index) {
    CGFloat angle = index * 2 * M_PI / sides;
    return CGPointMake(center.x + circumradius * cosf(angle),
        center.y + circumradius * sinf(angle));
}

+ (UIBezierPath *)my_roundedPolygonWithSides:(int)sides center:(CGPoint)center
    vertexRadius:(CGFloat)vertexRadius cornerRadius:(CGFloat)cornerRadius
    rotationOffset:(CGFloat)rotationOffset
{
    CGFloat circumradius = vertexRadius + cornerRadius;
    CGPoint veryLastVertex = vertexForPolygon(sides, center, circumradius, rotationOffset - 1);
    CGPoint currentVertex = vertexForPolygon(sides, center, circumradius, rotationOffset);
    CGMutablePathRef cgpath = CGPathCreateMutable();
    CGPathMoveToPoint(cgpath, NULL, (veryLastVertex.x + currentVertex.x) / 2,
        (veryLastVertex.y + currentVertex.y) / 2);
    for (CGFloat i = 0; i < sides; ++i) {
        CGPoint nextVertex = vertexForPolygon(sides, center, circumradius,
            i + 1 + rotationOffset);
        CGPathAddArcToPoint(cgpath, NULL, currentVertex.x, currentVertex.y,
            nextVertex.x, nextVertex.y, cornerRadius);
        currentVertex = nextVertex;
    }
    CGPathCloseSubpath(cgpath);
    UIBezierPath *path = [self bezierPathWithCGPath:cgpath];
    CGPathRelease(cgpath);
    return path;
}

@end

下面是你如何使用它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@implementation MyView

- (void)drawRect:(CGRect)rect
{
    CGRect bounds = self.bounds;
    CGPoint center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
    UIBezierPath *path = [UIBezierPath my_roundedPolygonWithSides:3 center:center
        vertexRadius:70 cornerRadius:8 rotationOffset:0.25];
    [[UIColor colorWithWhite:0.6 alpha:0.5] setFill];
    [path fill];
}

@end

结果是:

注意,将rotationOffset设置为0.25会使三角形旋转四分之一圈。把它设为零会给你一个直角三角形。

票数 2
EN

Stack Overflow用户

发布于 2013-07-16 21:39:22

如果必须进行笔划,请将对[UIBezierPath stroke]的调用更改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[path fill];
[path strokeWithBlendMode:kCGBlendModeCopy alpha:1.0];

这应该能达到你想要的效果(我想-还没能测试)

这是一个猜测,但我想你在这里看到的本质上是两层半透明的白色,一层画在另一层上面。当三角形刚刚被填充时,它将是你所期望的。当你笔画的时候,它画的颜色是一样的--但它是在现有颜色的基础上添加的,而不是替换它,这就是如果你以前在油漆程序或类似的程序中这样做的效果。因此,在笔划和填充重叠的地方,你会得到比你想要的更强的白色。仅仅使用填充本身就可以解决这个问题,但可能不会得到你想要的效果。

如果你需要一个视觉演示,我的意思,你可以这样做,在Photoshop。创建一个黑色背景的新图像,并在上面创建一个新的图层,设置为50%的不透明度。在上面画一个白色的正方形(由于不透明,它看起来是灰色的)。然后,在不改变层的情况下,画一条线穿过它。您不会看到这条线,因为它正在替换现有的颜色--这就是您期望的代码出现的情况。然后,在上面添加另一层,也设置为50%的不透明度。在这一层画一条线,穿过正方形。你会看到这条线是一种更亮的灰色。这是加性的,两个层上的白色重叠--您的代码正在创建的效果。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17691035

复制
相关文章
flutter的列表下拉刷新
flutter的列表下拉刷新需要借助一个组件来实现,这个组件的名字是RefreshIndicator,直译过来就是刷新指示灯。
挥刀北上
2021/01/07
4.8K0
flutter的列表下拉刷新
模板代码 - 列表和下拉刷新
摘要总结:本篇文章主要介绍了如何使用ViewStub和ViewStubCompat实现多布局,以便在不同的屏幕尺寸和分辨率下达到较好的展示效果。同时,还介绍了如何使用ViewStub和ViewStubCompat实现内边距和圆角,以及自定义属性在布局中的使用。
用户1172465
2018/01/05
2.9K0
【Flutter】ListView 列表高级功能 ( RefreshIndicator 下拉刷新组件 )
使用 Flutter 提供的 RefreshIndicator 组件 , 可以实现下拉刷新的功能 ;
韩曙亮
2023/03/29
2K0
【Flutter】ListView 列表高级功能 ( RefreshIndicator 下拉刷新组件 )
微信小程序列表数据的局部刷新
本文由来源 17,由 system_mush 整理编辑,其版权均为 17 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2020/04/10
2.6K0
RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?
当列表数据变更时,调用 notifyDataSetChanged() 是最省事的。无需关心变更的细节,一股脑统统刷一遍就完事了。但这样做也是最昂贵的。读完这一篇源码走查就知道为啥它这么昂贵了。
Rouse
2021/05/28
3.4K0
RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?
​借助云开发数据库实现小程序列表上拉刷新功能丨云开发101
上一期101专栏中,我们介绍了如何借助云开发数据库实现小程序的列表触底自动加载功能,相对应的,小程序列表上拉刷新又该如何实现呢?本期专栏就来为大家解答。
腾讯云开发TCB
2019/10/08
6040
微信小程序----列表下拉刷新上拉加载(MUI下拉刷新和上拉加载更多)
效果图 原理 利用微信小程序的onPullDownRefresh函数(下拉刷新监听函数)和onReachBottom函数(上拉加载监听函数)监听页面的下拉和上拉动态,从而对页面数据进行修改! 页
Rattenking
2021/02/01
1.9K0
微信小程序----列表下拉刷新上拉加载(MUI下拉刷新和上拉加载更多)
MariaDB数据库刷新权限表命令
当授权或者修改用户权限时,往往不会马上生效的这是因为数据库没有马上去更新权限相关的表,而是在内存中所以一般都会使用更新权限表,来实现马上更新
用户9006224
2022/12/21
1K0
Java常用数据库列表
MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现在由Oracle公司负责维护和支持。MySQL是最流行的数据库之一,被广泛用于各种应用程序和网站开发。 MySQL具有以下特点:
ha_lydms
2023/08/10
5520
Java常用数据库列表
JS/JQuery页面刷新、局部刷新
//div的局部刷新 $(".dl").load(location.href+" .dl"); //全页面的刷新方法 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.reload()刷新父窗口对象(用于单开窗口) top.location.reload()刷新最顶端对象(用于多开窗口)
小语雀网
2022/05/06
5.8K0
php案例之数据库选择列表
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 cyg.php check.php 效果: ---- cyg.php <style> body{ background:#ccc; }</style> <b>数据库选择列表<b><br> <form action="check.php" method="POST">//提交到check.php <select name="database" size="10"> <option value="0"
贵哥的编程之路
2022/09/23
6260
php案例之数据库选择列表
数据库Mongodb-用户权限列表
Mongodb用户权限列表 read 允许用户读取指定数据库 readWrite 允许用户读写指定数据库 dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限 r
cwl_java
2021/08/30
7520
EasyDSS前端界面在页面缩小时内置列表仍需手动刷新的优化
RTMP协议的视频平台EasyDSS除了直播外,还支持点播,转码、上传一体化设计,使音视频资源转码后可立即面向互联网进行发布,在线上教育领域已经能够成熟落地。在开发以及功能的更新过程中,EasyDSS内还运用了很多其他层面的开发技巧,我们也会不定期在博客更新,欢迎大家了解测试。
TSINGSEE青犀视频
2021/09/07
4090
Power BI 异步刷新-查询刷新历史与手动停止刷新
有朋友在评论区提出,如果是手动刷新或者计划刷新,是否知道了requestid就同样可以手动停止呢?
陈学谦
2022/04/08
4.6K0
Power BI 异步刷新-查询刷新历史与手动停止刷新
刷新.NET
.NET Core 发布的那一天起,它在完成自我刷新的过程,一切为了适应未来,云原生。不仅仅跨平台那么简单。
李明成
2020/02/12
6210
UI 刷新
与屏幕刷新相关的有很多,比如刷新流程,屏幕缓存,周期刷新,vsync信号,SurfaceFlinger。
Yif
2020/04/25
2.1K0
5.5 PowerBI技巧-定时刷新与增量刷新
加入 PowerBI自己学 知识星球 可以:下载源文件,边学边练;遇到问题,提问交流,有问必答。
PowerBI自己学_轻松
2025/02/26
1690
5.5 PowerBI技巧-定时刷新与增量刷新
下拉刷新
getMeasuredHeight():获取测量完的高度,只要在onMeasure方法执行完,就可以用
六月的雨
2022/01/17
2.2K0
金蝶KIS&K3助记码SQL数据库批量刷新
金蝶KIS&K3助记码SQL数据库批量刷新 用的次数不多,就没有写入存储过程或者触发里面了,可以自行实现。 第一步选择对应账套的数据库,执行下面的命令,这个是一个函数。 go if exists (select * from sysobjects where name='fun_getPY' and xtype='Fn') begin drop function fun_getPY end go create function fun_getPY(@str nvarchar(4000)) re
landv
2018/06/26
7660
uni-app下拉刷新加载刷新数据
onPullDownRefresh 监听该页面用户下拉刷新事件 需要在 pages.json 里 开启 enablePullDownRefresh
达达前端
2019/10/14
7.4K0

相似问题

每晚刷新postgres数据库

20

在数据库刷新期间保留现有登录

10

SSMS数据库节点刷新导致恢复失败

10

如何在刷新数据库后保存并还原权限

10

通过每日数据库刷新撤销Server登录访问

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文