diff --git a/Examples/Maps/Maps/ViewController.swift b/Examples/Maps/Maps/ViewController.swift index 3f15135e..97c2d1d7 100644 --- a/Examples/Maps/Maps/ViewController.swift +++ b/Examples/Maps/Maps/ViewController.swift @@ -26,8 +26,8 @@ class ViewController: UIViewController, MKMapViewDelegate, UISearchBarDelegate, searchVC = storyboard?.instantiateViewController(withIdentifier: "SearchPanel") as? SearchPanelViewController - // Add a content view controller - fpc.show(searchVC, sender: self) + // Set a content view controller + fpc.set(contentViewController: searchVC) fpc.track(scrollView: searchVC.tableView) setupMapView() diff --git a/Examples/Samples/Sources/ViewController.swift b/Examples/Samples/Sources/ViewController.swift index 4176b035..f4e82e4f 100644 --- a/Examples/Samples/Sources/ViewController.swift +++ b/Examples/Samples/Sources/ViewController.swift @@ -64,9 +64,10 @@ class SampleListViewController: UIViewController, UITableViewDataSource, UITable mainPanelVC.surfaceView.cornerRadius = 6.0 mainPanelVC.surfaceView.shadowHidden = false - // Add a content view controller and connect with the scroll view - mainPanelVC.show(contentVC, sender: self) + // Set a content view controller + mainPanelVC.set(contentViewController: contentVC) + // Track a scroll view switch contentVC { case let consoleVC as DebugTextViewController: mainPanelVC.track(scrollView: consoleVC.textView) @@ -120,10 +121,8 @@ class SampleListViewController: UIViewController, UITableViewDataSource, UITable detailPanelVC.surfaceView.cornerRadius = 6.0 detailPanelVC.surfaceView.shadowHidden = false - // Add a content view controller and connect with the scroll view - detailPanelVC.show(contentVC, sender: self) - - // (contentVC as? DetailViewController)?.closeButton?.addTarget(self, action: #selector(dismissDetailPanelVC), for: .touchUpInside) + // Set a content view controller + detailPanelVC.set(contentViewController: contentVC) // Add FloatingPanel to self.view detailPanelVC.addPanel(toParent: self, belowView: nil, animated: true) @@ -289,12 +288,13 @@ class ModalViewController: UIViewController { fpc.surfaceView.cornerRadius = 6.0 fpc.surfaceView.shadowHidden = false - // Add a content view controller and connect with the scroll view + // Set a content view controller and track the scroll view let consoleVC = storyboard?.instantiateViewController(withIdentifier: "ConsoleViewController") as! DebugTextViewController - fpc.show(consoleVC, sender: self) - self.consoleVC = consoleVC + fpc.set(contentViewController: consoleVC) fpc.track(scrollView: consoleVC.textView) + self.consoleVC = consoleVC + // Add FloatingPanel to self.view fpc.addPanel(toParent: self, belowView: safeAreaView) } @@ -336,11 +336,11 @@ class TabBarContentViewController: UIViewController, FloatingPanelControllerDele fpc.surfaceView.cornerRadius = 6.0 fpc.surfaceView.shadowHidden = false - // Add a content view controller and connect with the scroll view + // Set a content view controller and track the scroll view let consoleVC = storyboard?.instantiateViewController(withIdentifier: "ConsoleViewController") as! DebugTextViewController - fpc.show(consoleVC, sender: self) - self.consoleVC = consoleVC + fpc.set(contentViewController: consoleVC) fpc.track(scrollView: consoleVC.textView) + self.consoleVC = consoleVC // Add FloatingPanel to self.view fpc.addPanel(toParent: self) diff --git a/Examples/Stocks/Stocks/ViewController.swift b/Examples/Stocks/Stocks/ViewController.swift index 91755bc2..65532ee0 100644 --- a/Examples/Stocks/Stocks/ViewController.swift +++ b/Examples/Stocks/Stocks/ViewController.swift @@ -34,8 +34,8 @@ class ViewController: UIViewController, FloatingPanelControllerDelegate { newsVC = storyboard?.instantiateViewController(withIdentifier: "News") as? NewsViewController - // Add a content view controller - fpc.show(newsVC, sender: self) + // Set a content view controller + fpc.set(contentViewController: newsVC) fpc.track(scrollView: newsVC.scrollView) fpc.addPanel(toParent: self, belowView: bottomToolView, animated: false) diff --git a/Framework/Sources/FloatingPanelController.swift b/Framework/Sources/FloatingPanelController.swift index 76850284..462dc96f 100644 --- a/Framework/Sources/FloatingPanelController.swift +++ b/Framework/Sources/FloatingPanelController.swift @@ -91,6 +91,12 @@ public class FloatingPanelController: UIViewController, UIScrollViewDelegate, UI /// This property specifies how the content area of the tracking scroll view is modified using `adjustedContentInsets`. The default value of this property is FloatingPanelController.ContentInsetAdjustmentBehavior.always. public var contentInsetAdjustmentBehavior: ContentInsetAdjustmentBehavior = .always + private var _contentViewController: UIViewController? + public var contentViewController: UIViewController? { + set { set(contentViewController: newValue) } + get { return _contentViewController } + } + private var floatingPanel: FloatingPanel! required init?(coder aDecoder: NSCoder) { @@ -102,7 +108,7 @@ public class FloatingPanelController: UIViewController, UIScrollViewDelegate, UI } /// Initialize a newly created floating panel controller. - public init() { + public init(contentViewController: UIViewController? = nil) { super.init(nibName: nil, bundle: nil) floatingPanel = FloatingPanel(self, @@ -241,36 +247,44 @@ public class FloatingPanelController: UIViewController, UIScrollViewDelegate, UI floatingPanel.move(to: to, animated: animated, completion: completion) } - /// Presents the specified view controller as the content view controller in the surface view interface. - /// - /// - Attention: - /// You can't use this method to replace the content view controller. + /// Sets the view controller responsible for the content portion of the floating panel.. + public func set(contentViewController: UIViewController?) { + if let vc = _contentViewController { + vc.willMove(toParent: nil) + vc.view.removeFromSuperview() + vc.removeFromParent() + } + + if let vc = contentViewController { + let surfaceView = self.view as! FloatingPanelSurfaceView + surfaceView.contentView.addSubview(vc.view) + vc.view.frame = surfaceView.contentView.bounds + vc.view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + vc.view.topAnchor.constraint(equalTo: surfaceView.contentView.topAnchor, constant: 0.0), + vc.view.leftAnchor.constraint(equalTo: surfaceView.contentView.leftAnchor, constant: 0.0), + vc.view.rightAnchor.constraint(equalTo: surfaceView.contentView.rightAnchor, constant: 0.0), + vc.view.bottomAnchor.constraint(equalTo: surfaceView.contentView.bottomAnchor, constant: 0.0), + ]) + addChild(vc) + vc.didMove(toParent: self) + } + + _contentViewController = contentViewController + } + + @available(*, unavailable, renamed: "set(contentViewController:)") public override func show(_ vc: UIViewController, sender: Any?) { - if self.children.first != nil, let ancester = self.parent?.targetViewController(forAction: #selector(show(_:sender:)), sender: sender) { + if self.contentViewController != nil, + let ancester = self.parent?.targetViewController(forAction: #selector(UIViewController.show(_:sender:)), sender: sender) { ancester.show(vc, sender: sender) return } - show(vc) + set(contentViewController: vc) } - public override func showDetailViewController(_ vc: UIViewController, sender: Any?) { - show(vc) - } - - private func show(_ vc: UIViewController) { - let surfaceView = self.view as! FloatingPanelSurfaceView - surfaceView.contentView.addSubview(vc.view) - vc.view.frame = surfaceView.contentView.bounds - vc.view.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - vc.view.topAnchor.constraint(equalTo: surfaceView.contentView.topAnchor, constant: 0.0), - vc.view.leftAnchor.constraint(equalTo: surfaceView.contentView.leftAnchor, constant: 0.0), - vc.view.rightAnchor.constraint(equalTo: surfaceView.contentView.rightAnchor, constant: 0.0), - vc.view.bottomAnchor.constraint(equalTo: surfaceView.contentView.bottomAnchor, constant: 0.0), - ]) - addChild(vc) - vc.didMove(toParent: self) - } + @available(*, unavailable, message: "Use set(contentViewController:)") + public override func showDetailViewController(_ vc: UIViewController, sender: Any?) { } // MARK: - Scroll view tracking diff --git a/README.md b/README.md index 5aba6462..dd3172f6 100644 --- a/README.md +++ b/README.md @@ -96,14 +96,14 @@ class ViewController: UIViewController, FloatingPanelControllerDelegate { // Assign self as the delegate of the controller. fpc.delegate = self // Optional - // Add a content view controller. + // Set a content view controller. let contentVC = ContentViewController() - fpc.show(contentVC, sender: nil) + fpc.set(viewController: contentVC) // Track a scroll view(or the siblings) in the content view controller. fpc.track(scrollView: contentVC.tableView) - // Add the views managed by the `FloatingPanelController` object to self.view. + // Add and show the views managed by the `FloatingPanelController` object to self.view. fpc.addPanel(toParent: self) } @@ -222,7 +222,7 @@ class ViewController: UIViewController, FloatingPanelControllerDelegate { self.searchPanelVC = FloatingPanelController() let searchVC = SearchViewController() - self.searchPanelVC.show(searchVC, sender: nil) + self.searchPanelVC.set(viewController: searchVC) self.searchPanelVC.track(scrollView: contentVC.tableView) self.searchPanelVC.addPanel(toParent: self) @@ -231,7 +231,7 @@ class ViewController: UIViewController, FloatingPanelControllerDelegate { self.detailPanelVC = FloatingPanelController() let contentVC = ContentViewController() - self.detailPanelVC.show(contentVC, sender: nil) + self.searchPanelVC.set(viewController: contentVC) self.detailPanelVC.track(scrollView: contentVC.scrollView) self.detailPanelVC.addPanel(toParent: self)