这是我的目标:

  • 我想使用UITextView而不是UILabel,因为我希望用户能够选择文本并进行复制。
  • 我希望UITextView在60点的高度处最大。
  • 我希望UITextView具有300磅的固定宽度。
  • 我希望UITextView在单词上换行。
  • 让我们说,根据我输入的属性文本字符串,它需要3行才能达到最大60点高度。因此,如果我向UITextView输入了6行有价值的属性文本,我希望UITextView最大化到60点并显示3行,后接省略号(例如...)。
  • 我不希望文本视图可滚动。
  • 如果我将UITextView的单个单词作为属性文本(例如“Hello”)输入,我希望UITextView仍具有300磅的固定宽度,但动态高度应尽可能小,大约为20磅。在此示例中一行文本。
  • 我希望UITextView的内部填充为零。

  • 有任何想法吗?

    最佳答案

    - (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width
    {
        UITextView *calculationView = [[UITextView alloc] init];
        [calculationView setAttributedText:text];
        CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];
        return size.height;
    }
    
    - (void)viewDidLoad
    {
        // Invoke super
        [super viewDidLoad];
    
        // Get text of unknown length
        NSMutableAttributedString *myAttributedString = [[NSMutableAttributedString alloc] initWithString:@"String of unknown length here..." attributes:@{NSForegroundColorAttributeName : [UIColor redColor]}];
    
        // Get ellipsis w/ matching attributes
        NSDictionary *endCharAttributes = [myAttributedString attributesAtIndex:myAttributedString.length - 1 effectiveRange:NULL];
        NSAttributedString *ellipsis = [[NSAttributedString alloc] initWithString:@"..." attributes:endCharAttributes];
    
        // Define size constraints
        CGFloat maxHeight = 60;
        CGFloat fixedWidth = 300;
    
        // Get starting height
        CGFloat textViewHeight = [self textViewHeightForAttributedText:myAttributedString andWidth:fixedWidth];
    
        // Reduce string size and add ellipsis until we fit within our height constraint
        while (textViewHeight > maxHeight)
        {
            NSLog(@"%f", textViewHeight);
            NSRange substringRange = {0, myAttributedString.length - 6}; // Reducing by 6 works for my app (strings are never huge)
            myAttributedString = [[NSMutableAttributedString alloc] initWithAttributedString:[myAttributedString attributedSubstringFromRange:substringRange]];
            [myAttributedString appendAttributedString:ellipsis];
            NSLog(@"myAttributedString = %@", myAttributedString);
            textViewHeight = [self textViewHeightForAttributedText:myAttributedString andWidth:fixedWidth];
        }
    
        // Init and config UITextView
        UITextView *textView = [[UITextView alloc] init];
        textView.attributedText = myAttributedString;
        textView.frame = CGRectMake(0, 0, fixedWidth, textViewHeight);
        [self.view addSubview:textView];
    }
    

    有更优雅的解决方案吗?发表它!

    更新:您可以通过添加一个助手类并实现以下类方法来提高- (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width的性能:
    // Private, gets us to alloc init calculation view one time for life of application
    + (UITextView *)calculationView
    {
        static UITextView *_calculationView;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _calculationView = [[UITextView alloc] init];
        });
        return _calculationView;
    }
    
    // Public, app calls this a lot
    + (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width usingUIEdgeInset:(UIEdgeInsets)edgeInsets
    {
        [self calculationView].textContainerInset = edgeInsets;
        [self calculationView].attributedText = text;
        CGSize size = [[self calculationView] sizeThatFits:CGSizeMake(width, FLT_MAX)];
        return size.height;
    }
    

    关于ios - 如果发生溢出,如何设置UITextView的最大高度和固定宽度并强制省略号而不是滚动?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22594889/

    10-14 20:43