UITextField 子类弄乱了adjustFontSizeToWidth

Posted

技术标签:

【中文标题】UITextField 子类弄乱了adjustFontSizeToWidth【英文标题】:UITextField subclass messing adjustFontSizeToWidth 【发布时间】:2015-06-11 15:58:04 【问题描述】:

我在视图控制器中创建了一个子类文本字段视图,字体大小为 15,启用了 AdjustFontSizeToWidth,最小字体大小为 10。 我的文本字段有一个占位符文本太大而无法容纳视图。已激活将字体大小调整为宽度,系统正在将字体大小减小到 14。我不知道为什么14,因为占位符仍然不适合(见截图) 知道为什么会这样吗?我错过了什么吗? 我继承了 UITextfield 并覆盖了以下方法(不确定它是否相关,但这似乎是可能导致此错误的方法):

- (CGRect)leftViewRectForBounds:(CGRect)bounds 
CGRect leftViewRect = [super leftViewRectForBounds:bounds];
if ([self shouldShowLeftView] == YES) 
    CGFloat newHeight = self.frame.size.height * 0.5f;
    if (self.leftImage) 
        leftViewRect.size.width = newHeight;
    
    leftViewRect.origin.x = kMargins;
    leftViewRect.origin.y =  (self.frame.size.height - leftViewRect.size.height) / 2.0f;
 
 return leftViewRect;



- (CGRect)textRectForBounds:(CGRect)bounds 
CGRect rectForBounds = [super textRectForBounds:bounds];

if ([self shouldShowLeftView] == YES) 
    rectForBounds.origin.x += kMargins;
    rectForBounds.size.width -= 2.0 * kMargins;
 else 
    rectForBounds.origin.x += kMargins / 2.0;
    rectForBounds.size.width -= 2.0 * (kMargins / 2.0);

return rectForBounds;


- (CGRect)editingRectForBounds:(CGRect)bounds 
CGRect rectForBounds = [super editingRectForBounds:bounds];

if ([self shouldShowLeftView] == YES) 
    rectForBounds.origin.x += kMargins;
    rectForBounds.size.width -= 2.0 * kMargins;
 else 
    rectForBounds.origin.x +=  kMargins / 2.0;
    rectForBounds.size.width -= 2.0 * (kMargins / 2.0);

 return rectForBounds;

编辑:更新,我尝试使用this solution 并稍微修改了代码以使其也适用于占位符。字体大小调整很好,但是当文本缩小时 UI 会变得混乱,文本本身向左偏移,位于左侧图像视图的后面。在截图中,我们可以看到右边距太大,左边的文字太多。

【问题讨论】:

存在系统最小字体大小。 UITextField 不会像您希望的那样缩小字体大小。 我的最小字体大小是10,占位符有一个14pt的字体,而不是我默认给的15,可能是计算错误。这就是我问的原因。 【参考方案1】:

你没有错过任何东西 - 这是 ios 的一个怪癖。 minimumFontSize 小于 14 的值似乎完全被 my answer 忽略到类似的问题。

将原始字体大小设置为 300,UITextField 仍将是 14 pt,而不是 10 pt。

14 是一个奇数幻数;未记录,但可能用于保持可读性。要是能再低点就好了。

【讨论】:

... 我猜 14 是 matt 提到的最小系统字体大小。 @Cowrin Newall 感谢您的回答!我不知道这件事。我尝试了您在其他答案中提到的解决方案,对其进行了一些调整,但是该解决方案似乎有问题,并且调整字体会导致苹果方法导致放置错误。当我调整我的文本大小时,文本被绘制在我的左侧图像后面。知道为什么/如何解决它吗? 我不确定,但在 Apple Docs 中它说不要直接调用 textRectForBounds:,示例代码可以。您的约束设置是否正确等?不太清楚你的新问题是什么样的。 @Loadex "此方法的默认实现返回一个从控件的原始边界派生的矩形,但不包括接收者的边框或覆盖视图所占据的区域。"我认为它也不允许使用您的手机图片。 我调用它只是为了获取文本边界的值。应该不是问题。我将编辑我的帖子以添加我的新问题的屏幕截图。

以上是关于UITextField 子类弄乱了adjustFontSizeToWidth的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 禁用光标

为啥 QTextBrowser 弄乱了我的 HTML 代码?

实体框架弄乱了行 ID

RecyclerView 在滚动时弄乱了子视图

PageSpeed 模块弄乱了图像的比例

Perl 5.10 是不是把原型弄乱了?