String length with given font to fit UITextView

后端 未结 4 753
遇见更好的自我
遇见更好的自我 2021-01-01 00:17

I need to move text that the user has entered into a large multi-line UITextView into a smaller (but still multi-line) UITextView*. If the user has

4条回答
  •  臣服心动
    2021-01-01 01:06

    I wrote the following recursive method and public API to do this properly. The ugly fudge factor is the subject of this question.

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

提交回复
热议问题