无法获取的UITextField为自动收缩文本(Can't get UITextField

2019-09-01 19:33发布

我有一个UITextField的表视图单元格,当它的文本太长,我想字体大小减小。 我想非常清楚,我讲一个UITextField ,而不是一个UILabelUITextView 。 我这样说的原因是因为我已经看到了这个问题,弹出几次,答案都是基于UILabel代替UITextField 。 例如,有人问:“我不能让我UITextField为自动收缩”,答案是“确保它的numberOfLines设置为1 ”。 据我所知,一个UITextField甚至没有该属性,并且是单一线控制。

我试过了:

  • 在IB的字体设置为系统14.0, minFontSize至7和检查“调整到适合”框
  • 在代码tableView:cellForRowAtIndexPath:
ptCell.name.font = [UIFont systemFontOfSize: 14.0];
ptCell.name.adjustsFontSizeToFitWidth = YES;
ptCell.name.minimumFontSize = 7.0;

但是这些都工作过。 我的意思是说,而不是文字缩小它的截断尾巴。

有谁知道我缺少的是什么? 据推测,这应该工作,因为我已经看到了抱怨,这是做的是,当用户不希望它的其他问题。

Answer 1:

我有同样的问题。 的UITextField采空收缩文本时,它是太长了,而是它本身的调整和发展了其“边界”以外。

帮助我解决的办法是设置在给定的UITextField 宽度约束 。 它没有再长大后,如预期,而不是里面的文字变得越来越小。 (当然你必须设置minFontSize并为您在故事板“调整到适合”复选框。)

我知道这是怎样的一个迟到的,但如果其他人会发现通过谷歌,因为我做了这个问题...它可能只是帮助。



Answer 2:

我使用@Purva张贴为起点的答案想出这个方法给出所需的字体大小起始于配置的字体大小,而不是降低到低于所配置的最小字体大小。 而@Purva测试文本的高度我所需要的宽度以适应。 这种方法可以把在任何一个类别或的UITextField的子类。 我有它的子类,也抓住了UITextFieldTextDidChangeNotification 。 从这个通知处理我所说的新方法,并根据需要调整字体。 我也把它当我分配新的文本到文本框,以确保它适合的子类- (void)setText: (NSString*)text

在每一种情况下,当我把它称为我使用下面的代码:

    CGFloat requiredFontSize = self.requiredFontSize;
    if( self.font.pointSize != requiredFontSize )
    {
        self.font = [self.font fontWithSize: requiredFontSize];
    }

下面是新方法:

- (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 );
}


Answer 3:

我想你想设置adjustsFontSizeToFitWidth属性为您UITextField为YES,并指定minimumFontSize 。 对我的作品,但我想补充UITextField编程- IB问题?



Answer 4:

-(BOOL)sizeFontToFit:(NSString*)aString minSize:(float)aMinFontSize maxSize:(float)aMaxFontSize 
{   
float fudgeFactor = 16.0;
float fontSize = aMaxFontSize;

self.font = [self.font fontWithSize:fontSize];

CGSize tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight);
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

while (stringSize.height >= self.frame.size.height)
       {
       if (fontSize <= aMinFontSize) // it just won't fit
           return NO;

       fontSize -= 1.0;
       self.font = [self.font fontWithSize:fontSize];
       tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight);
       stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
       }

return YES; 
}


Answer 5:

雨燕3.0以调整字体以适应方式:

let startFontSize = 14.0
let minFontSize = 7.0

func resizeFont() {
    guard let font = self.font, let text = self.text else {
        return
    }

    let textBounds = self.textRect(forBounds: self.bounds)
    let maxWidth = textBounds.size.width

    for fontSize in stride(from: startFontSize, through: minFontSize, by: -0.5) {
        let size = (text as NSString).size(attributes: [NSFontAttributeName: font.withSize(CGFloat(fontSize))])
        self.font = font.withSize(CGFloat(fontSize))
        if size.width <= maxWidth {
            break
        }
    }
}


Answer 6:

