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: 没有被调用?