使用 Autolayout 将 UILabel 沿其父视图的底部对齐

Posted

技术标签:

【中文标题】使用 Autolayout 将 UILabel 沿其父视图的底部对齐【英文标题】:Align UILabel along bottom of its parent view using Autolayout 【发布时间】:2014-09-09 05:33:36 【问题描述】:

我试图在其父视图的底部居中显示一个 UILabel,并将前导和尾随设置为延伸到父视图的边界。不幸的是,标签根本没有出现在屏幕上。我已验证父视图是否按需要正确填充整个屏幕。

    //set up parent view
    let vibrancyEffect = UIVibrancyEffect(forBlurEffect: blurEffect)
    let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect)
    vibrancyEffectView.frame = blurEffectView.bounds
    vibrancyEffectView.autoresizingMask = .FlexibleWidth | .FlexibleHeight

    //Label for vibrant text
    let vibrantLabel = UILabel()
    vibrantLabel.text = "My Label"
    vibrantLabel.textColor = UIColor(white: 0.64, alpha: 1)
    vibrantLabel.textAlignment = .Center
    vibrantLabel.sizeToFit()
    vibrantLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
    vibrancyEffectView.contentView.addSubview(vibrantLabel)

    vibrancyEffectView.addConstraint(NSLayoutConstraint(item: vibrantLabel, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: vibrancyEffectView, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 15))
    vibrancyEffectView.addConstraint(NSLayoutConstraint(item: vibrantLabel, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: vibrancyEffectView, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: 0))
    vibrancyEffectView.addConstraint(NSLayoutConstraint(item: vibrantLabel, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: vibrancyEffectView, attribute: NSLayoutAttribute.Trailing, multiplier: 1, constant: 0))
    vibrancyEffectView.addConstraint(NSLayoutConstraint(item: vibrantLabel, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: vibrantLabel, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 30))

    blurEffectView.contentView.addSubview(vibrancyEffectView)

这可能是由于在父级上设置了自动调整大小掩码,还是我的自动布局约束不正确?我还想知道处理高度的最佳方法是什么 - 我想确保文本适合它。

【问题讨论】:

视图(父子视图)是否剪切子视图?如果是这样,那可能是您的问题。 @HAS 不,它不会剪切子视图 【参考方案1】:

我认为您的一些限制是错误的。

您将标签的底部固定到活力视图的底部,常数为 15 - 这会将其固定在底部下方 15 点处。

您还将标签的高度固定为其自身的高度加上 30 - 这是不令人满意的,我很惊讶您没有看到错误日志。标签不需要高度限制,因为它将具有基于文本值的内在内容大小 - 您也不需要 sizeToFit 调用。要使标签流到多行,请将numberOfLines 属性设置为零。

【讨论】:

成功了。可能会看到警告,但由于我在扩展中执行此操作,因此它不可调试,非常不幸。【参考方案2】:

为标签添加的约束类型。

左、上、宽、高

TOP 约束(样本):

mylabel.setTranslatesAutoresizingMaskIntoConstraints(false) 

self.addConstraint(NSLayoutConstraint(

                item:mylabel, attribute:NSLayoutAttribute.Top,

                relatedBy:NSLayoutRelation.Equal, toItem:myView,

                attribute:NSLayoutAttribute.Bottom, multiplier:1.0, constant: 0.0))

【讨论】:

以上是关于使用 Autolayout 将 UILabel 沿其父视图的底部对齐的主要内容,如果未能解决你的问题,请参考以下文章

AutoLayout 将 UILabel 高度设置为零

使用 AutoLayout 以编程方式将 UILabel 添加到 ScrollView (swift)

为啥我的 UILabel 的 AutoLayout 不起作用

Swift + Autolayout:旋转 UILabel,保持在 UIView 旁边

AutoLayout - 将 UILabel 调整为它的 Superview 并调整它的大小

如何使用 AutoLayout 使我的 UIImage 的高度与我的 UILabel 的固有高度相同?