试试这个它的工作对我来说(SWIFT 3.0)

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        // bla bla ... anything inside method you want to do
        // reset font size of textfield
        textField.font = UIFont.systemFont(ofSize: CGFloat(15.0))
        var widthOfText: CGFloat = textField.text!.size(attributes: [NSFontAttributeName: textField.font!]).width
        var widthOfFrame: CGFloat = textField.frame.size.width
        // decrease font size until it fits (25 is constant that works for me)
        while (widthOfFrame - 25) < widthOfText {
            let fontSize: CGFloat = textField.font!.pointSize
            textField.font = textField.font?.withSize(CGFloat(fontSize - 0.5))
            widthOfText = (textField.text?.size(attributes: [NSFontAttributeName: textField.font!]).width)!
            widthOfFrame = textField.frame.size.width
        }
        return true
    }


Answer 7:

我曾在故事板在Xcode 5.0.2创建UITextFields这个同样的问题,运行iOS 7.0.4。 我想通了,在.minimumFontSize财产不能用故事板,或viewDidLoad中,或viewWillAppear中被改变,但它可能在viewDidAppear改变。 所以下面的代码解决我的问题:

- (void) viewDidAppear:(BOOL)animated  {
    [super viewDidAppear:animated];
    self.myTextField.minimumFontSize = 4.0;
    [self.myTextField setNeedsLayout];
    [self.myTextField layoutIfNeeded];
}


Answer 8:

我对这个问题不起眼的解决方案是这样的....(查找字体的我自己合适的大小 - 以适应帧的大小),我把它shouldChangeCharactersInRange的委托方法内:replacementString:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

 {

    // bla bla ... anything inside method you want to do

    // reset font size of textfield
    textField.font = [FONT_PROXY fontNormalOfSizeNormal];

    CGFloat widthOfText = [textField.text sizeWithAttributes:@{NSFontAttributeName:textField.font}].width;
    CGFloat widthOfFrame = textField.frame.size.width;

    // decrease font size until it fits (25 is constant that works for me)
    while((widthOfFrame - 25) < widthOfText){
        CGFloat fontSize = textField.font.pointSize;
        textField.font = [textField.font fontWithSize:fontSize - 0.5f];
         widthOfText = [textField.text sizeWithAttributes:@{NSFontAttributeName:textField.font}].width;
         widthOfFrame = textField.frame.size.width;
    }


  }


Answer 9:

与XCode8和斯威夫特3.0.1进行测试

func getTextfield(view: UIView) -> [UITextField] {
    var results = [UITextField]()
    for subview in view.subviews as [UIView] {
        if let textField = subview as? UITextField {
            results += [textField]
        } else {
            results += getTextfield(view: subview)
        }
    }
    return results
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let allTextFields = getTextfield(view: self.view)
    for textField in allTextFields
    {
        textField.font = UIFont.boldSystemFont(ofSize: 14)
        var widthOfText: CGFloat = textField.text!.size(attributes: [NSFontAttributeName: textField.font!]).width
        var widthOfFrame: CGFloat = textField.frame.size.width
        while (widthOfFrame - 15) < widthOfText { // try here to find the value that fits your needs
            let fontSize: CGFloat = textField.font!.pointSize
            textField.font = textField.font?.withSize(CGFloat(fontSize - 0.5))
            widthOfText = (textField.text?.size(attributes: [NSFontAttributeName: textField.font!]).width)!
            widthOfFrame = textField.frame.size.width
        }
    }
}

我用viewDidLayoutSubviews得到所有文本框和自动收缩的文本。

也许有人会需要此代码。

对我来说,它的作品完美。

该代码是从@马立克Manduch在这个网站,并从

@Kunal库马尔在这个网站: 如何从SWIFT视图得到所有的文本框



Answer 10:

可以通过选择来解决换行符IB =剪辑



Answer 11:

这里美中不足的是,minimumFontSize是一个比值和应为0和1之间:)

f.adjustsFontSizeToFitWidth = true
f.minimumFontSize = 0.5

完美的作品:)



文章来源: Can't get UITextField to autoshrink text