Что CALayer знает, что я не при масштабировании

Как рисовать так же плавно, как CALayer при масштабировании?

Как видно на третьем (самом высоком) изображении, белая граница рисуется с anti-aliased рендеринг.

Однако ни мои метки (хотя я установил contentScaleFactor) ни мои рисованные круги (хотя я поворачиваюсь anti aliasing на) есть.

Как я могу иметь сглаженный рендеринг для компонентов UIKit или рисованной графики, которая масштабируется с коэффициентом масштабирования так же плавно, как и CALayer?

Что за магия?

маленькийСредняябольшой

Белая граница рисуется с использованием CALayer вида:

    self.layer.cornerRadius = frame.size.width / 2.0f ;
    self.layer.borderColor = [UIColor whiteColor].CGColor ;
    self.layer.borderWidth = 3.0f ;

Номера UILabel's

    CGFloat contentScale = self.zoomScale * [UIScreen mainScreen].scale; // Handle retina
    label.contentScaleFactor = contentScale;

И учитывая:

    typedef struct {
        CGRect      rect ;
        CGColorRef  color ;
    } EventColor ;

4 круга нарисованы с использованием CoreGraphics

    ::CGContextSetAllowsAntialiasing(context, true) ;
    ::CGContextSetShouldAntialias(context, true) ;
    // ...
    EventColor ec = ...
    // ...
    ::CGContextSetFillColorWithColor(context, ec.color) ;
    ::CGContextFillEllipseInRect(context, ec.rect) ;

1 ответ

Решение

Оказывается, я неправильно понял, что contentScaleFactor был предназначен для, и обнаружил, что то, что я действительно после был CALayer contentScale,

Результатом является то, что drawRect метод в любом подклассе UIView может пойти дальше и притвориться, что масштаб увеличения всегда установлен на 1,0, при условии, что contentScale слоя представления установлен, чтобы отразить текущий уровень масштабирования представления прокрутки.

- (void) scrollViewDidEndZooming: (UIScrollView *) scrollView
                        withView: (UIView *) view
                         atScale: (float) scale {

    scale *= [UIScreen mainScreen].scale ;
    for (UIView * v in view.subviews) {
        v.layer.contentsScale = scale ;
        [v setNeedsDisplay] ;
    }
}

В приведенном выше примере предполагается, что представление прокрутки содержит непрозрачное представление контейнера, которое, в свою очередь, содержит все фактические представления, чьи layer.contentScale нуждается в корректировке.

Другие вопросы по тегам