drawAtPoint: 和 drawInRect: 模糊文本
Posted
技术标签:
【中文标题】drawAtPoint: 和 drawInRect: 模糊文本【英文标题】:drawAtPoint: and drawInRect: blurry text 【发布时间】:2010-10-14 05:43:38 【问题描述】:使用 drawAtPoint:、drawInRect: 绘制字符串时,甚至设置 UILabels 的 text 属性 - 文本有时会显得有些模糊。
我倾向于在大多数地方使用 Helvetica,我注意到特定的字体大小会导致在模拟器和设备上出现一定程度的模糊。
例如:
UIFont *labelFont = [UIFont fontWithName:@"Helvetica-Bold" size:12];
将导致生成的标签文本略微模糊。
UIFont *labelFont = [UIFont fontWithName:@"Helvetica-Bold" size:13];
产生清晰的文本。
我的问题是为什么会发生这种情况?仅仅是为字体选择最佳字体大小的问题吗?如果有,最佳字体大小是多少?
更新:似乎不是字体大小导致了模糊。矩形的中心可能是一个小数点。这是我在 Apple 开发者论坛上找到的评论:
检查位置。它很可能在一个 分数像素。变更中心为 整数值。
我对所有点的值进行了四舍五入,但仍有一些地方文本仍然模糊。有没有人遇到过这个问题?
【问题讨论】:
在这里查看我的答案:***.com/a/16822238/308315 【参考方案1】:我已经解决了。
只需确保您绘制的点或矩形不会出现在小数像素上。
即NSLog(@"%@", NSStringFromCGRect(theRect))
确定在小数像素上绘制的点。然后打电话给round()
。
【讨论】:
问题的关键是正确的,尽管舍入并不是最好的技术。很多回合实际上可以移动或调整框架的大小。最好的方法是将原始帧存储为属性,然后将其设置回来。这保证不会发生变化或调整大小【参考方案2】:您可能想查看 NSIntegralRect(),它可以满足您的需求。
【讨论】:
NSIntegralRect() 仅适用于 Mac,不适用于 ios。 你是对的,当然改用CGRectIntegral()。【参考方案3】:如果这不正确,请原谅我的无知,我对 iPhone 或 Cocoa 一无所知。
如果您要求文本在矩形中居中,您可能还需要确保矩形的宽度和/或高度为偶数。
【讨论】:
谢谢。我将所有点以及宽度和高度四舍五入。还对 center 属性的点进行了四舍五入。还是没有骰子。【参考方案4】:我也遇到过这个问题,但我的解决方案不同,可能会对某人有所帮助。
我的问题是通过TouchesBegan
更改UIView
对象的大小后文本模糊
和CGAffineTransformMakeScale
,然后在TouchesEnded
中返回CGAffineTransformIdentity
。
我尝试了不同的文本大小和 x 和 y 中心点的舍入,但都没有奏效。
我的问题的解决方案是对我的UIView
的宽度和高度使用均匀的尺寸!!
希望这会有所帮助....
【讨论】:
【参考方案5】:根据我的实验,某些字体在某些尺寸下无法清晰呈现。例如Helvetica-Bold 不呈现“。”在 16.0f 时很好,但在 18.0f 时很清晰。 (如果仔细观察,“.”的顶部像素是模糊的。)
在我注意到这一点之后,每次看到 UIView 时我都会感到厌烦,因为它是动态渲染的。
【讨论】:
【参考方案6】:在我的例子中,我在自定义 CALayer
上绘制了文本,结果变得非常模糊。我通过将contentScale
设置为适当的值来解决它:
目标-C:
layer.contentsScale = [UIScreen mainScreen].scale;
斯威夫特:
layer.contentsScale = UIScreen.main.scale
【讨论】:
以上是关于drawAtPoint: 和 drawInRect: 模糊文本的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSString 的 drawAtPoint 方法代替 CGContextShowGlyphsAtPoint 问题
drawInRect: withAttributes 文本垂直居中或放置一些填充