UITextField模糊文本

时间:2009-08-10 12:43:18

标签: ios iphone cocoa-touch uitextfield uikit

即使使用标准字体大小,UITextField的文本仍然存在模糊/消除锯齿的问题。当控件是第一响应者时,文本将显得清晰,但当失去焦点时,文本将再次模糊:

alt text
(来源:mikeweller.com

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

8 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:12)

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

我通过谷歌发现了一些对这个bug的引用,但每个人都通过玩字体来解决这个问题。经过大量搜寻后,我发现this thread表示当视图的帧包含小数像素值时会应用抗锯齿,例如:如果你把它的大小计算为超级视图的一小部分。

果然,将CGRect值转换为视图框架的(int)非常有效。举个例子,如果你希望你的文本字段在superview中垂直居中,你应该使用这样的(int)强制转换:

textFieldWidth = 300;
textFieldHeight = 31;
offsetX = 0;
offsetY = (superview.bounds.size.height - textFieldHeight) / 2;

textField.frame = CGRectMake((int) offsetX,
                             (int) offsetY,
                             (int) textFieldWidth,
                             (int) textFieldHeight);

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

我尝试使用CGRectIntegral和东西。在我的情况下,在IB中更改最小字体大小和字体大小。

答案 5 :(得分:0)

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

CGRect temp = textField.frame;
temp.origin.x = round(temp.origin.x);
temp.origin.y = round(temp.origin.y);
textField.frame = temp;

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

view.contentScaleFactor = UIScreen.main.scale