UITextField 模糊文本

Posted

技术标签:

【中文标题】UITextField 模糊文本【英文标题】:UITextField blurred text 【发布时间】:2009-08-10 12:43:17 【问题描述】:

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

(来源:mikeweller.com)

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

【问题讨论】:

我已将其作为 wiki 打开,请随时修改问题/答案。 【参考方案1】:

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

【讨论】:

最干净的解决方案。出于我的目的,我添加了一个带有 - (void)convertFrameMeasurementsToInteger self.frame = CGRectIntegral(self.frame); 的 NSView 扩展 .. 但更好的是有一个像 useIntegerBounds 这样的标志并覆盖 -setFrame【参考方案2】:

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

我通过 Google 找到了许多关于此错误的参考,但每个人都通过调整字体大小来解决它。经过多次搜索,我发现this thread 表示当视图的帧包含小数像素值时应用抗锯齿,例如如果您将其大小计算为超级视图的一部分。

果然,将视图框架的 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 转换为整数值。

【讨论】:

我建议您不要强制转换为 int 来舍入浮点值。有一个功能。这是round。转换为 int 将隐式转换回 float,因为 CGRectMake 采用 float 参数。这种双重演员混淆了它的意图,并且可能表现更差。再说一次,CGRectIntegral 更好。 另外,您可以使用 cielf 或 floorf (??) 分别向上或向下舍入到最接近的整数值,而不是四舍五入。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

这实际上并不能解决问题,它只是解决了潜在的问题,因此您碰巧获得了不会导致模糊的大小。将框架强制为整数值可以正确解决问题。 对我来说很好。我正在使用 systemFontOfSize:18【参考方案7】:

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

view.contentScaleFactor = UIScreen.main.scale

【讨论】:

【参考方案8】:

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

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

希望 IB 的未来版本能够纠正此问题。

【讨论】:

以上是关于UITextField 模糊文本的主要内容,如果未能解决你的问题,请参考以下文章

为啥 textFieldDidEndEditing: 没有被调用?

UITextField 在我开始输入时保持/保存值,而无需我点击“完成/保存”按钮

使用 swift 将多个文本字段添加到 firebase

如何快速确定哪个文本字段处于活动状态

为啥 UITextField 的窗口为零?

填写所有 UITextField 时,UIButton 未启用