• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 如何为 UITextView 设置最大高度和固定宽度并在发生溢出时强制省略而不是滚动?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 20:44:26 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

这是我的目标:

  1. 我想使用 UITextView 而不是 UILabel,因为我希望用户能够选择文本并进行复制。
  2. 我希望 UITextView 在 60 点的高度达到最大值。
  3. 我希望 UITextView 具有 300 磅的固定宽度。
  4. 我希望 UITextView 在单词上换行。
  5. 假设,根据我输入的属性文本字符串,它需要 3 行才能达到 60 点的最大高度。因此,如果我为 UITextView 提供 6 行属性文本,我希望 UITextView 最大为 60 点并显示 3 行,后跟省略号(例如 ...)。
  6. 我不希望 TextView 可以滚动。
  7. 如果我向 UITextView 提供一个单词作为属性文本,例如“Hello”,我希望 UITextView 仍然具有 300 磅的固定宽度,但动态高度可以缩放到尽可能小,大约 20在本例中为单行文本点。
  8. 我希望 UITextView 的内部填充为零。

有什么想法吗?



Best Answer-推荐答案


- (CGFloat)textViewHeightForAttributedTextNSAttributedString*)text andWidthCGFloat)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)textViewHeightForAttributedTextNSAttributedString*)text andWidthCGFloat)width 的性能: p>

// 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)textViewHeightForAttributedTextNSAttributedString*)text andWidthCGFloat)width usingUIEdgeInsetUIEdgeInsets)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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap