菜鸟教程小白 发表于 2022-12-13 10:01:35

ios - 如何以编程方式添加具有可变高度和布局 ios 的 UILabel


                                            <p><p>我一直在寻找一整天,但无法成功。</p>

<p>我有一个 <code>UIView</code> 有两个标签,在另一个上方,在左侧,在右侧有一个按钮。我添加了约束以让 <code>autolayout</code> 相应地调整 View 大小。当我为 <code>UIView</code> 的高度设置了一个约束(并且对两个 <code>UILabel</code> 的高度没有一个约束)时,一切都运行良好,但是作为较低的 <code>UILabel</code> 会有所不同,我删除了该约束并为 <code>UILabel</code> 设置了两个约束,一个为上 <code>UILabel</code> 固定,一个与“更大”的关系下层<code>UILabel</code>,另外一个用于固定下层<code>UILabel</code>和<code>UIView</code>之间的距离。</p>

<p>看起来自动布局无法计算下层 <code>UILabel</code> 的 <code>intrinsicContentSize</code>,因为尽管下层 <code>UILabel</code> 的内容不会增加其高度超过 10px</code>UILabel</code>.</p>

<pre><code>UIView *miView = [ init];
UILabel *miLabel = [ init];
;
;
;
;
UILabel *miDetailsLabel = [ init];
;
;
;
;
UIButton *miButton = [ init];
;
;

NSArray *constraint_inner_h = -(10)--(0)-|&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel, @&#34;button&#34;:miButton}];
NSArray *constraint_inner2_h = -(10)--(0)-|&#34; options:0 metrics:nil views:@{@&#34;details&#34;:miDetailsLabel, @&#34;button&#34;:miButton}];
NSArray *constraint_label_v = -(2)--(0)-|&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel, @&#34;details&#34;:miDetailsLabel}];
NSArray *constraint_button_v = &#34; options:0 metrics:nil views:@{@&#34;button&#34;:miButton}];
];
;
;
;
;
</code></pre>

<p>我放了一个精简版的代码。</p>

<p>对我缺少什么有什么想法吗?</p>

<p>谢谢</p>

<p>更新:感谢马特的建议,我已经尝试了这个解决方案来将正确的值设置为 <code>preferredMawLayoutWidth:</code></p>

