web-dev-qa-db-ja.com

テーブルビューのコンテンツのサイズにポップオーバーをすばやく調整するにはどうすればよいですか?

ポップオーバーを表示するためにpopoverPresentationControllerを使用しています。ポップオーバーとして表示するために使用されるUITableViewControllerは、プログラムによって作成され、通常1〜5行を含みます。このポップオーバーを設定して、TableViewのコンテンツに合わせてサイズを調整するにはどうすればよいですか?

私のポップオーバーのコード:

if recognizer.state == .Began {
    let translation = recognizer.locationInView(view)

    // Create popoverViewController
    var popoverViewController = UITableViewController()
    popoverViewController.modalPresentationStyle = UIModalPresentationStyle.Popover
    popoverViewController.tableView.backgroundColor = UIColor.popupColor()

    // Settings for the popover
    let popover = popoverViewController.popoverPresentationController!
    popover.delegate = self
    popover.sourceView = self.view
    popover.sourceRect = CGRect(x: translation.x, y: translation.y, width: 0, height: 0)
    popover.backgroundColor = UIColor.popupColor()

    presentViewController(popoverViewController, animated: true, completion: nil)
}
27
Henny Lee

IViewControllerのpreferredContentSizeプロパティ をチェックアウトします。

let height = yourDataArray.count * Int(popOverViewController.tableView.rowHeight)
popOverViewController.preferredContentSize = CGSize(width: 300, height: height)
26
zisoft

UITableViewControllerのviewDidLoad()に、オブザーバーを追加できます。

_self.tableView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)
_

次に、このメソッドを追加します。

_override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    self.preferredContentSize = tableView.contentSize
}
_

最後に、viewDidDisappear()で、必ずオブザーバーを削除してください。

_tableView.removeObserver(self, forKeyPath: "contentSize")
_

このようにして、ポップオーバーは、ロードまたは変更されるたびに、コンテンツに合わせてサイズを自動的に調整します。

35
Bo Frese

次のように、preferredContentSizeの拡張でuitableviewcontrollerプロパティをオーバーライドします。

_override var preferredContentSize: CGSize {
    get {
        let height = calculate the height here....
        return CGSize(width: super.preferredContentSize.width, height: height)
    }
    set { super.preferredContentSize = newValue }
}
_

高さを計算するには、tableView.rectForSection(<#section: Int#>)をチェックアウトします

19
Philip De Vries

Swift 4の場合、コンテンツサイズを確認したい場合は、これが最適なソリューションであることがわかりました。

class MyTableViewController: UITableViewController {

    private var kvoContext = 0

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        addObserver(self, forKeyPath: #keyPath(tableView.contentSize), options: .new, context: &kvoContext)

    }

    override func viewDidDisappear(_ animated: Bool) {
        removeObserver(self, forKeyPath: #keyPath(tableView.contentSize))
        super.viewDidDisappear(animated)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if context == &kvoContext, keyPath == #keyPath(tableView.contentSize),
            let contentSize = change?[NSKeyValueChangeKey.newKey] as? CGSize  {
            self.popoverPresentationController?.presentedViewController.preferredContentSize = contentSize
        }
    }
}
3

まず最初に:すべてのコメントは良いものであり、完全に役立ちます。 VCを再利用可能なコンポーネントにするロジックをほとんど変更していません。

viewWillAppear:(BOOL)animated内でこのメソッドを呼び出す:

-(void) setPopOverPreferedContentHeight {

     if (self.popoverPresentationController && self.tableView.contentSize.height < MAX_POPOVER_HEIGHT) {
          self.preferredContentSize=self.tableView.contentSize;
     } else if (self.popoverPresentationController){
         self.preferredContentSize = CGSizeMake(self.tableView.contentSize.width, MAX_POPOVER_HEIGHT);
   }
}
0
kaushal