Что 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
нуждается в корректировке.