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

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


(来源:mikeweller.com

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

【问题讨论】:

  • 我已将其作为 wiki 打开,请随时修改问题/答案。

标签: ios iphone cocoa-touch uitextfield uikit


【解决方案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 的未来版本能够纠正此问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-04-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-01
            • 2016-02-15
            • 2015-12-23
            • 2017-02-06
            相关资源
            最近更新 更多