给定字体的字符串长度以适合UITextView

Jan*_*les 6 iphone cocoa-touch ios

我需要将用户输入的文本移动到较大的多行中UITextView(但仍然是多行)UITextView*.如果用户输入的文本多于在较小视图中显示的文本,我想截断文本,使其适合所有可见的(截断的)文本.(无论是大的UITextView还是小的都不应该滚动.)

最好的方法是什么?

我可以使用一个循环,每次用字符缩短字符串,然后使用NSString's sizeWithFont: constrainedToSize: lineBreakMode:找出这个较短字符串所需的高度,然后将其与我在较小字符串中可用的高度进行比较UITextView,结束循环时字符串适合 - 但这似乎缓慢和尴尬.肯定有更好的办法.

我想告诉目的地UITextView截断它的displayText成员,因为它在屏幕上显示它,但我无法找到一种方法来做到这一点.

*更多关于此的背景,来自我在下面做出的评论:

我有一个风景应用程序.我根据用户选择的照片更改视图的布局.如果它是风景照片,则标题较小 - 只是照片底部的一条线.如果她选择一张肖像照片,那么我可以使用足够的空间放置照片侧面的标题,因此标题更大.

如果用户将照片方向从纵向更改为横向,则我要截断文本,然后允许她对其进行编辑以使其有意义.我可以摧毁它,但我宁愿保留它以减少她的打字.

Jan*_*les 3

我编写了以下递归方法和公共 API 来正确执行此操作。丑陋的软糖因素是这个问题的主题。

#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;   
}
Run Code Online (Sandbox Code Playgroud)