Longitud de cadena con la fuente dada para que se ajuste a UITextView 2 - The Return

Enesta pregunta Pedí una buena manera de truncar una cadena para que se ajuste a un determinado UITextView. Como el SDK no proporcionó ninguna manera directamente, terminé escribiendo el método recursivo a continuación (solo se llama mediante el siguiente método público). Sin embargo, esto no funciona a menos que reste un factor de fudge de 15 (kFudgeFactor) del ancho del campo al calcular la altura de la cuerda. Si no lo hago, la cadena devuelta es en realidad demasiado larga para el campo y se muestra en una línea adicional debajo de ella. ¿Alguien tiene alguna idea de por qué, y qué debo usar realmente en lugar de este factor de 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;   
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta