如何在缩放时像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的
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) ;
答案 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
需要调整的每个实际视图。