菜鸟教程小白 发表于 2022-12-12 20:44:26

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


                                            <p><p>这是我的目标:</p>

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

<p>有什么想法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><pre><code>- (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width
{
    UITextView *calculationView = [ init];
    ;
    CGSize size = ;
    return size.height;
}

- (void)viewDidLoad
{
    // Invoke super
    ;

    // Get text of unknown length
    NSMutableAttributedString *myAttributedString = [ initWithString:@&#34;String of unknown length here...&#34; attributes:@{NSForegroundColorAttributeName : }];

    // Get ellipsis w/ matching attributes
    NSDictionary *endCharAttributes = ;
    NSAttributedString *ellipsis = [ initWithString:@&#34;...&#34; attributes:endCharAttributes];

    // Define size constraints
    CGFloat maxHeight = 60;
    CGFloat fixedWidth = 300;

    // Get starting height
    CGFloat textViewHeight = ;

    // Reduce string size and add ellipsis until we fit within our height constraint
    while (textViewHeight &gt; maxHeight)
    {
      NSLog(@&#34;%f&#34;, textViewHeight);
      NSRange substringRange = {0, myAttributedString.length - 6}; // Reducing by 6 works for my app (strings are never huge)
      myAttributedString = [ initWithAttributedString:];
      ;
      NSLog(@&#34;myAttributedString = %@&#34;, myAttributedString);
      textViewHeight = ;
    }

    // Init and config UITextView
    UITextView *textView = [ init];
    textView.attributedText = myAttributedString;
    textView.frame = CGRectMake(0, 0, fixedWidth, textViewHeight);
    ;
}
</code></pre>

<p>有更优雅的解决方案吗?发布吧!</p>

<p>更新:您可以通过添加帮助器类并实现以下类方法来提高 <code>- (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width</code> 的性能:</code> p>

<pre><code>// 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(&amp;onceToken, ^{
      _calculationView = [ init];
    });
    return _calculationView;
}

// Public, app calls this a lot
+ (CGFloat)textViewHeightForAttributedText:(NSAttributedString*)text andWidth:(CGFloat)width usingUIEdgeInset:(UIEdgeInsets)edgeInsets
{
    .textContainerInset = edgeInsets;
    .attributedText = text;
    CGSize size = [ sizeThatFits:CGSizeMake(width, FLT_MAX)];
    return size.height;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何为 UITextView 设置最大高度和固定宽度并在发生溢出时强制省略而不是滚动?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/22594889/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/22594889/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何为 UITextView 设置最大高度和固定宽度并在发生溢出时强制省略而不是滚动?