如果发生溢出,如何设置UITextView的最大高度和固定宽度并强制省略号而不是滚动?

约翰·埃克

这是我的目标:

  1. 我想使用UITextView而不是UILabel,因为我希望用户能够选择文本并进行复制。
  2. 我希望UITextView在60点的高度最大。
  3. 我希望UITextView具有300磅的固定宽度。
  4. 我希望UITextView在单词上换行。
  5. 假设根据我输入的属性文本字符串,它需要3行才能达到最大60点的高度。因此,如果我将UITextView的属性文本输入6行,我希望UITextView的最大行距为60点,并显示3行,后接省略号(例如...)。
  6. 我不希望文本视图能够滚动。
  7. 如果我将UITextView的单个单词作为属性文本(例如“ Hello”)输入,我希望UITextView仍然具有300磅的固定宽度,但动态高度应尽可能小,对于一个高度大约为20磅。在此示例中单行文本。
  8. 我希望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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

文本溢出:高度有限的div内的弹性高度div内的省略号

来自分类Dev

设置“文本溢出:省略号”的点颜色

来自分类Dev

最大高度,溢出:滚动和位置

来自分类Dev

CSS文本溢出属性省略号可以应用于垂直滚动文本吗?

来自分类Dev

如果列数据超过设置的记录数,如何在列数据上设置省略号

来自分类Dev

文字溢出:IE中的省略号

来自分类Dev

如何为TD设置省略号

来自分类Dev

CSS文字省略号和100%宽度

来自分类Dev

滚动时文本溢出省略号未在Chrome和IE中显示溢出内容

来自分类Dev

CSS文字溢出省略号+以%表示的宽度无效

来自分类Dev

带省略号的段落溢出

来自分类Dev

Reduce()和...(省略号)

来自分类Dev

如何选择我的溢出省略号开始的位置

来自分类Dev

文字溢出的样式点:省略号

来自分类Dev

CSS div自动调整大小到内容,带有最大宽度和省略号文本

来自分类Dev

具有第二列动态宽度和省略号的固定宽度表

来自分类Dev

宽度100%元素中的文本溢出省略号实现

来自分类Dev

如何使用省略号文本溢出来适应卡的高度

来自分类Dev

如何将固定宽度和高度设置为SVG

来自分类Dev

CSS文字溢出:省略号不取决于宽度

来自分类Dev

最大高度,溢出:滚动和位置

来自分类Dev

如何使用文字溢出:省略号?

来自分类Dev

文本溢出:省略号和显示表格单元

来自分类Dev

文字溢出的样式点:省略号

来自分类Dev

省略号以限制离子的文本高度和宽度

来自分类Dev

如何在Angular中使用省略号和标签实现(动态宽度)文本输入?

来自分类Dev

使用文本溢出获取跨度中文本的宽度:省略号;在 IE11

来自分类Dev

文本溢出:省略号不被尊重

来自分类Dev

使用 vue-material,如何让文本换行而不是溢出到列表中的省略号?

Related 相关文章

  1. 1

    文本溢出:高度有限的div内的弹性高度div内的省略号

  2. 2

    设置“文本溢出:省略号”的点颜色

  3. 3

    最大高度,溢出:滚动和位置

  4. 4

    CSS文本溢出属性省略号可以应用于垂直滚动文本吗?

  5. 5

    如果列数据超过设置的记录数,如何在列数据上设置省略号

  6. 6

    文字溢出:IE中的省略号

  7. 7

    如何为TD设置省略号

  8. 8

    CSS文字省略号和100%宽度

  9. 9

    滚动时文本溢出省略号未在Chrome和IE中显示溢出内容

  10. 10

    CSS文字溢出省略号+以%表示的宽度无效

  11. 11

    带省略号的段落溢出

  12. 12

    Reduce()和...(省略号)

  13. 13

    如何选择我的溢出省略号开始的位置

  14. 14

    文字溢出的样式点:省略号

  15. 15

    CSS div自动调整大小到内容,带有最大宽度和省略号文本

  16. 16

    具有第二列动态宽度和省略号的固定宽度表

  17. 17

    宽度100%元素中的文本溢出省略号实现

  18. 18

    如何使用省略号文本溢出来适应卡的高度

  19. 19

    如何将固定宽度和高度设置为SVG

  20. 20

    CSS文字溢出:省略号不取决于宽度

  21. 21

    最大高度,溢出:滚动和位置

  22. 22

    如何使用文字溢出:省略号?

  23. 23

    文本溢出:省略号和显示表格单元

  24. 24

    文字溢出的样式点:省略号

  25. 25

    省略号以限制离子的文本高度和宽度

  26. 26

    如何在Angular中使用省略号和标签实现(动态宽度)文本输入?

  27. 27

    使用文本溢出获取跨度中文本的宽度:省略号;在 IE11

  28. 28

    文本溢出:省略号不被尊重

  29. 29

    使用 vue-material,如何让文本换行而不是溢出到列表中的省略号?

热门标签

归档