<pre><code>- (void)viewDidLayoutSubviews {
    ;

    NSArray *allKeys = ;
    for (NSString *key in allKeys) {
      NSArray *tmpArray = ;
      if (![ isEqual:@&#34;&#34;]) {
            UILabel *tmpLabel = ;
            tmpLabel.preferredMaxLayoutWidth = tmpLabel.frame.size.width;
            NSLog(@&#34;width: %f&#34;,tmpLabel.frame.size.width);
      }
    }
    ;
}
</code></pre>

<p>为了解释代码,正如我所说,我是动态地做的,所以我创建了一个字典,其中包含一个数组,其中包含对我的 <code>UILabel</code> 的引用(以及其他有趣的信息)。当我运行代码时,我得到下一个日志(代码解析 3 <code>UILabel</code>,第一个标签没有内容):</p>

<pre><code>2014-12-28 20:40:42.898 myapp width: 0.000000
2014-12-28 20:40:42.912 myapp width: 0.000000
2014-12-28 20:40:43.078 myapp width: 229.000000
2014-12-28 20:40:43.080 myapp width: 229.000000
2014-12-28 20:40:43.326 myapp width: 229.000000
2014-12-28 20:40:43.327 myapp width: 229.000000
</code></pre>

<p>但我仍然得到相同的结果... UIView 仍然显示高度等于约束设置的最小高度,而不是显示 <code>UILabel</code> 的内容。</p >

<p>UPDATE 2 还在胡闹。</p>

<p>我已经测试了我的初始代码,但在 xcode 6 中的一个新项目上进行了简化,该项目在带有 iOS7 的实际 iPhone 4 上运行,并且无需设置 <code>preferredMaxLayoutWidth</code> 或子类化 <code>UILabel< 即可完美运行</code>,甚至没有在父 View 上调用 <code>layoutIfNeeded</code>。但是当涉及到真正的项目时(我认为它最初是在 xcode 4 或 5 中构建的)它不起作用:</p>

<pre><code>- (void)addLabelsDinamically {
    self.labelFixed.text = @&#34;Below this IB label goes others added dinamically...&#34;;

    UIButton *miBoton = [ init];
    miBoton.translatesAutoresizingMaskIntoConstraints = NO;
    ;
    ;
    ];
    &#34; options:0 metrics:nil views:@{@&#34;boton&#34;:miBoton}]];
    &#34; options:0 metrics:nil views:@{@&#34;boton&#34;:miBoton}]];

    UILabel *miLabel = [ init];
    miLabel.translatesAutoresizingMaskIntoConstraints = NO;
    miLabel.backgroundColor = ;
    miLabel.numberOfLines = 0;
    miLabel.text = @&#34;ñkhnaermgñlkafmbñlkadnlñejtnhalrmvlkamnñnañorenoetñnngñsdbmnñgwn&#34;;
    ;
    -(10)--(8)-|&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel,@&#34;boton&#34;:miBoton}]];
    -(8)-&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel,@&#34;previous&#34;:self.labelFixed}]];
    UIView *pre = miLabel;

    miLabel = [ init];
    miLabel.translatesAutoresizingMaskIntoConstraints = NO;
    miLabel.backgroundColor = ;
    miLabel.numberOfLines = 0;
    miLabel.text = @&#34;ñkhnaermgñlkafmbñlkadnlñejtnhalrmvlkamnñnañorenoetñnngñsdbmnñgwn&#34;;
    ;
    -(10)--(8)-|&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel,@&#34;boton&#34;:miBoton}]];
    -(8)-&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel,@&#34;previous&#34;:pre}]];
}
</code></pre>

<p>啊,在同一个屏幕上,我在 IB 上添加了一个 <code>UILabel</code>,<code>numberOfLines</code> 设置为“0”,垂直约束“大于或等于”和水平约束以类似的方式设置(但在 IB 上设置了两个约束)......而且效果很好......这让我发疯了!有什么帮助???</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>好吧,我终于找到了错误,正如我在“更新 2”中所说的,很奇怪它正在处理通过 IB 添加的 <code>UILabel</code>,但不是那些添加的动态的。</p>

<p>所以,我再次查看我在 IB 上的屏幕,发现我有一个“等于”关系的高度限制,当我将其更改为“大于或等于”时,一切都开始起作用了!!!!为什么我没有注意到约束不是“大于或等于”?因为当我在里面添加带有标签的 View 时,带有约束的 View 变得越来越大。这是一个错误吗?</p>

<p>好吧,总结一下是否有人觉得这很有用。 <strong>“如何添加<code>UILabel</code>的多行以适应其内容?”</strong> </p>

<p>在 <em>iOS 6 版本</em>中,这是一个带有“<code>preferredMaxLayoutWidth</code>”的错误,一旦“布局”就无法获得宽度,因此程序员必须设置它通过代码(最好的解决方案是动态执行,我在上面的问题中提出的一个例子)。</p>

<p>幸好在<em>iOS7及更高版本</em>上,这个问题已经解决了,只能靠约束了。</p>

<ol>
<li><p>通过 IB 添加</p>

<ul>
<li>添加 <code>UILabel</code>,并将“行数”设置为“0”(这将使 <code>UILabel</code> 使用尽可能多的行数)。</li >
<li>添加约束,您至少需要 3 个约束(固定到顶部或底部,以及两侧),第四个将是具有“大于或等于”关系的高度。</li>
<li>确保 View 容器有足够的空间,或者还具有“大于或等于”关系的高度约束。</li>
</ul></li>
<li><p>通过代码添加(只需粘贴上面发布的代码):</p>

<pre><code>UILabel *miLabel = [ init]; // Initialitze the UILabel
miLabel.translatesAutoresizingMaskIntoConstraints = NO;// Mandatory to disable old way of positioning
miLabel.backgroundColor = ;
miLabel.numberOfLines = 0;// Mandatory to allow multiline behaviour
miLabel.text = @&#34;ñkhnaergñsdbmnñgwn&#34;; // big test to test
;// Add subview to the parent view
-(10)-|&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel}]];// horizontal constraint
&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel}]];
UIView *pre = miLabel;

// Adding a second label to test the separation
miLabel = [ init];
miLabel.translatesAutoresizingMaskIntoConstraints = NO;
miLabel.backgroundColor = ;
miLabel.numberOfLines = 0;
miLabel.text = @&#34;ñkhnaermgñlkafmbnoetñnngñsdbmnñgwn&#34;;
;
-(10)-|&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel,@&#34;boton&#34;:miBoton}]];
-(10)-&#34; options:0 metrics:nil views:@{@&#34;label&#34;:miLabel,@&#34;previous&#34;:pre}]];
</code></pre> </li>
</ol>

<p>感谢那些试图帮助我的人!这个网站太棒了:)</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何以编程方式添加具有可变高度和布局 ios 的 UILabel,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/27678850/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/27678850/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何以编程方式添加具有可变高度和布局 ios 的 UILabel