我在表格视图单元格上有UITextField
,当文本变得太长时,我希望字体大小减小。我想说清楚我说的是UITextField
,而不是UILabel
或UITextView
。我说这个的原因是因为我看到这个问题多次弹出,答案全部基于UILabel
而不是UITextField
。例如,有人问“我无法让UITextField
自动收缩”,答案是“确保numberOfLines
设置为1
”。据我所知,UITextField
甚至不具备该属性并且是单行控制。
我试过了:
minFontSize
设置为7并选中“调整以适合”框tableView:cellForRowAtIndexPath:
ptCell.name.font = [UIFont systemFontOfSize: 14.0];
ptCell.name.adjustsFontSizeToFitWidth = YES;
ptCell.name.minimumFontSize = 7.0;
但这些都没有奏效。我的意思是,它不是缩小文本而是截断尾部。
有谁知道我错过了什么?据推测,这应该有效,因为我已经看到其他问题抱怨它是在用户不想要的时候这样做。
答案 0 :(得分:14)
我遇到了同样的问题。 UITextField在文本太长时停止缩小文本,但是它会自行调整大小并超出其“边界”。
帮助我的解决方案是在给定的UITextField上设置宽度约束。在此之后它不再增长,而是内部的文本按预期变小。 (当然你必须设置minFontSize并检查故事板中的“adjust to fit”框。)
我知道这有点晚了,但是如果有其他人会像我一样通过谷歌找到这个问题......它可能会有所帮助。
答案 1 :(得分:10)
我使用@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 );
}
答案 2 :(得分:8)
我认为您要将adjustsFontSizeToFitWidth
的{{1}}属性设置为YES,并指定UITextField
。适合我,但我以编程方式添加minimumFontSize
- IB问题?
答案 3 :(得分:1)
-(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;
}
答案 4 :(得分:1)
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
}
}
}
答案 5 :(得分:1)
试试这个为我工作(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
}
答案 6 :(得分:0)
我在运行iOS 7.0.4的Xcode 5.0.2中的StoryBoard中创建的UITextFields遇到了同样的问题。我发现.minimumFontSize属性无法被StoryBoard,viewDidLoad或viewWillAppear更改,但它可以在viewDidAppear中更改 。所以下面的代码解决了我的问题:
- (void) viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.myTextField.minimumFontSize = 4.0;
[self.myTextField setNeedsLayout];
[self.myTextField layoutIfNeeded];
}
答案 7 :(得分:0)
我对这个问题的谦虚解决方案就是这个....(我自己找到合适的字体大小 - 以适应框架的大小)我把它放在了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;
}
}
答案 8 :(得分:0)
使用XCode8和Swift 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获取所有文本字段并自动收缩文本。
也许有人会需要这段代码。
对我来说,它很完美。
本守则来自@ Marek Manduch本网站及
@Kunal Kumar在这个网站上: How to get all the textfields from a view in swift
答案 9 :(得分:-2)
可以通过在IB中选择Line Breaks = Clip
来解决答案 10 :(得分:-2)
这里的问题是minimumFontSize是一个比率,应该介于0和1之间:)
f.adjustsFontSizeToFitWidth = true
f.minimumFontSize = 0.5
完美无缺:)