给定字体的字符串长度以适合UITextView 2 - 返回

时间:2009-07-08 00:31:49

标签: iphone cocoa-touch

this question中,我要求一种截断字符串以适合给定UITextView的好方法。由于SDK没有直接提供的方法,我最终编写了下面的递归方法(仅通过以下公共方法调用)。但是,除非我在计算字符串的高度时从字段宽度中减去软糖因子15(kFudgeFactor),否则这不起作用。如果我不这样做,返回的字符串对于字段来说实际上太长了,并且显示在它下面的额外行中。任何人都知道为什么,我应该使用什么而不是这个软糖因素?

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

2 个答案:

答案 0 :(得分:5)

UIScrollView似乎在两侧使用固定的8像素插图。这与对齐或字体大小无关(基于测试和观察,而不是对内部的任何明确知识)。

所以看来你使用你的软糖因子是正确的,但它应该是16.0,而不是15.0

答案 1 :(得分:0)

这可能是因为UIView的框架与内容视图的大小不同。 来自UIScrollView的UITextView子类。