Verwenden Sie UIabels sizeToFit anstelle von sizeWithFont: um ein mehrzeiliges UILabel zu erstellen, da sizeWithFont: die Zeichenfolge abschneidet (siehe apple docs). Der folgende Code reduziert die Schriftgröße eines Etiketts, bis der Text passen in eine der angegebenen Größe ... mehrere Textzeilen werden so schnell verwendet werden, wie sie in der angegebenen Höhe passen:
-(void)setFontSizeOfMultiLineLabel: (UILabel*)label
toFitSize: (CGSize) size
forMaxFontSize: (CGFloat) maxFontSize
andMinFontSize: (CGFloat) minFontSize
startCharacterWrapAtSize: (CGFloat)characterWrapSize{
CGRect constraintSize = CGRectMake(0, 0, size.width, 0);
label.frame = constraintSize;
label.lineBreakMode = UILineBreakModeWordWrap;
label.numberOfLines = 0; // allow any number of lines
for (int i = maxFontSize; i > minFontSize; i--) {
if((i < characterWrapSize) && (label.lineBreakMode == UILineBreakModeWordWrap)){
// start over again with lineBreakeMode set to character wrap
i = maxFontSize;
label.lineBreakMode = UILineBreakModeCharacterWrap;
}
label.font = [label.font fontWithSize:i];
[label sizeToFit];
if(label.frame.size.height < size.height){
break;
}
label.frame = constraintSize;
}
}
Rufen Sie diese mit einem Label, die Ihren Lieblings Text und Schriftart hat:
UILabel *label = [[UILabel alloc] initWithFrame: CGRectZero];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.text = text;
label.font = [UIFont fontWithName: @"Helvetica" size: 16];
[self setFontSizeOfMultiLineLabel: label toFitSize: CGSizeMake(200, 44) forMaxFontSize: 16 andMinFontSize: 8 startCharacterWrapAtSize: 11];
der startCharacterWrapAtSize Parameter können Sie wählen characterWrap Ausgangsgröße bei der Angabe der Schriftart verwenden. Dies sollte Platz sparen, wenn wordWrap wirklich kleine Schriftarten verwenden würde.
edit: Bugfix
sizeWithFont ist in iOS7 veraltet und stattdessen sollte boundingRectWithSize verwendet werden. –