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