Swift将大高度标签插入视图中

时间:2018-01-25 13:39:19

标签: ios swift constraints

我是Swift的新手,并尝试以编程方式将标签添加到嵌入滚动视图的UIView中。

实际上,我想要一些标题(屏幕一半的图片和标题)和下面的内容(长度和图像未知的文字)。

我添加了一个视图容器,并根据我要添加标签或图像视图的内容。 大部分时间都是这样的:

text
image
text
image

等等。

添加标签代码(Swift 4):

let label = UILabel()

label.numberOfLines = 0
label.text = blogItem.text
containerView.addSubview(label)

label.translatesAutoresizingMaskIntoConstraints = false

NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: containerView, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: containerView, attribute: NSLayoutAttribute.leading, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: containerView, attribute: NSLayoutAttribute.trailing, multiplier: 1, constant: 0).isActive = true
NSLayoutConstraint(item: label, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: containerView, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0).isActive = true

问题是文本被截断,当到达屏幕的末尾并且根本没有滚动时。

如何才能正确地添加底部约束(我相信这一切都是因为它而发生?)以实现预期的行为?

1 个答案:

答案 0 :(得分:1)

确保为工作UIScrollView创建了适当的层次结构:

  1. 在层次结构中添加scrollView并使用autolayout正确布局它,例如,如果它应该涵盖view的整个viewController

    scrollView.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        scrollView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
        scrollView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
        scrollView.topAnchor.constraint(equalTo: self.view.topAnchor),
        scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
    ])
    
  2. 然后您需要向contentView添加scrollView并为其提供适当的布局约束,因此如果您希望在我上面开始的示例中可垂直滚动scrollView ,您需要遵循自动布局约束:

    contentView.translatesAutoresizingMaskIntoConstraints = false
    
    NSLayoutConstraint.activate([
        // horizontal anchors of contentView are constrained to scrollView superview
        // to prevent it from scrolling horizontally
        contentView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
        contentView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
        // but vertical anchors of contentView are constrained to
        // scrollView to allow scrolling
        contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
        contentView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
    ])
    

    请注意,我将leftAnchor的{​​{1}}和rightAnchor限制为contentView而不是self.view,以使其具有固定宽度。但是,top和bottom锚点被约束到scrollView,因此当scrollView需要更多空间时,它们会被展开和滚动。

  3. 现在您添加了contentView您想要的所有内容,并使用自动布局进行布局,就像contentView是一个无限高度的视图一样 - contentView将通过滚动来完整呈现它。因此,在我的示例中,如果唯一的内容是一个包含多行的scrollView UILabellabel的子视图:

    contentView
  4. 尝试检查代码并检查约束。可能是你错过了两种情况下的约束,而且它在第一种情况下起作用的事实只是巧合。