2013-07-24 3 views
3

У меня есть один компонент, в который есть подкласс UIView и пользовательский CAlayer.Разностный рисунок на CALayer и UIView

В UIView есть круг, который обращается с CoreGraphics, и это код:

CGRect b = self.bounds; 

int strokeSize = 2; 
CGRect arcBounds = CGRectMake(b.origin.x+1, b.origin.y+1, b.size.width-2, b.size.height-2); 

CGContextSaveGState(ctx); {  
    CGContextSetLineWidth(ctx, strokeSize); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor lightGrayColor].CGColor); 
    CGContextStrokeEllipseInRect(ctx, arcBounds); 
} CGContextRestoreGState(ctx); 

когда я рисую этот круг в методе DrawRect внутри UIView он отлично работает и окружность гладкий и отлично выглядит.

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

Любые подсказки о том, что может произойти? Заранее спасибо.

ответ

3

Это свойство contentsScale. Когда у вас есть пользовательский CALayer, значение по умолчанию этого свойства равно 1.0.

По умолчанию это значение равно 1.0. Для слоев, прикрепленных к виду , представление автоматически изменяет масштабный коэффициент на значение, соответствующее для текущего экрана. Для слоев, которые вы создаете, и управляйте собой, вы должны установить значение этого свойства самостоятельно на основе разрешения экрана и содержимого, которое вы предоставляете . Core Animation использует значение, указанное вами в качестве метки для , для определения способа отображения вашего контента. Source.

Если у вас есть сетчатка устройство и рисование с contentsScale набором до 1,0, то это приведет к этому пиксельного взгляда вы описали. Чтобы исправить это, вы должны установить contentsScale слоя на один из экранов.

[self.layer setContentsScale:[[UIScreen mainScreen] scale]];

Эта проблема не возникает, когда вы рисуете круг в drawRect методы вашего UIView поскольку по умолчанию contentsScaleFactor это уже один из экрана.

Для представлений, которые реализуют пользовательские DrawRect: метод и связаны с окном, значение по умолчанию для этого свойства является фактором масштаба, связанный с экраном показывает вид. Source.

Смежные вопросы