【问题标题】:How to add xib subviews with dynamic height to UIView如何将具有动态高度的 xib 子视图添加到 UIView
【发布时间】:2018-12-21 22:58:22
【问题描述】:

这应该很容易做到,并且在 android(使用 LinearLayout)中非常容易,但我不知道如何在 ios 中做到。

我有 UIView,我想在其中添加一些动态高度子视图。子视图从 xib 文件加载,包含 2 个具有动态高度的 UILabel。

class Subview: UIView {

    @IBOutlet var contentView: UIView!

    @IBOutlet weak var title: UILabel!
    @IBOutlet weak var desc: UILabel!


    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.commonInit()
    }

    fileprivate func commonInit() {
        Bundle.main.loadNibNamed("Subview", owner: self, options: nil)
        addSubview(contentView)
        self.contentView.frame = self.bounds
        self.contentView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    }

}

子视图是这样添加的

var containerView: UIView

func setupView() {

    let subview1 = Subview()
    subview1.title = "Some title"
    subview1.desc = "Some very long description"

    self.containerView.addSubview(subview1)

}

问题是在这种情况下,子视图不显示。 如果我添加

subview1.frame = CGSize(width: self.bounds.width, height: 100)

子视图显示但高度 100 不正确

如果我尝试计算子视图大小

let measuredSize = subview1.sizeThatFits(CGSize(width: self.bounds.width, height: CGFloat(MAXFLOAT)))

测量的宽度和大小为 0。

知道我在这里做错了什么吗?谢谢!

编辑:这是我的带有约束的子视图 xib 文件

【问题讨论】:

  • 你试过用构造函数来设置大小吗? let subview1 = Subview(wantedSize)
  • 但我不知道wantedSize。大小(高度)应根据内容动态
  • 我会在创建视图之前找到一种计算方法,但您也可以在创建视图后立即尝试使用subview1.translatesAutoresizingMaskIntoConstraints = false。我想知道是否没有生成约束,然后阻止调整框架的大小
  • 使用自动布局和约束...比尝试计算矩形和大小更灵活。
  • 我的子视图 xib 文件包含约束,但添加到 containerView 时大小不正确。我尝试设置 subview1.translatesAutoresizingMaskIntoConstraints = false 并且子视图现在可见,但它不在 containerView 而不是 multile

标签: ios swift uiview xib ios-autolayout


【解决方案1】:

你可以很容易地做到这一点

1-在xib文件中从上到下正确挂钩约束

2-theView.translatesAutoresizingMaskIntoConstraints = false

3- 设置前导、尾随、顶部约束(无高度),例如这是一个带有一个标签的简单 xib

将其添加到 self.view 时

let vv = (Bundle.main.loadNibNamed("repairView", owner: self, options: nil))?[0] as! repairView;

vv.translatesAutoresizingMaskIntoConstraints = false

vv.aedlb.text = "dsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsvvvvdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsvvvvdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsvvvvdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsvvvvdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjdsdsjhdsjhdsjhsdhjdsjhesisbeudjbdsjbdsjds"

view.addSubview(vv)

NSLayoutConstraint.activate([

    vv.topAnchor.constraint(equalTo: view.topAnchor, constant: 20),
    vv.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0),
    vv.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0),

    ])

结果

【讨论】:

  • 谢谢。看来 NSLayoutConstraint.activate 做了一个伎俩。
  • 是的,因为根据它,子视图会知道它的位置和宽度,因此会相应地包装以适应动态大小的内容
猜你喜欢
  • 2021-03-21
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2015-03-07
  • 2018-05-05
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
相关资源
最近更新 更多