Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 相邻层抗锯齿问题_Ios_Objective C_Graphics_Core Animation_Quartz Graphics - Fatal编程技术网

Ios 相邻层抗锯齿问题

Ios 相邻层抗锯齿问题,ios,objective-c,graphics,core-animation,quartz-graphics,Ios,Objective C,Graphics,Core Animation,Quartz Graphics,我正在用CAShapeLayer为每个饼片绘制饼图。即使当一个饼图切片的结束角度等于相邻切片的开始角度时,如果切片之间的边界成一定角度,抗锯齿也会导致每个pice切片之间出现底层背景色 我希望在仍然使用抗锯齿的情况下消除切片之间的微小间隙,以便生成的饼车看起来仍然平滑。从概念上讲,如果有一种方法可以在绘制所有饼图切片后对整个CALayer及其饼图切片子层应用抗锯齿,那么就可以了。。。饼图切片将互为抗锯齿,而不是背景 我已经玩了尽可能多的CALayer财产,因为我能想到,我有一个困难的时间找到更

我正在用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。这就解释了你所看到的效果。