菜鸟教程小白 发表于 2022-12-11 19:59:54

ios - 如何在 UIStackView 中堆叠自定义 View


                                            <p><p>注意:我是使用 iOS UI 的新手。</p>

<p>我想创建一个自定义 View ,在里面堆叠自定义 View 。</p>

<p>所以我创建了<strong>自定义 UIStackView</strong> </p>

<pre><code>class CustomStackView: UIStackView {

    func addItem(color:UIColor){
      let bundle = Bundle(for: type(of: self))
      let nib = UINib(nibName: &#34;RowView&#34;, bundle: bundle)
      let rowView = RowView();
      let view = nib.instantiate(withOwner: rowView, options: nil).first as! UIView
      rowView.addSubview(view)
      rowView.view.backgroundColor = color;
      addArrangedSubview(rowView)
    }

}

class RowView :UIView{

    @IBOutlet var view: UIView!

    override public var intrinsicContentSize: CGSize {
      return CGSize(width: view.frame.width,height:view.frame.height)
    }
}
</code></pre>

<p>在 <code>RowView.xib</code> 我创建了一个简单的布局用于测试:</p>

<pre><code>Simulated Metrics = Freeform
Height = 100
</code></pre>

<p> <a href="/image/RrBfz.png" rel="noreferrer noopener nofollow"><img src="/image/RrBfz.png" alt="enter image description here"/></a> </p>

<p>还有 ViewController.swift:</p>

<pre><code>class ViewController: UIViewController {

    @IBOutlet weak var customStackView: CustomStackView!
    @IBOutlet weak var constraint: NSLayoutConstraint!

    override func viewDidLoad() {
      super.viewDidLoad()
      customStackView.addItem(color: UIColor.red)
      customStackView.addItem(color: UIColor.blue)
      customStackView.addItem(color: UIColor.green)
    }

    @IBAction func click(_ sender: Any) {
      constraint.constant = -customStackView.frame.height
      UIView.animate(withDuration: 4, animations: {
            self.view.layoutIfNeeded();
      },completion:nil)
    }

}
</code></pre>

<p><strong>结果:</strong></p>

<p> <a href="/image/xrhjWm.png" rel="noreferrer noopener nofollow"><img src="/image/xrhjWm.png" alt="enter image description here"/></a> </p>

<p>第一项和第二项显示正确,但第三项高于预期。</p>

<p>此外,如果我单击按钮(应该隐藏 Stackview),请保持“额外”高度可见:</p>

<p> <a href="/image/aUbrbm.png" rel="noreferrer noopener nofollow"><img src="/image/aUbrbm.png" alt="enter image description here"/></a> </p>

<p>我该如何解决这个问题?</p>

<p>编辑:尝试了添加尾随 View 的@KristijanDelivuk 解决方案。并没有奏效。将青色添加到 View 中我得到了这个结果:</p>

<pre><code>override func viewDidLoad() {
    super.viewDidLoad()
    customStackView.addItem(color: UIColor.red)
    customStackView.addItem(color: UIColor.blue)
    customStackView.addItem(color: UIColor.green)
    let view = UIView();
    view.heightAnchor.constraint(equalToConstant: 50).isActive = true;
    view.backgroundColor = UIColor.cyan;
    customStackView.addArrangedSubview(view)
}
</code></pre>

<p> <a href="/image/eLYr9m.png" rel="noreferrer noopener nofollow"><img src="/image/eLYr9m.png" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以尝试添加一个空的 UIView 作为 UIStackView 的最后一个元素:</p>

<p>所以你的层次结构应该是这样的:</p>

<pre><code>- STACKVIEW
-- 1ST ADDED CUSTOM VIEW
-- 2ND ADDED CUSTOM VIEW
-- 3RD ADDED CUSTOM VIEW
-- EMPTY UIVIEW
</code></pre>

<p>Empty UIView 将从第三个 View 中占用所有未分配的空间,并且所有空间都应该正确显示。 </p>

<p>对于隐藏/显示 stackview 后重新定位按钮,您可以创建例如“顶部约束”,然后点击将顶部约束高度更改为 (-) stackview.height 或 (+) stackview.height - 这应该没有任何问题.</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何在 UIStackView 中堆叠自定义 View ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/44823982/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/44823982/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何在 UIStackView 中堆叠自定义 View