代码之家  ›  专栏  ›  技术社区  ›  Mike Weller

uitextfield文本模糊

  •  10
  • Mike Weller  · 技术社区  · 5 年前

    我遇到了一个问题,一个uitextfield的文本被模糊/消除混叠,即使是标准字体大小。当控件是第一响应者时,文本将显示为清晰,但当它失去焦点时,文本将再次模糊:

    alt text http://www.mikeweller.com/images/blog/UITextFieldBlur.png

    有人知道怎么修理这个吗?

    8 回复  |  直到 6 年前
        1
  •  26
  •   Daniel Dickison    15 年前

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

        2
  •  12
  •   Mike Weller    15 年前

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

    我通过google找到了很多关于这个bug的参考资料,但是每个人都通过玩字体大小来解决这个问题。经过多次狩猎,我发现 this thread 也就是说,当视图的帧包含分数像素值时(例如,如果将其大小计算为超级视图的分数),将应用抗锯齿。

    当然,将cgrct值强制转换为(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);
    

    还有一个CGRectantegral函数,可以用来将CGRect转换为整数值。

        3
  •  1
  •   Ortwin Gentz    14 年前

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

        4
  •  0
  •   user186297    15 年前

    我很愿意做出贡献,因为我在经历了一段挫折之后,才自己找到了答案。

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

    希望将来版本的ib可以纠正这个问题。

        5
  •  0
  •   hfossli    14 年前

    我试过用cgDirectGral之类的东西。在我的例子中,更改了ib中的最小字体大小和字体大小。

        6
  •  0
  •   sd.    14 年前

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

    CGRect temp = textField.frame;
    temp.origin.x = round(temp.origin.x);
    temp.origin.y = round(temp.origin.y);
    textField.frame = temp;
    
        7
  •  0
  •   samvermette    14 年前

    只需设置 UITextField 框架高度为偶数,为我固定。

        8
  •  0
  •   Dave G    6 年前

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

    view.contentScaleFactor = UIScreen.main.scale