UITextField模糊文本

问题描述 投票:10回答:8

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

alt text (来源:mikeweller.com

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

ios iphone cocoa-touch uitextfield uikit
8个回答
26
投票

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


12
投票

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

我通过Google找到了一些关于这个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转换为整数值。


1
投票

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


0
投票

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

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

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


0
投票

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


0
投票

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

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

0
投票

只需将UITextField框架高度设置为均匀值即可。


0
投票

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

view.contentScaleFactor = UIScreen.main.scale
© www.soinside.com 2019 - 2024. All rights reserved.