无法让UITextField自动收缩文本

hva*_*rug 19 iphone objective-c uitextfield ios

我有一个UITextField表视图单元格,当它的文本变得太长时,我希望字体大小减少.我想说清楚我说的是a UITextField,而不是a UILabel或a UITextView.我说这个的原因是因为我看到这个问题多次弹出,答案都是基于UILabel而不是UITextField.例如,有人问"我不能让我UITextField自动收缩",答案是"确保它numberOfLines被设置为1".据我所知,a UITextField甚至不具备该属性并且是单行控制.

我试过了:

  • 在IB中将字体设置为系统14.0,minFontSize到7并检查"调整到适合"框
  • 在代码中 tableView:cellForRowAtIndexPath:
ptCell.name.font = [UIFont systemFontOfSize: 14.0];
ptCell.name.adjustsFontSizeToFitWidth = YES;
ptCell.name.minimumFontSize = 7.0;
Run Code Online (Sandbox Code Playgroud)

但这些都没有奏效.我的意思是,它不是缩小文本而是截断尾部.

有谁知道我错过了什么?据推测,这应该有效,因为我已经看到其他问题抱怨当用户不想要它时它正在这样做.

mic*_*c3r 14

我有同样的问题.当文本太长时,UITextField停止缩小文本,但它会自行调整大小并超出其"边界".

帮助我的解决方案是在给定的UITextField上设置宽度约束.在此之后它不再增长,而是内部的文本按预期变小.(当然你必须设置minFontSize并检查故事板中的"adjust to fit"框.)

我知道这有点晚了,但是如果有人通过谷歌我会这么做就会发现这个问题......这可能只是帮助.


hva*_*rug 10

我使用@Purva发布的答案作为起点来提出这种方法,该方法从配置的字体大小开始提供所需的字体大小,而不是低于配置的最小字体大小.虽然@Purva测试了文本的高度,但我要求宽度适合.此方法可以放在UITextField的类别或子类中.我把它放在一个子类中,它也捕获了UITextFieldTextDidChangeNotification.从此通知处理程序中,我调用新方法并根据需要调整字体大小.当我将新文本分配给文本字段以确保它适合子类化时,我也称它为- (void)setText: (NSString*)text.

在每种情况下,当我调用它时,我使用以下代码:

    CGFloat requiredFontSize = self.requiredFontSize;
    if( self.font.pointSize != requiredFontSize )
    {
        self.font = [self.font fontWithSize: requiredFontSize];
    }
Run Code Online (Sandbox Code Playgroud)

这是新方法:

- (CGFloat)requiredFontSize
{
    const CGRect  textBounds = [self textRectForBounds: self.frame];
    const CGFloat maxWidth   = textBounds.size.width;

    if( _originalFontSize == -1 ) _originalFontSize = self.font.pointSize;

    UIFont* font     = self.font;
    CGFloat fontSize = _originalFontSize;

    BOOL found = NO;
    do
    {
        if( font.pointSize != fontSize )
        {
            font = [font fontWithSize: fontSize];
        }

        CGSize size = [self.text sizeWithFont: font];
        if( size.width <= maxWidth )
        {
            found = YES;
            break;
        }

        fontSize -= 1.0;
        if( fontSize < self.minimumFontSize )
        {
            fontSize = self.minimumFontSize;
            break;
        }

    } while( TRUE );

    return( fontSize );
}
Run Code Online (Sandbox Code Playgroud)

  • 真正糟糕的是UITextField控件应该已经自动执行此操作,而不是我必须手动重新创建此功能. (5认同)

小智 8

我想你想把你的adjustsFontSizeToFitWidth属性设置UITextField为YES,并指定一个minimumFontSize.适合我,但我以UITextField编程方式添加- IB问题?