Comprimento da corda com fonte dada para caber UITextView 2 - o retorno

Emessa questão Eu pedi uma boa maneira de truncar uma string para caber um determinado UITextView. Como não havia nenhuma maneira fornecida pelo SDK diretamente, acabei escrevendo o método recursivo abaixo (chamado apenas pelo método público a seguir). No entanto, isso não funciona, a menos que eu subtraia um fator de correção de 15 (kFudgeFactor) da largura do campo ao calcular a altura da string. Se eu não fizer isso, a string retornada será realmente muito longa para o campo e será exibida em uma linha extra abaixo dela. Alguém tem alguma ideia do porquê, e o que eu realmente deveria usar em vez desse fator fudge?

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

questionAnswers(2)

yourAnswerToTheQuestion