Подтвердить что ты не робот

Противоположные диагональные края CALayer

Когда я устанавливаю свойство transform моего CALayer с CATransform3DRotate, слой правильно поворачивается. Однако края слоя зазубрены и не сглажены. Я прочитал пару сообщений по теме:

iPhone: CALayer + вращается в 3D + антиалиасе?

iPhone - Jagged Edges при применении перспективы к CALayer

Я попытался включить их советы, установив следующие свойства на моем диагональном слое

CALayer* layer = myView.layer;
layer.shadowOpacity = 0.01;
layer.edgeAntialiasingMask = kCALayerTopEdge | kCALayerBottomEdge | kCALayerRightEdge | kCALayerLeftEdge;
layer.borderWidth = 1.0;
layer.borderColor = [UIColor clearColor].CGColor;
layer.backgroundColor = [UIColor greenColor].CGColor;

Я также переопределил drawLayer: inContext: метод моего диагонального слоя для обеспечения сглаживания:

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
{
    CGContextSetAllowsAntialiasing(context, true);
    CGContextSetShouldAntialias(context, true);
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
    CGContextFillRect(context, self.bounds);
}

Что мне не хватает?

4b9b3361

Ответ 1

Я только что написал об этом для изображений. Возможно, это поможет.

Я нашел несколько трюков, которые помогают и устанавливают только границу, не делали то, что я думал. Что вы можете сделать, это установить несколько настроек, которые помогут с интерполяцией, растеризацией и растеризацией.

Посмотрите, помогает ли что-то из этого кода:

    UIImage * img =[UIImage imageWithData:[NSData dataWithContentsOfFile:[[[NSBundle mainBundle ] resourcePath ] stringByAppendingPathComponent:@"AliasImage.png" ] ] ];
CGRect imageRect = CGRectMake( 0 , 0 , img.size.width + 4 , img.size.height + 4 );
UIGraphicsBeginImageContext( imageRect.size );
[img drawInRect:CGRectMake( imageRect.origin.x + 2 , imageRect.origin.y + 2 , imageRect.size.width - 4 , imageRect.size.height - 4 ) ];
CGContextSetInterpolationQuality( UIGraphicsGetCurrentContext() , kCGInterpolationHigh );
img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[aliasImage setImage:img ];

aliasImage.transform = CGAffineTransformScale(aliasImage.transform , 0.45 , 0.45 );
aliasImage.layer.shouldRasterize = YES;
aliasImage.layer.rasterizationScale = 0.45;
aliasImage.layer.edgeAntialiasingMask = kCALayerLeftEdge | kCALayerRightEdge | kCALayerBottomEdge | kCALayerTopEdge;
aliasImage.clipsToBounds = NO;
aliasImage.layer.masksToBounds = NO;

У меня есть несколько опубликованных примеров здесь

Ответ 2

Как и в iOS7, это теперь, наконец, возможно для каждого слоя и без каких-либо уродливых хаков, таких как прозрачные пиксели или обходные пути, такие как растеризация:

layer.allowsEdgeAntialiasing = YES;

Интересно, что это не распространяется на официальную документацию CALayer, но, безусловно, является публичным API. См. iOS7 API diffs, а Питер Стейнбергер отлично пишет о скрытых драгоценных камнях и обходных решениях в iOS7.