UIView子级自动框架尺寸

时间:2018-07-25 08:23:07

标签: ios uiview autolayout snapkit

我正在尝试将自定义UIView(LabelIcon)添加到父视图中,该视图不关心孩子的大小-他应该根据孩子的身高将它们堆叠成彼此完全相等的宽度(这会有所不同) )。

目前,这是我在父母中添加孩子的方式:

    let locationLabel = LabelIcon(frame: .zero, icon: "location", text: "Lane\nlane")
    let locationLabel2 = LabelIcon(frame: .zero, icon: "location", text: "Second text line\nLine line line\nAnother line\nsome more line")
    content.addSubview(locationLabel)
    content.addSubview(locationLabel2)

(我不想在此处手动设置框架-应该是自动的)

这些视图的约束,使得它们至少在某种程度上可见(因为我没有设置框架):

    locationLabel.snp.makeConstraints { (make) in
        make.top.left.right.equalToSuperview()
        make.height.equalTo(40)
    }

    locationLabel2.snp.makeConstraints { (make) in
        make.left.right.equalToSuperview()
        make.top.equalTo(locationLabel.snp.bottom)
        make.height.equalTo(40)
    }

这可能有效,但是为每个元素执行此操作会很痛苦。我现在也不知道内部元素的高度。

我想要实现的是不必在父级中定义任何硬编码的约束。儿童视野应该自己决定它的高度。

通过以下方式定义孩子:

class LabelIcon: UIView {

    init(frame: CGRect, icon: String, text: String) {
        super.init(frame: frame)

        self.backgroundColor = UIColor.orange

        let iconImageView = UIImageView(image: UIImage(named: icon))
        iconImageView.contentMode = UIViewContentMode.scaleAspectFit
        self.addSubview(iconImageView)


        let label = UILabel()
        label.textAlignment = .left
        label.numberOfLines = 0
        label.text = text
        self.addSubview(label)

        iconImageView.snp.makeConstraints { (make) in
            make.top.equalToSuperview().offset(5)
            make.left.equalToSuperview().offset(10)
        }

        label.snp.makeConstraints { (make) in
            make.top.equalToSuperview()
            make.left.equalTo(iconImageView.snp.right).offset(20)

        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

我该如何通过识别父级宽度的方式来定义子级,但是高度会根据标签大小自动完成?文本将具有动态行数。

在父级中会有很多这样的视图,因此我希望约束尽可能少(不要为每个LabelIcon实例手动执行此操作)。

基于此代码,这是当前状态: enter image description here

我所有的视图都是通过自动布局(使用SnapKit,没有故事板或xib)以编程方式完成的。我想使用UIStackView,但是无论如何,孩子必须定义高度才能工作。

编辑: 使用这些约束时,视图本身是可见的:

locationLabel.snp.makeConstraints { (make) in
    make.top.left.right.equalToSuperview()

}
locationLabel2.snp.makeConstraints { (make) in
    make.left.right.equalToSuperview()
    make.top.equalTo(locationLabel.snp.bottom)
}

Bu视图相互重叠(label2不在label下方)。而且视图的尺寸基本上为0,0-没有橙色背景: enter image description here

来自已接受的答案:

标签约束:

label.snp.makeConstraints { (make) in
    make.top.equalToSuperview()
    make.left.equalTo(iconImageView.snp.right).offset(20)
    make.bottom.equalToSuperview().offset(-10)
    make.right.equalToSuperview().offset(-10)
}

父母:

locationLabel.snp.makeConstraints { (make) in
    make.top.left.equalToSuperview()

}
locationLabel2.snp.makeConstraints { (make) in
    make.left.equalToSuperview()
    make.top.equalTo(locationLabel.snp.bottom)
}

结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

视图的内部标签添加底部约束,像这样

 make.bottom.equalToSuperview().offset(10)

//

添加权限约束

make.right.equalToSuperview().offset(10)

删除任何静态高度

make.height.equalTo(40)

然后视图应根据文本调整大小,其想法是通过静态值或left && right值给标签设置宽度