Ios 相邻层抗锯齿问题
我正在用CAShapeLayer为每个饼片绘制饼图。即使当一个饼图切片的结束角度等于相邻切片的开始角度时,如果切片之间的边界成一定角度,抗锯齿也会导致每个pice切片之间出现底层背景色 我希望在仍然使用抗锯齿的情况下消除切片之间的微小间隙,以便生成的饼车看起来仍然平滑。从概念上讲,如果有一种方法可以在绘制所有饼图切片后对整个CALayer及其饼图切片子层应用抗锯齿,那么就可以了。。。饼图切片将互为抗锯齿,而不是背景 我已经玩了尽可能多的CALayer财产,因为我能想到,我有一个困难的时间找到更多的信息,这方面的。有什么想法吗Ios 相邻层抗锯齿问题,ios,objective-c,graphics,core-animation,quartz-graphics,Ios,Objective C,Graphics,Core Animation,Quartz Graphics,我正在用CAShapeLayer为每个饼片绘制饼图。即使当一个饼图切片的结束角度等于相邻切片的开始角度时,如果切片之间的边界成一定角度,抗锯齿也会导致每个pice切片之间出现底层背景色 我希望在仍然使用抗锯齿的情况下消除切片之间的微小间隙,以便生成的饼车看起来仍然平滑。从概念上讲,如果有一种方法可以在绘制所有饼图切片后对整个CALayer及其饼图切片子层应用抗锯齿,那么就可以了。。。饼图切片将互为抗锯齿,而不是背景 我已经玩了尽可能多的CALayer财产,因为我能想到,我有一个困难的时间找到更
更新:请参见下面我的答案。您可能无法使您的饼片边缘完全对齐而没有裂缝。最简单的解决办法就是不去尝试 不要让你的饼片在边缘相交,而是让它们重叠。将第一个切片绘制为完整的光盘: 然后将第二个切片绘制为完整的光盘,第一个切片的适当区域除外: 然后将第三个切片绘制为完整的光盘,前两个切片的适当区域除外: 等等: 这是我的密码:
#import "PieView.h"
@implementation PieView {
NSMutableArray *slices;
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (void)layoutSubviews {
[super layoutSubviews];
[self layoutSliceLayers];
}
- (void)layoutSliceLayers {
if (slices == nil) {
[self createSlices];
}
[slices enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[self layoutSliceLayer:obj index:idx];
}];
}
static const int kSliceCount = 5;
- (void)createSlices {
slices = [NSMutableArray arrayWithCapacity:kSliceCount];
for (int i = 0; i < kSliceCount; ++i) {
[slices addObject:[self newSliceLayerForIndex:i]];
}
}
- (CAShapeLayer *)newSliceLayerForIndex:(int)i {
CAShapeLayer *layer = [CAShapeLayer layer];
layer.fillColor = [UIColor colorWithWhite:(CGFloat)i / kSliceCount alpha:1].CGColor;
[self.layer addSublayer:layer];
return layer;
}
- (void)layoutSliceLayer:(CAShapeLayer *)layer index:(int)index {
layer.position = [self center];
layer.path = [self pathForSliceIndex:index].CGPath;
}
- (CGPoint)center {
CGRect bounds = self.bounds;
return CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
}
- (UIBezierPath *)pathForSliceIndex:(int)i {
CGFloat radius = [self radius];
CGFloat fudgeRadians = 5 / radius;
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointZero
radius:radius startAngle:2 * M_PI * i / kSliceCount
endAngle:2 * M_PI clockwise:YES];
[path addLineToPoint:CGPointZero];
[path closePath];
return path;
}
- (CGFloat)radius {
CGSize size = self.bounds.size;
return 0.9 * MIN(size.width, size.height) / 2;
}
@end
#导入“PieView.h”
@实现视图{
NSMutableArray*切片;
}
-(id)initWithFrame:(CGRect)帧
{
self=[super initWithFrame:frame];
如果(自我){
//初始化代码
}
回归自我;
}
-(无效)布局子视图{
[超级布局子视图];
[自布局层];
}
-(无效)布局层{
如果(切片==nil){
[自创切片];
}
[ObjectSusingBlock:^(id obj,整数idx,布尔*停止){
[自布局切片层:obj索引:idx];
}];
}
静态常数int kslicecont=5;
-(void)创建切片{
切片=[NSMutableArray阵列容量:kSliceCount];
对于(int i=0;i
更新:Rob的回答很好,但可能会导致其他抗锯齿问题。最后,我沿着每个饼图切片的结束角绘制了1吨宽的径向线,每条线与相邻切片的颜色相同,从而“填充”了这些间隙。这些线以比饼图切片更低的z索引绘制,因此它们位于下方。下面是不在顶部绘制饼片的情况下它们的外观:
这是最终产品:
非常感谢您的回复,罗伯。我曾经尝试过这个解决方案,并且看到了从较暗的底层到背景的抗锯齿伪影。它在饼图周围显示为一条细微的暗边,在浅色切片的外边缘尤为明显。我所描述的径向填充解决方案似乎效果不错。@Aaron当您消除别名时,您最终会在一个有效锯齿形状的纯色周围形成一个颜色+alpha像素环。对具有相同轮廓的多个形状执行此操作,有效锯齿的内部区域将看起来很好,但抗锯齿区域将具有颜色(n)+alpha叠加颜色(n-1)+alpha叠加。。。颜色(0)+alpha。这就解释了你所看到的效果。