CALayer知道我在缩放时不知道什么

时间:2013-04-08 23:48:34

标签: objective-c uiview calayer zooming

如何在缩放时像CALayer一样平滑地绘制?

如第三张(最高)图片中所示,白色边框以精确的anti-aliased渲染方式绘制。

然而,我的标签(即使我设置contentScaleFactor)也不是我的手绘圆圈(即使我打开anti aliasing)都是。

如何对UIKit组件或手绘图形进行消除锯齿渲染,这些图像与缩放因子一样可以像CALayer一样平滑地缩放?

有什么神奇之处?

small medium large

使用视图的CALayer绘制白色边框:

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

这些数字是UILabel的

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

并给出:

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

使用CoreGraphics

绘制4个圆圈
    ::CGContextSetAllowsAntialiasing(context, true) ;
    ::CGContextSetShouldAntialias(context, true) ;
    // ...
    EventColor ec = ...
    // ...
    ::CGContextSetFillColorWithColor(context, ec.color) ;
    ::CGContextFillEllipseInRect(context, ec.rect) ;

1 个答案:

答案 0 :(得分:0)

事实证明,我误解了contentScaleFactor的含义,并发现我真正追求的是CALayer的contentScale

结果是任何UIView子类中的drawRect方法都可以继续并假设缩放比例始终设置为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需要调整的每个实际视图。