无法让UITextField自动显示文字

我有一个UITextField在表格视图单元格,当它的文本变得太长,我想字体大小减less。 我想说清楚,我正在讨论的是UITextField ,而不是UILabelUITextView 。 我之所以这样说,是因为我看到这个问题popup了好几次,答案都是基于UILabel而不是UITextField 。 例如,有人问“我不能让我的UITextField自动缩水”,答案是“确保它的numberOfLines设置为1 ”。 据我所知, UITextField甚至没有这个属性,并且是一个单独的行控件。

我努力了:

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

但都没有工作。 我的意思是,而不是文本缩小它截断尾巴。

有谁知道我错过了什么? 大概这应该工作,因为我已经看到其他问题抱怨说,当用户不希望它这样做。

我有同样的问题。 UITextField在文本太长时停止了缩小,而是重新调整了大小,超出了“边界”。

帮助我的解决scheme是在给定的UITextField上设置宽度约束 。 之后,它不再增长,而是内部的文字变得更小了。 (当然,你必须设置minFontSize,并检查故事板中的“调整到适合”框)。

我知道这是一个很晚,但如果其他人会通过谷歌find这个问题,我做了…这可能只是帮助。

我使用@Purva发布的答案作为出发点,提供了以configuration的字体大小开始所需字体大小的方法,而不是低于configuration的最小字体大小。 而@Purvatesting的文本的高度,我要求宽度适合。 这个方法可以放在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 ); } 

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

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

试试这个为我工作(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 } 

我在Xcode 5.0.2的StoryBoard中创build了UITextFields,运行的是iOS 7.0.4。 我想通过StoryBoard,viewDidLoad或viewWillAppear无法更改.minimumFontSize属性,但是可以在viewDidAppear中更改它。 所以下面的代码解决了我的问题:

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

我这个问题的卑微的解决scheme是这样的…(find正确的大小的字体我自己的 – 以适应框架的大小)我把它在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; } } 

Swift 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 } } } 

使用XCode8和Swift 3.0.1进行testing

 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获取所有文本字段和自动缩短文本。

也许有人会需要这个代码。

对我来说,它是完美的。

该守则来自@ Marek Manduch本网站和来自

@Kunal Kumar在这个网站: 如何从一个视图中迅速获取所有文本字段

可以通过在IB中selectLine Breaks = Clip来解决

这里的catch是minimumFontSize是一个比例,应该介于0和1之间:)

 f.adjustsFontSizeToFitWidth = true f.minimumFontSize = 0.5 

完美的作品:)