Сглаживание диагональных ребер CALayer - PullRequest
14 голосов
/ 05 июня 2011

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

iPhone: CALayer + повернуть в 3D + сглаживание?

iPhone - неровные края при применении перспективы к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);
}

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

Ответы [ 2 ]

30 голосов
/ 18 октября 2013

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

layer.allowsEdgeAntialiasing = YES;

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

14 голосов
/ 10 сентября 2011

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

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

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

    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;

У меня есть несколько примеров здесь

...