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)-|" options:0 metrics:nil views:@{@"label":miLabel, @"button":miButton}];
NSArray *constraint_inner2_h = -(10)--(0)-|" options:0 metrics:nil views:@{@"details":miDetailsLabel, @"button":miButton}];
NSArray *constraint_label_v = -(2)--(0)-|" options:0 metrics:nil views:@{@"label":miLabel, @"details":miDetailsLabel}];
NSArray *constraint_button_v = " options:0 metrics:nil views:@{@"button":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:@""]) {
UILabel *tmpLabel = ;
tmpLabel.preferredMaxLayoutWidth = tmpLabel.frame.size.width;
NSLog(@"width: %f",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 = @"Below this IB label goes others added dinamically...";
UIButton *miBoton = [ init];
miBoton.translatesAutoresizingMaskIntoConstraints = NO;
;
;
];
" options:0 metrics:nil views:@{@"boton":miBoton}]];
" options:0 metrics:nil views:@{@"boton":miBoton}]];
UILabel *miLabel = [ init];
miLabel.translatesAutoresizingMaskIntoConstraints = NO;
miLabel.backgroundColor = ;
miLabel.numberOfLines = 0;
miLabel.text = @"ñkhnaermgñlkafmbñlkadnlñejtnhalrmvlkamnñnañorenoetñnngñsdbmnñgwn";
;
-(10)--(8)-|" options:0 metrics:nil views:@{@"label":miLabel,@"boton":miBoton}]];
-(8)-" options:0 metrics:nil views:@{@"label":miLabel,@"previous":self.labelFixed}]];
UIView *pre = miLabel;
miLabel = [ init];
miLabel.translatesAutoresizingMaskIntoConstraints = NO;
miLabel.backgroundColor = ;
miLabel.numberOfLines = 0;
miLabel.text = @"ñkhnaermgñlkafmbñlkadnlñejtnhalrmvlkamnñnañorenoetñnngñsdbmnñgwn";
;
-(10)--(8)-|" options:0 metrics:nil views:@{@"label":miLabel,@"boton":miBoton}]];
-(8)-" options:0 metrics:nil views:@{@"label":miLabel,@"previous":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 = @"ñkhnaergñsdbmnñgwn"; // big test to test
;// Add subview to the parent view
-(10)-|" options:0 metrics:nil views:@{@"label":miLabel}]];// horizontal constraint
" options:0 metrics:nil views:@{@"label":miLabel}]];
UIView *pre = miLabel;
// Adding a second label to test the separation
miLabel = [ init];
miLabel.translatesAutoresizingMaskIntoConstraints = NO;
miLabel.backgroundColor = ;
miLabel.numberOfLines = 0;
miLabel.text = @"ñkhnaermgñlkafmbnoetñnngñsdbmnñgwn";
;
-(10)-|" options:0 metrics:nil views:@{@"label":miLabel,@"boton":miBoton}]];
-(10)-" options:0 metrics:nil views:@{@"label":miLabel,@"previous":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]