Ios 动态调整内部文本大小以适应后,动态调整UILabel框架高度

Ios 动态调整内部文本大小以适应后,动态调整UILabel框架高度,ios,swift,uilabel,Ios,Swift,Uilabel,我正在使用一个UILabel,它被限制为固定的宽度,并且不超过一定的高度(例如,固定为屏幕大小的一半) 为了让我们的应用程序能够跨iOS设备工作,我在UILabel上将adjustsfontsizetofitwidth设置为true。如果屏幕尺寸较小,这将导致文本字体大小的调整 但是,如果字体确实调整了大小,UILabel现在对文本有额外的顶部和底部填充。这被标记为其固有内容大小的一部分 这个额外的垂直填充是有问题的,因为我有一个按钮,它需要位于最后一行文本的基线的正下方 我现在需要一种方法来重

我正在使用一个UILabel,它被限制为固定的宽度,并且不超过一定的高度(例如,固定为屏幕大小的一半)

为了让我们的应用程序能够跨iOS设备工作,我在UILabel上将
adjustsfontsizetofitwidth
设置为true。如果屏幕尺寸较小,这将导致文本字体大小的调整

但是,如果字体确实调整了大小,UILabel现在对文本有额外的顶部和底部填充。这被标记为其固有内容大小的一部分

这个额外的垂直填充是有问题的,因为我有一个按钮,它需要位于最后一行文本的基线的正下方

我现在需要一种方法来重新调整我的框架,以紧密适应新调整的文本大小

我尝试在视图类中使用
layoutSubviews()
中的
sizeToFit()
以及
invalidateIntrinsicContentSize
,但都没有用

这似乎与和相似,但它们都没有适合我的答案

类问题示例:UIViewController{
专用let指令标签:UILabel={
let label=UILabel().disableAutoresizingMask()
label.numberOfLines=0
label.text=“我的观点是正确的,我的观点是正确的,我的观点是正确的。我的观点是正确的。我的观点是正确的。我的观点是正确的,我的观点是正确的。我的观点是正确的。我的观点是正确的,我的观点是正确的。我的观点是正确的。我的观点是正确的,我的观点是正确的。我的观点是正确的,我的观点是正确的,我的观点是正确的。”
label.font=Theme.headingFont//大字体
label.setLineSpacing(倍数:1.15)
label.textColor=.black
label.lineBreakMode=.byTruncatingTail
label.adjustsFontSizeToFitWidth=true;
label.minimumScaleFactor=0.5
退货标签
}()
重写func viewDidLoad(){
super.viewDidLoad()
self.addSubview(指令标签)
//使用https://github.com/roberthein/TinyConstraints 句法轻巧
说明标签宽度到Superview(乘数:0.5)
指令标签.高度到视图(乘数:0.5,关系:。无等式)
指令标签。centerYToSuperview()
button=UIButton()
self.addSubView()
按钮。底部(至:说明标签)
}
}

当您需要将文本放入框架或根据文本大小拉伸框架时,您可以从内置行为中获益。在我看来,这两者都需要。因此您必须自己完成

近似流量如下所示:

  • 获取要指定给标签的文本
  • 在知道文本宽度的情况下计算文本的高度()
  • 如果文字高度大于最大标签高度,请将标签设置为最大高度,否则将其设置为文字高度
  • 为标签指定文本

当您需要将文本放入框架或根据文本大小拉伸框架时,您可以从内置行为中获益。在我看来,这两者都需要。因此,您必须自己动手

近似流量如下所示:

  • 获取要指定给标签的文本
  • 在知道文本宽度的情况下计算文本的高度()
  • 如果文字高度大于最大标签高度,请将标签设置为最大高度,否则将其设置为文字高度
  • 为标签指定文本

尝试使用以下代码,始终在
viewdilayoutsubview
viewdilayoutsubview

 override func viewDidLoad() {
        super.viewDidLoad()

    }

 override func viewDidLayoutSubViews(){
        super.viewDidLayoutSubViews()
        self.addSubview(instructionsLabel)
        // Using https://github.com/roberthein/TinyConstraints for syntactical lightness
        instructionsLabel.widthToSuperview(multiplier:0.5)
        instructionsLabel.heightToSuperview(multiplier:0.5, relation:.equalOrLess)
        instructionsLabel.centerYToSuperview()
        if button == nil {
            button = UIButton()
            self.addSubView()
            button.bottom(to: instructionsLabel)
        }
}

尝试使用以下代码,始终在
viewdilayoutsubviews
viewdilayoutsubviews

 override func viewDidLoad() {
        super.viewDidLoad()

    }

 override func viewDidLayoutSubViews(){
        super.viewDidLayoutSubViews()
        self.addSubview(instructionsLabel)
        // Using https://github.com/roberthein/TinyConstraints for syntactical lightness
        instructionsLabel.widthToSuperview(multiplier:0.5)
        instructionsLabel.heightToSuperview(multiplier:0.5, relation:.equalOrLess)
        instructionsLabel.centerYToSuperview()
        if button == nil {
            button = UIButton()
            self.addSubView()
            button.bottom(to: instructionsLabel)
        }
}

如果需要动态高度,则不要使用此约束heightToSuperview…..只需使用left、right、bottom、top约束。您可以使用宽度约束,但不能使用高度。@Winston尝试“label.lineBreakMode=.wordWrap”,然后它会增加高度。考虑到您已给出了所有适当的约束(顶部、前导、训练、底部)请记住,顶部和底部约束不是固定值。我计算UILabel高度的方法@Abulhassan我的意思是将heightToSuperview作为小于或等于约束。如果需要动态高度,则不要使用此约束heightToSuperview…..只需使用左、右、底部、顶部约束您可以使用宽度约束int,但不是height。@温斯顿尝试“label.lineBreakMode=.wordWrap”,然后它会增加高度。考虑到您已经给出了所有适当的约束(顶部、前导、训练、底部)请记住,顶部和底部约束不是固定值。我计算UILabel高度的方法@Abulhassan我的意思是将heightToSuperview作为小于或等于约束。感谢您回答我的初始问题。我仍然难以理解此行为的实现:在什么阶段我才能知道宽度如果是通过自动布局计算的?在调用
viewDidLayoutSubviews()
后,可以计算宽度(例如superview.width-label.leading-label.Training或任何公式)。因此,在覆盖
viewDidLayoutSubviews()
的定义中,您的意思是说可以在viewDidLayoutSubviews()中执行这些步骤或者在调用后的任何时候。你也需要文本,不是吗?(我不知道它是来自后端还是其他地方…)手动输入计算宽度的公式似乎很奇怪,而我应该从自动布局中获取它。为了澄清,我尝试了你的解决方案,但即使在当时
viewdilayoutsubviews()
,我仍然没有真正的宽度。我不明白属性
如何调整ntSizeToFitWidth
在引擎盖下进行此重新缩放。如果我有此代码,我应该能够解决此问题。谢谢