即使使用标准字体大小,我也遇到了UITextField文本被模糊/消除锯齿的问题。当控件是第一响应者时,文本将显得清晰,但在失去焦点时再次模糊:
(来源:mikeweller.com)
有人知道如何解决这个问题吗?
使用CGRectIntegral确保文本字段的框架基于整数坐标。当事物位于分数坐标上时,你会得到模糊的抗锯齿。
好的,我在这里回答我自己的问题。
我通过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转换为整数值。
除了使用非小数定位之外,还应确保对UITextField使用非居中的垂直对齐。看起来居中的垂直对齐与奇怪的字体大小相结合也会导致文本模糊。
我很乐意做出贡献,因为我在经历了相当多的挫折后才发现了自己的答案。
InterfaceBuilder中的UITextField的强制帧高度为31像素。这不能单击拖动以调整大小,也不能在IB的框架属性中设置。您需要转到viewDidLoad并将帧高调整为32像素,这应该可以解决问题。
希望IB的未来版本能够纠正这一点。
我尝试使用CGRectIntegral和东西。在我的情况下,在IB中更改最小字体大小和字体大小。
我之前遇到过这个问题。下面的解决方案适用于任何文本或帧大小,因为它使用圆函数来摆脱小数像素值。在实例化有问题的uitextfield之后插入以下代码。
CGRect temp = textField.frame;
temp.origin.x = round(temp.origin.x);
temp.origin.y = round(temp.origin.y);
textField.frame = temp;
只需将UITextField
框架高度设置为均匀值即可。
来自this site的解决方案解释说它可能与调整大小有关,而iOS不会处理图层的这个错误,只会处理各种视图。我将它更新为Swift 4:
view.contentScaleFactor = UIScreen.main.scale