10

即使使用标准字体大小,我也遇到了 UITextField 的文本被模糊/抗锯齿的问题。当控件是第一响应者时,文本会显得清晰,但在失去焦点时会再次模糊:

替代文字
(来源:mikeweller.com

有人知道如何解决这个问题吗?

4

8 回答 8

27

使用CGRectIntegral确保文本字段的框架基于整数坐标。当事物位于分数坐标上时,您将获得模糊的抗锯齿。

于 2009-08-10T12:59:51.123 回答
12

好的,我在这里回答我自己的问题。

我通过 Google 找到了很多关于这个 bug 的参考资料,但每个人都通过调整字体大小来解决这个问题。经过多次搜索,我发现这个线程说当视图的帧包含分数像素值时应用抗锯齿,例如,如果您将其大小计算为超级视图的一部分。

果然,将视图框架的 CGRect 值转换为 (int) 效果很好。例如,如果您希望您的文本字段在超级视图中垂直居中,您应该使用这样的 (int) 强制转换:

文本字段宽度 = 300;
文本字段高度 = 31;
偏移X = 0;
offsetY = (superview.bounds.size.height - textFieldHeight) / 2;

textField.frame = CGRectMake((int) offsetX,
                             (int) 偏移量,
                             (int) 文本字段宽度,
                             (int) textFieldHeight);

还有 CGRectIntegral 函数可用于将 CGRect 转换为整数值。

于 2009-08-10T12:44:35.583 回答
1

除了使用非分数定位之外,还应确保对 UITextField 使用非居中的垂直对齐方式。看起来居中的垂直对齐加上奇怪的字体大小也会导致文本模糊。

于 2010-02-25T00:39:59.597 回答
0

我很乐意做出贡献,因为我在经历了相当多的挫折之后才自己发现了答案。

UITextFieldin的InterfaceBuilder强制帧高度为 31 像素。这不能点击拖动来调整大小,也不能在 IB 的框架属性中设置。您需要viewDidLoad将帧高度调整为 32 像素,这应该可以解决问题。

希望 IB 的未来版本能够纠正这一点。

于 2009-10-08T11:23:20.623 回答
0

我尝试使用 CGRectIntegral 之类的。在我的情况下,在 IB 中更改最小字体大小和字体大小就可以了。

于 2010-03-15T09:17:16.053 回答
0

我以前遇到过这个问题。下面的解决方案适用于任何文本或帧大小,因为它使用 round 函数来消除小数像素值。在有问题的 uitextfield 实例化之后插入以下代码。

CGRect temp = textField.frame;
temp.origin.x = round(temp.origin.x);
temp.origin.y = round(temp.origin.y);
textField.frame = temp;
于 2010-04-21T00:48:37.573 回答
0

只需将UITextField框架高度设置为一个偶数值即可为我修复它。

于 2010-05-30T21:27:01.317 回答
0

该站点的解决方案解释说,它可能与调整大小有关,iOS 不处理层的这个错误,只处理各种视图。我将其更新为 Swift 4:

view.contentScaleFactor = UIScreen.main.scale
于 2018-06-15T02:53:02.330 回答