Jan*_*les 6 iphone cocoa-touch ios
我需要将用户输入的文本移动到较大的多行中UITextView(但仍然是多行)UITextView*.如果用户输入的文本多于在较小视图中显示的文本,我想截断文本,使其适合所有可见的(截断的)文本.(无论是大的UITextView还是小的都不应该滚动.)
最好的方法是什么?
我可以使用一个循环,每次用字符缩短字符串,然后使用NSString's sizeWithFont: constrainedToSize: lineBreakMode:找出这个较短字符串所需的高度,然后将其与我在较小字符串中可用的高度进行比较UITextView,结束循环时字符串适合 - 但这似乎缓慢和尴尬.肯定有更好的办法.
我想告诉目的地UITextView截断它的displayText成员,因为它在屏幕上显示它,但我无法找到一种方法来做到这一点.
*更多关于此的背景,来自我在下面做出的评论:
我有一个风景应用程序.我根据用户选择的照片更改视图的布局.如果它是风景照片,则标题较小 - 只是照片底部的一条线.如果她选择一张肖像照片,那么我可以使用足够的空间放置照片侧面的标题,因此标题更大.
如果用户将照片方向从纵向更改为横向,则我要截断文本,然后允许她对其进行编辑以使其有意义.我可以摧毁它,但我宁愿保留它以减少她的打字.
我编写了以下递归方法和公共 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)
| 归档时间: |
|
| 查看次数: |
5626 次 |
| 最近记录: |