Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >似乎无法摆脱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

复制
相关文章
js获取request中的值_set协议工作原理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/09/30
7.3K0
Java中的按值传递
这个时候可能会有疑问了,为什么add方法可以修改List数组,但是append和addNum却没有修改传进来的值
俺也想起舞
2019/07/24
1.8K0
详解Java中的值传递
如果大家学过c++,那这块肯定是明白的,但是Java中没有引用传递,在编程语言中,将实参传递给方法的方式有俩种就是我们即将要说的,
秋名山码神
2022/12/13
6760
详解Java中的值传递
Java中的值传递与引用传递
在Java编程中,我们常常听到关于值传递和引用传递的讨论。这两个概念涉及到数据在方法之间如何传递的问题。理解这些概念对于正确编写Java程序至关重要。在本文中,我们将深入探讨什么是值传递和引用传递,以及为什么Java中只有值传递这一问题。
疯狂的KK
2023/09/07
3570
Java中的值传递与引用传递
java中的参数传递-值传递、引用传递
参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。
chenchenchen
2022/11/29
4.7K0
java中的参数传递-值传递、引用传递
JAVA中的值传递和引用传递
先来看一个作为程序员都熟悉的值传递的例子: ... ... //定义了一个改变参数值的函数 public static void changeValue(int x) { x = x *2; } ... ... //调用该函数 int num = 5; System.out.println(num); changeValue(num); System.out.println(num); ... ... 答案显而易见,调用函数changeValue()前后num的值都没有改变。 由此做一个引子,我用图表描绘
小柒2012
2018/04/13
1.7K0
JAVA中的值传递和引用传递
Java中的值传递与引用传递详解
方法调用是编程语言中非常重要的一个特性,在方法调用时,通常需要传递一些参数来完成特定的功能。Java语言提供了两种参数传递的方式:值传递和引用传递。
良月柒
2019/03/20
2.1K0
Java中的值传递与引用传递详解
Python中 传递值 与 传递引用 的区别
对于不可变类型传递值(不会影响原数据) 不可变类型 对于可变类型传递引用(会影响原数据) 不可变类型传递引用 python3不可变类型 Number(数字) St
zhaoolee
2018/04/19
1.9K0
Python中 传递值 与 传递引用 的区别
Java 中是“值传递”还是“引用传递”?
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
业余草
2019/10/25
7720
vim中set的用法
整理了一些vim的set用法: 1.显示隐藏分隔符 set list 可以看到分隔符为制表符。 2.取消显示隐藏制表符 set nolist 3. 显示行号 set nu 4.取消显示行号 set
生信编程日常
2020/04/01
1K0
vim中set的用法
java中的Set集合
概述 Set集合类似于一个罐子,程序可以依次把多个对象“丢进”Set集合,而Set集合通常不能记住元素的添加顺序。实际上Set就是Collection只是行为略有不同(Set不允许包含重复元素)。 Set集合不允许包含相同的元素,如果试图把两个相同元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入。
全栈程序员站长
2022/08/11
1.3K0
java中的Set集合
哈希值太大了,还是得用set
https://leetcode-cn.com/problems/intersection-of-two-arrays/
代码随想录
2021/06/17
4960
Python中set的用法
python 的集合类型和 其他语言类似, 是一个无序不重复元素集,我在之前学过的其他的语言好像没有见过这个类型,基本功能包括关系测试和消除重复元素.集合对象还支持union(联合), intersection(交), difference(差)和sysmmetricdifference(对称差集)等数学运算,和我们初中数学学的集合的非常的相似。
py3study
2020/01/09
7890
辨析Java方法参数中的值传递和引用传递
小瓜瓜作为一个Java初学者,今天跟我说她想通过一个Java方法,将外部变量通过参数传递到方法中去,进行逻辑处理,方法执行完毕之后,再对修改过的变量进行判断处理,代码如下所示。
翎野君
2023/05/12
1.5K0
辨析Java方法参数中的值传递和引用传递
Vue中的$set的使用
在我们使用vue进行开发的过程中,可能会遇到一种情况:当生成vue实例后,当再次给数据赋值时,有时候并不会自动更新到视图上去; 当我们去看vue文档的时候,会发现有这么一句话:如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。如下代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>vue $set</title> <script src="https://static.runoob.com/assets/vue/1.0.1
李文杨
2018/03/14
1.5K0
Vue中的$set的使用
答网友问:golang中的slice作为函数参数时是值传递还是引用传递?
今天有网友问通道和切片在赋值给另一个变量或作为函数参数传递的时候是不是引用传递?因为老师在讲解的时候说是指针传递?
Go学堂
2023/08/29
7180
答网友问:golang中的slice作为函数参数时是值传递还是引用传递?
Vue中的set、delete方法在列表渲染中的使用
不知大家是否有过类似的经历,比如说for循环渲染数组或者对象中的数据,渲染完成后,给数组或者对象添加、修改、删除数据后却没有在页面中渲染出来。
砖业洋__
2023/05/06
3.3K0
Vue中的set、delete方法在列表渲染中的使用
java中按值传递和引用传递区别
一种是按值传递:值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。简单来说就是直接复制了一份数据过去,因为是直接复制,所以这种方式在传递时如果数据量非常大的话,运行效率自然就变低了,所以java在传递数据量很小的数据是值传递,比如java中的各种基本类型:int,float,double,boolean等类型的,具体可以自己测试。 代码:
用户7886150
2021/02/26
8930
点击加载更多

相似问题

定义日期格式java 'rd‘st’th‘nd’‘

40

Google Scripts中的序数日期格式(th,rd,st,nd)

10

在日期时间字符串中解析日期的序号指示符( st,nd,rd,th )

46

以"st“、"nd”、"rd“和"th”格式显示日期

30

NSNumberFormatter和'th‘'st’'nd‘'rd’(序数)数字结尾

204
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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