Skip to content

Instantly share code, notes, and snippets.

@kylebshr
Created August 1, 2018 07:00
Show Gist options
  • Save kylebshr/4db4fb747fb1cb3544a67768c1c63f36 to your computer and use it in GitHub Desktop.
Save kylebshr/4db4fb747fb1cb3544a67768c1c63f36 to your computer and use it in GitHub Desktop.
class PopoverTableViewController: UITableViewController {
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.preferredContentSize = CGSize(width: 320, height: self.tableView.contentSize.height)
}
}
@kylebshr
Copy link
Author

kylebshr commented Aug 1, 2018

Full example:

import UIKit

class ViewController: UIViewController {

    private let button = UIButton(type: .system)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.button.setTitle("Popover", for: .normal)
        self.button.addTarget(self, action: #selector(popover), for: .primaryActionTriggered)
        self.view.addSubview(self.button)
        self.button.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            self.button.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
        ])
    }
    
    @objc private func popover(_ sender: UIButton) {
        let popover = PopoverTableViewController(style: .plain)
        popover.modalPresentationStyle = .popover
        popover.popoverPresentationController?.permittedArrowDirections = .left
        popover.popoverPresentationController?.sourceView = sender
        popover.popoverPresentationController?.sourceRect = sender.bounds.insetBy(dx: -4, dy: -4)
        self.present(popover, animated: true, completion: nil)
    }
}

class PopoverTableViewController: UITableViewController {
    
    var rowCount = 0    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.tableView.alwaysBounceVertical = false
        self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        self.randomizeTable()
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        self.preferredContentSize = CGSize(width: 320, height: self.tableView.contentSize.height)
    }
    
    private func randomizeTable() {
        self.rowCount = rand(14) + 2
        self.tableView.reloadData()
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.rowCount
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = "Cell \(indexPath.row)"
        return cell
    }
    
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        self.randomizeTable()
    }
}

func rand(_ upperbound: Int) -> Int {
    return Int(arc4random_uniform(UInt32(upperbound)))
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment