Iphone 符合UITextView的给定字体的字符串长度

Iphone 符合UITextView的给定字体的字符串长度,iphone,ios,cocoa-touch,Iphone,Ios,Cocoa Touch,我需要将用户在大型多行UITextView中输入的文本移动到较小(但仍然是多行)的UITextView*。如果用户输入的文本比较小视图中显示的文本多,我希望截断文本,使其与所有可见的(截断的)文本匹配。(大的UITextView和小的都不应滚动。) 最好的方法是什么 我可以使用循环,每次将字符串缩短一个字符,然后使用NSString的sizeWithFont:constrainedToSize:lineBreakMode:找出这个较短字符串所需的高度,然后将其与较小的UITextView中的可用

我需要将用户在大型多行
UITextView
中输入的文本移动到较小(但仍然是多行)的
UITextView
*。如果用户输入的文本比较小视图中显示的文本多,我希望截断文本,使其与所有可见的(截断的)文本匹配。(大的
UITextView
和小的都不应滚动。)

最好的方法是什么

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

我只想告诉目标
UITextView
在屏幕上显示时截断其displayText成员,但我还没有找到一种方法

*关于这一点,我的评论如下:

我有一个景观应用程序。我根据用户选择的照片更改视图的布局。如果是一张风景照片,标题会更小——只在照片底部画一条线。如果她选择了一张肖像照片,那么我可以在照片的侧面留出足够的空间作为标题,因此标题会更大


如果用户将其照片方向从纵向更改为横向,那么我希望截断文本,然后允许她对其进行编辑,使其有意义。我可以直接点击它,但我更愿意保留它以减少她的输入。

我建议采取稍微不同的方法,看看是否可以使用UILabel而不是较小的UIExtView

UILabel可以通过其numberOfLines属性设置为多行,就像UITextView一样


UILabels还有一个lineBreakMode属性,我相信该属性的默认值会产生您想要的精确截断效果。

我想Jonathan已经了解了UILabel的一些内容

因此,用户编辑完UITextView后,您将获得文本字符串并将其传递给UILabel。将UITextView的alpha更改为0和/或将其从superview中删除。可能将不受信任的全文存储在ivar中

UILabel不可“编辑”,但是您可以检测到UILabel(或其superview)的触摸。 当检测到UILabel上的触摸时,只需恢复隐藏的UITextView并恢复保存的字符串


有时SDK是一种痛苦,但它几乎总是赢得战斗。很多时候,最好将您的设计调整为UIKit约定

这实际上不是一个解决方案,但它确实为计算提供了一个良好的起点

如果使用NSString的
sizeWithFont:constrainedToSize:lineBreakMode:
可以获得文本的垂直高度。如果将其除以字体的前导高度,则得到整个字符串中的行数。将[NSString count]除以该数字可以得到每行字符数的近似值。这假设字符串是同质的,如果有人键入(例如)与“MMMMMMMMM…”相对应的“iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii

您还可以将边界框除以相关字体的
前导
高度,以获得适合边界框的行数

将每行字符数乘以行数可以为您找到适合的文本提供一个起点


您可以通过对“iiiiii…”和“MMMMMM…”字符串执行相同的计算来计算此图中的误差幅度。

我编写了以下递归方法和公共API来正确执行此操作。丑陋的伪造因素是本文的主题

#定义预算系数15.0
#定义kMaxFieldHeight 9999.0
//主API调用的递归方法
-(NSString*)sizeStringToFit:(NSString*)aString min:(int)aMin max:(int)aMax
{

如果((aMax aMin)但我认为UILabels不可编辑,可以吗?我希望用户能够在这两个字段中输入文本(特别是在我截断它之后-文本可能没有意义)你是对的,UILabels是不可编辑的。我想你现在已经难住我了。一般来说,我想知道当编辑较小的UITextView时,用户会有什么样的体验。用户可以编辑所有的文本,还是只编辑未被截断的部分?如果用户能够编辑所有的文本,用户如何判断他们的编辑已被删除FECT如果它们在编辑会话结束后被截断了?由于这些原因,我可能会考虑将较小的视图作为文本的只读摘要。需要更多的信息。我有一个景观应用程序。发生的是,根据用户选择的照片,我改变视图的布局。如果是一张风景照片,CA。选项较小-仅在照片底部有一条线。如果他们选择一张肖像照片,那么我可以在照片侧面为标题留出足够的空间,因此标题更大。如果用户将其照片方向从纵向更改为横向,则我希望截断文本,然后允许他更改以使其有意义。a我还记得另一个可能的备选方案。我记得照片是你打印在纸上并握在手中的东西。在那些日子里,人们怎么加字幕?他们写在照片的背面。所以也许你可以“翻转”到照片的背面。"使用标准翻转动画之一。现在,您的UITextView可以更大,其大小可以独立于照片方向。您也可以有更多的空间来显示照片本身。如果有必要,您也可以在照片正面显示带有标签的标题。感谢您的帮助Jonathan-我很高兴爱丽,我很感激,问题是
#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;   
}