Stringlänge mit angegebener Schriftart passend zu UITextView 2 - The Return
Imdiese Frage Ich habe nach einer guten Möglichkeit gefragt, eine Zeichenfolge zu kürzen, um sie an eine bestimmte UITextView anzupassen. Da das SDK keine direkte Möglichkeit bietet, habe ich die folgende rekursive Methode geschrieben (die nur von der folgenden öffentlichen Methode aufgerufen wird). Dies funktioniert jedoch nur, wenn ich bei der Berechnung der Stringhöhe einen Fudge-Faktor von 15 (kFudgeFactor) von der Feldbreite abziehe. Wenn ich das nicht tue, ist die zurückgegebene Zeichenfolge tatsächlich zu lang für das Feld und wird in einer zusätzlichen Zeile darunter angezeigt. Hat jemand eine Idee warum und was ich wirklich anstelle dieses Fudge-Faktors verwenden sollte?
#pragma mark Size string to fit the new view
#define kFudgeFactor 15.0
#define kMaxFieldHeight 9999.0
// recursive method called by the main API
-(NSString*) sizeStringToFit:(NSString*)aString min:(int)aMin max:(int)aMax
{
if ((aMax-aMin) <= 1)
{
NSString* subString = [aString substringToIndex:aMin];
return subString;
}
int mean = (aMin + aMax)/2;
NSString* subString = [aString substringToIndex:mean];
CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight);
CGSize stringSize = [subString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
if (stringSize.height <= self.frame.size.height)
return [self sizeStringToFit:aString min:mean max:aMax]; // too small
else
return [self sizeStringToFit:aString min:aMin max:mean];// too big
}
-(NSString*)sizeStringToFit:(NSString*)aString
{
CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight);
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
// if it fits, just return
if (stringSize.height < self.frame.size.height)
return aString;
// too big - call the recursive method to size it
NSString* smallerString = [self sizeStringToFit:aString min:0 max:[aString length]];
return smallerString;
}