web-dev-qa-db-ja.com

コンテンツに応じてUIStackViewのサイズを設定する方法は?

<Table> HTMLタグと同様の動作をしたいのですが、その内容に応じてフレームのサイズが変更されます。

私のコンテキストでは、UITableViewCellのコンテンツビューとしてUIStackViewを使用しています。セル内の項目はさまざまな情報であるため、結果として得られるセルの高さは可変でなければなりません。

私の戦略は、次のコードスニペットのように、セルをプログラム的に.Vertical軸を持つUIStackViewとして構築することです。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    let sv = UIStackView(frame: tableview.frame)
    sv.axis = .Vertical
    cell.addSubview(sv)
    for i in information {
        let l = UILabel()
        l.text = i
        sv.addSubViewAndArrange(l)
    }

    return cell
}

残念ながら、セルサイズはコンテンツに合わせて調整されないため、次のようにセルの高さを自分で設定する必要があります。

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return cellHeight     // a constant
}

どうすれば修正できますか?

15

UIStackViewは、コンテンツに応じてサイズが大きくなるように設計されています。これを機能させるには、UIStackViewUITableViewCellの間に制約を設定する必要があります。たとえば、これはインターフェイスビルダーでの制約の例です。

enter image description hereenter image description here

コードで制約を設定したい場合は、それも機能するはずです。

これが機能することを示すために、cellForRowAt関数用にこれを用意しました。基本的には、UILabelの内側にUIStackViewをいくつか配置し、ラベル数は行番号によって異なります。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableviewCell", for: indexPath) as! TableviewCell
    for i in 1...indexPath.row + 1 {
        let label = UILabel()
        label.text = "Row \(indexPath.row), Label \(i)"
        cell.stackView.addArrangedSubview(label)
    }
    return cell
}

これが最終結果です:

https://github.com/yzhong52/AutosizeStackview

6
Yuchen Zhong

私はそれが役立つことを願ってこの例を構築しました、私はstackViewを含むセルを使用するtableViewを作成しました、そしてstackViewにロードされたビューはnibファイルから取得されます

https://github.com/Joule87/stackView-within-TableViewCell

0
Joule87