Вставить текст в UILabel
Вот мой код
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 50, 300, 50)];
label.textAlignment = UITextAlignmentCenter;
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.textColor.font = [UIFont fontWithName:@"Verdana" size:30];
label.text = @"A very long string";
etc...
Проблема заключается в том, что шрифт большой и не может помещаться в метку. Он просто отображает "Очень"
Что делать, чтобы весь текст отображался.
Я пробовал
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0;
Но это не работает для меня.
Я хочу сделать это программно.
//EDIT
CGRect frame = CGRectMake(10, 50, 300, 50);
NSString *labelString = @"Players.";
UILabel *howManyUsersLabel = [[UILabel alloc]initWithFrame:frame];
howManyUsersLabel.textAlignment = UITextAlignmentCenter;
howManyUsersLabel.backgroundColor = [UIColor clearColor];
howManyUsersLabel.textColor = [UIColor whiteColor];
howManyUsersLabel.adjustsFontSizeToFitWidth = NO;
howManyUsersLabel.numberOfLines = 0;
CGFloat fontSize = 30;
while (fontSize > 0.0)
{
CGSize size = [labelString sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(frame.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];
if (size.height <= frame.size.height) break;
fontSize -= 1.0;
NSLog(@"test");
}
howManyUsersLabel.font = [UIFont fontWithName:@"Verdana" size:fontSize];
Ответы
Ответ 1
Думаю, вам просто нужно добавить это:
label.adjustsFontSizeToFitWidth = YES;
label.minimumFontSize = 0;
Затем текст будет автоматически изменяться в соответствии с меткой.
Обратите внимание, что это будет действительно работать, только если label.numberOfLines = 1, так что текст находится в одной строке.
Если вам нужен текст для переноса на несколько строк, но он все же сжимается до соответствия, решение является более сложным. Для этого вам нужно вычислить визуализированный размер текста, а затем уменьшить его в цикле, как показано ниже:
NSString *theText = @"A long string";
CGRect labelRect = CGRectMake(10, 50, 300, 50);
label.adjustsFontSizeToFitWidth = NO;
label.numberOfLines = 0;
CGFloat fontSize = 30;
while (fontSize > 0.0)
{
CGSize size = [theText sizeWithFont:[UIFont fontWithName:@"Verdana" size:fontSize] constrainedToSize:CGSizeMake(labelRect.size.width, 10000) lineBreakMode:UILineBreakModeWordWrap];
if (size.height <= labelRect.size.height) break;
fontSize -= 1.0;
}
//set font size
label.font = [UIFont fontWithName:@"Verdana" size:fontSize];
В основном это уменьшает размер шрифта до тех пор, пока он не будет соответствовать метке.
UPDATE:
Как и в iOS7, многострочный текст также будет автоматически уменьшаться при adjustsFontSizeToFitWidth = YES
, поэтому вторая часть этого ответа больше не нужна (если вы все еще не поддерживаете iOS 6 и ранее).
Ответ 2
Наконец, я получил решение для проблемы выделения текста на арабском языке, которое вам просто нравится:
label.text = @"هذا هو نص طويل جدا";
label.textAlignment = NSTextAlignmentNatural;
CGSize size = [labels sizeThatFits:CGSizeMake(_lblAddress.width, CGFLOAT_MAX)];
label.height = size.height;
Ответ 3
[UILabel sizeToFit];
Он будет работать для вашей проблемы.
Ответ 4
CGRect titleRect = CGRectMake(10, 50, 300, 50);
UILabel *textTitleView = [[UILabel alloc] initWithFrame:titleRect];
textTitleView.numberOfLines = 3 //for multiple lines;
textTitleView.lineBreakMode = UILineBreakModeWordWrap;
[UIFont fontWithName:@"Verdana" size:30];
textTitleView.text = @"your text";
Ответ 5
Интерфейс Builder позволяет вам делать это сейчас.
- В UILabel под Autoshrink выберите "Минимальный размер шрифта" вместо "Fixed Font Size".
- Установите Минимальный размер шрифта как нечто разумное, например 8.
- Вы также можете проверить галочку "Затянуть расстояние между буквами" .
В качестве альтернативы вы можете сделать это программно:
label.adjustsFontSizeToFitWidth = YES;
Ответ 6
В iOS 8 все, кажется, сломано (возможно, iOS 7).
Решение:
-(UIFont*)fontForString:(NSString*)string toFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont {
UIFont* returnFont = seedFont;
CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}];
while(stringSize.width > rect.size.width){
returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}];
}
return returnFont;
}
Убедитесь, что вы не пытаетесь использовать label.adjustsFontSizeToFitWidth = YES
, иначе он будет действительно запутан и новый размер не будет работать должным образом.
Ответ 7
Swift с iOS 9
let maxFontSize: CGFloat = 40
let minFontSize: CGFloat = 10
label.font = UIFont(name: label.font.fontName, size: maxFontSize)!
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = minFontSize/maxFontSize
Это не увеличивает размер шрифта, чтобы заполнить метку. Он начинается с максимального размера и уменьшается по мере необходимости до минимума. Это также предполагает, что число строк равно 1.