IOS/Objective-C: MakeUILabel 使用自动布局流向多行

Posted

技术标签:

【中文标题】IOS/Objective-C: MakeUILabel 使用自动布局流向多行【英文标题】:IOS/Objective-C: MakeUILabel Flow to Multiple Lines with Autolayout 【发布时间】:2018-03-22 17:02:05 【问题描述】:

我正在尝试让 UILabel 流向多行并使用自动布局将其下方的元素向下推。

这是我在 viewwillappear 中调用的代码。

self.myLabel.numberOfLines = 0;
self.myLabel.lineBreakMode = NSLineBreakByWordWrapping;
[_myLabel setContentCompressionResistancePriority:1000
               forAxis:UILayoutConstraintAxisVertical];
[self.myLabel setNeedsDisplay];
[self.myLabel layoutIfNeeded];
[self.view setNeedsDisplay];
[self.view layoutIfNeeded];

UILabel 被限制在内容视图的顶部,而它下方的图像被限制在 UILabel 的底部。该标签还具有 >=21 的高度限制。

在初始加载时,标签只显示一行。

奇怪的是,在启动模态 VC 并关闭它后,标签确实转到多行,但未能将其下方的元素下推。

在初始加载时。

启动和取消模态VC后

我想知道问题是否与布置子视图的时间有关,但我几乎尝试了所有事情。

提前感谢您的任何建议。

【问题讨论】:

如何在界面生成器中设置 .lines 您的限制是什么?您是否将所有视图都设置为限制在主视图的顶部,或者它们是否限制在 UILabel 的底部?你有没有调试过视图层次结构? 标签如何约束在x轴上? IB 中的行数为 0。大约有 40 个约束。标签顶部被限制为超级视图。然后垂直的将所有内容链接到它上面的元素。底部元素被限制在超级视图的底部。它的优先级为 250,因此可以调整。在 x 轴上,标签受前导和尾随的限制。 我终于找到了一个解决方案,虽然不是一个优雅的解决方案:在 didLayoutSubviews 中手动调整大小。我为高度约束创建了一个实例变量,并在 viewdidlayoutsubviews 中设置: CGSize labelSize = [self.myLabel sizeThatFits:CGSizeMake(self.myLabel.frame.size.width, FLT_MAX)];浮动标签高度=标签大小.高度; _myLabelHeight.constant=labelHeight; 【参考方案1】:

简单示例:

创建一个新的 ViewController。 添加一个按钮,从顶部限制 40 点并水平居中 添加 UIView(绿色视图)。限制水平居中,宽度为 240,顶部空间为 20。 为绿色视图添加两个标签。 顶部标签,行数 = 0,前导和尾随约束 16,顶部约束 8(到绿色超级视图) 底部标签,水平居中,顶部空间到顶部标签 8,底部约束 8(到绿色超级视图)。 将 Top 标签连接到视图控制器中的 @IBOutlet var multiLineLabel: UILabel!。 将按钮 touch-up-inside 连接到视图控制器中的 @IBAction func didTap(_ sender: Any) 函数。 优先级没有变化。

运行应用程序。每次点击按钮都会将文本添加到顶部/多行标签,它会“下推”底部标签,进而“下推”绿色视图的底部边缘。

class ExpandingLabelViewController: UIViewController 

    @IBOutlet var multiLineLabel: UILabel!

    @IBAction func didTap(_ sender: Any) 

        if let s = multiLineLabel.text 

            multiLineLabel.text = s + " Here is some more text."

        

    


一旦你完成了这项工作,你就可以将其他元素添加到视图中。只要确保你有一个垂直间距约束的“链”,最顶部的元素被限制在绿色超级视图的顶部,最底部的元素被限制在绿色超级视图的底部。

【讨论】:

您的示例有效。就我而言,我将重做所有约束,因为某处出了差错。

以上是关于IOS/Objective-C: MakeUILabel 使用自动布局流向多行的主要内容,如果未能解决你的问题,请参考以下文章

IOS/Objective-C:从 NSManagedObject 构建 NSDictionary

iOS/Objective-C:有啥方法可以查看安排了哪些 localNotifications? [复制]

如何通过NEHotspotHelper获取WiFi列表(IOS,objective-c)

IOS/Objective-C:调用完成块的语法

从 iOS 中的私钥派生的证书(Objective-C)

IOS/Objective-C:无法显示核心数据信息