2017-11-28 7 views
1

私はviewControllerを持っていて、その中に2つのtableViewと1つのchildViewControllerが必要です。動的なtableViewの高さを持つ曖昧なレイアウト

  • tableViewは動的セル高さでスクロールできません。 (私は行を折りたたむことができるので、tableViewを使用しています)
  • childVCは動的セル高さを持つスクロール可能なtableViewです。

私の制約があるとして:

NSLayoutConstraint.activate([ 
    tableView.topAnchor.constraint(equalTo: view.topAnchor), 
    tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor), 
    tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor), 
    tableView.bottomAnchor.constraint(equalTo: artistVC.view.topAnchor), 

]) 

NSLayoutConstraint.activate([ 
    artistVC.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), 
    artistVC.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), 
    artistVC.view.bottomAnchor.constraint(equalTo: view.bottomAnchor) 
]) 

私はセットアップこの方法は、唯一のchildVCが画面に表示されます。私はtableViewが表示されません。テーブルビューを必要なだけ拡大してから、childVCをスクロールできるようにします。 Height and scrollable content size are ambiguous

  • 私が手childVCのビューのために:Height and vertical positions are ambiguous
  • 私がどのような高さを知らないと、私は高さを自分で設定することはできませんしかし、私が手にtableViewため

    • tableViewCellは..

      どのような提案ですか?私はコンテンツの抱擁とコンテンツの圧縮抵抗を変更しようとしましたが、そこに運が見つかりませんでした。

    答えて

    3

    :あなたのテーブルビューとテーブルへのクラスは、コンテンツに合わせてサイズ自体にしようとするとInterface Builderで次に

    class AutomaticHeightTableView: UITableView { 
    
        override var intrinsicContentSize: CGSize { 
        return contentSize 
        } 
    
        override func reloadData() { 
        super.reloadData() 
        invalidateIntrinsicContentSize() 
        } 
    } 
    

    AutomaticHeightTableViewを設定します。それは配置した他の制約に従いますので、制約によって自由に拡張できるようにしてください。

    +1

    他の読者のための説明だけです。 'intrinsicContentSize'は' UIView'のプロパティで、デフォルトで '(0,0)'になる固有のサイズはありません。したがって、これは新しい値として 'contentSize'を与えます。 – Honey

    +2

    'invalidateIntrinsicContentSize'について:tableviewが再ロードする必要がある場合は、テーブルビューがデータを再ロードするときに' invalidateIntrinsicContentSize'を呼び出すようにしてください。**新しい**コンテンツサイズ – Honey

    +0

    '拡張* CollectionViewController:UICollectionViewDelegateFlowLayout { funcコレクションビュー(コレクションビュー:UICollectionView、レイアウトコレクションビューレイアウト:UICollectionViewLayout、sizeForItemAt indexPath:IndexPath) - > CGSize { if indexPath.row == 0 { if vc = dataSource [indexPath.row] as? ArtistDetailViewController { プリント( "detailVCは\される(vc.tableView.intrinsicContentSize)") 戻りvc.tableView.intrinsicContentSize }他{ リターンCGSize(幅:10、高さ:10) }} ' – Honey

    2

    テーブルビューおよびその他のスクロール可能なビューには、intrinsicContentSizeがありません。たとえば、参加しているビューにUIImageViewUILabelの両方の内容でサイズを設定できますが、ビューがUITableViewUIView(いずれも自動的にサイズ変更することはできませんが、 UIViewの制約が曖昧でないようにするには)自分でサイジングを行う必要があります。

    希望する動作を得るには、UITableViewをサブクラス化し、intrinsicContentSizeをオーバーライドするか、高さの制約を設定する必要があります。いずれにしても、正しい高さを自分で計算する必要があります。コンテンツの抱きしめと圧縮抵抗により、自動レイアウトは競合intrinsicContentSizesの間で裁決されるため、このケースでは自動レイアウトが役立たない理由があります。例えば

    :ストーリーボードで次に

    final class SizingTableView: UITableView { 
        override var intrinsicContentSize: CGSize { 
         return CGSize(width: bounds.width, height: <# Some appropriate height #>) 
        } 
    } 
    

    またはSizingTableViewにあなたのテーブルビューのクラスを変更XIB、あなたのサイズがあなたのテーブルビューの固有のコンテンツサイズのデザイン時のプレースホルダを設定することができます私たちのエラーの警告を解決するために検査してください。私はこのようなUITableViewサブクラス示唆

    +1

    'intrinsicContentSize'をオーバーライドし、単に' contentSize'を返すことはそのトリックを行うべきです。何も計算する必要はありません。CGSize { のget { self.tableView.layoutIfNeeded() 戻りself.tableView.contentSize } 集合{}} 私のViewControllerに ': – EmilioPelaez

    +0

    @EmilioPelaezうーん、あなたは'オーバーライドするvar preferredContentSizeを追加する意味ですか?私は[ここ](https://stackoverflow.com/a/17939938/5175709)からコピーしました。私は他の何かをする必要はありませんか? – Honey

    +1

    'preferredContentSize'は' UIViewController'のプロパティです。 'intrinsicContentSize'は' UIView'のプロパティです。 Autolayoutは 'intrinsicContentSize'を使用します。これはあいまいさを解決するために返す必要があります。他の人が 'UIScrollView'のプロパティである' contentSize'を提案して返すようにすることができます。 – beyowulf