如何截断UITextView内容以适应缩小的尺寸?

Chr*_*ris 7 iphone uitextview ios

我在解决这个问题时遇到了麻烦.

正如标题所示,我在iPhone应用程序中的视图上有几个UITextView.我以编程方式创建它们并成功地用文本填充textview,但在某些情况下,我放在视图中的文本比我为其分配的帧占用更多空间.在这种情况下,我希望文本被截断,但我无法弄清楚如何做到这一点.

我预先定义了以下常量;

#define viewOriginX  20
#define viewOriginY 180
Run Code Online (Sandbox Code Playgroud)

这是我的UITextView创建代码;

textViewOne = [[UITextView alloc] initWithFrame:CGRectMake(viewOriginX, viewOriginY + 65, 280, 45];
textViewOne.delegate = self;
textViewOne.scrollEnabled = NO;
textViewOne.contentInset = UIEdgeInsetsZero;
textViewOne.font = viewFont;
textViewOne.textColor = [UIColor blackColor];
textViewOne.textAlignment = UITextAlignmentLeft;
[self.view addSubview:textViewOne];
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我在这里有15到20行文本,我想将其截断为2行.

谁能帮助我朝正确的方向发展?

提前致谢!:d

fol*_*ben 41

原始答案(iOS 6及以下)

可悲的是,UILabelnumberOfLines不会做,如果你需要的视图可编辑.或者你想要UITextView(本机)垂直对齐.

这是一个NSString从字符串中删除单词的类别,根据它在矩形中的大小:

@interface NSString (StringThatFits)
- (NSString *)stringByDeletingWordsFromStringToFit:(CGRect)rect
                                         withInset:(CGFloat)inset
                                         usingFont:(UIFont *)font
@end

@implementation NSString (StringThatFits)
- (NSString *)stringByDeletingWordsFromStringToFit:(CGRect)rect
                                         withInset:(CGFloat)inset
                                         usingFont:(UIFont *)font
{
    NSString *result = [self copy];
    CGSize maxSize = CGSizeMake(rect.size.width  - (inset * 2), FLT_MAX);
    CGSize size = [result sizeWithFont:font
                           constrainedToSize:maxSize
                               lineBreakMode:UILineBreakModeWordWrap];
    NSRange range;

    if (rect.size.height < size.height)
        while (rect.size.height < size.height) {

            range = [result rangeOfString:@" "
                                        options:NSBackwardsSearch];

            if (range.location != NSNotFound && range.location > 0 ) {
                result = [result substringToIndex:range.location];
            } else {
                result = [result substringToIndex:result.length - 1];
            }

            size = [result sizeWithFont:font
                            constrainedToSize:maxSize
                                lineBreakMode:UILineBreakModeWordWrap];
        }

    return result;
}
@end
Run Code Online (Sandbox Code Playgroud)

对于a UITextView,使用插值8来说明UIKit绘制它们的方式:

CGRect rect = aTextView.frame;
NSString *truncatedString = [theString stringByDeletingWordsFromStringToFit:rect
                                     withInset:8.f
                                     usingFont:theTextView.font];
Run Code Online (Sandbox Code Playgroud)

更新的答案(iOS 7)

现在UITextView在内部使用TextKit,它更容易.

而不是截断实际的字符串,将text(或attributedText)属性设置为整个字符串并截断容器中显示的文本量(就像我们一样UILabel):

self.textView.scrollEnabled = NO;
self.textView.textContainer.maximumNumberOfLines = 0;
self.textView.textContainer.lineBreakMode = NSLineBreakByTruncatingTail;
Run Code Online (Sandbox Code Playgroud)


aka*_*kyy 1

您可以进行字符计数。例如,如果您有这样的 UITextField:

+--------------------+
|This is a string in |
|a text view.        |
+--------------------+
Run Code Online (Sandbox Code Playgroud)

每行大约有 20 个字符。如果您知道该数字,您可以简单地通过方法截断字符串-substringToIndex:

int maxCharacters = 40; // change it to your max
if([myString length] > maxCharacters) {
    myString = [myString substringToIndex:maxCharacters];
}
Run Code Online (Sandbox Code Playgroud)

你也可以考虑一下UILabel。由于您只需要 2 行文本,UILabel 的numberOfLines属性可以解决您的问题。