Skip to content

Instantly share code, notes, and snippets.

@jamesrochabrun
Last active May 5, 2020 23:49
Show Gist options
  • Save jamesrochabrun/d26f3b0bf7096f9689e1a2c955717732 to your computer and use it in GitHub Desktop.
Save jamesrochabrun/d26f3b0bf7096f9689e1a2c955717732 to your computer and use it in GitHub Desktop.
/// 1
protocol DisplayModeUpdatable {
func displayModeWillChangeTo(_ displayMode: UISplitViewController.DisplayMode)
func displayModeDidChangeTo(_ displayMode: UISplitViewController.DisplayMode)
}
////
@objc func togglePrefferDisplayModeExecutingCompletion(_ executing: Bool = true) {
UIView.animate(withDuration: 0.3, animations: {
self.preferredDisplayMode = self.displayMode == .allVisible ? .primaryHidden : .allVisible
self.displayModeCustomButton.setImage(SplitViewControllerViewModel.displayModeButtonImageFor(self.preferredDisplayMode), for: .normal)
}) { _ in
/// 2
guard let detailViewOnDisplayModeChange = self.secondaryViewController as? UINavigationController,
let displayModeUpdatable = detailViewOnDisplayModeChange.topViewController as? DisplayModeUpdatable
else { return }
displayModeUpdatable.displayModeDidChangeTo(self.displayMode)
}
}
/// 3
func splitViewController(_ svc: UISplitViewController, willChangeTo displayMode: UISplitViewController.DisplayMode) {
guard let detailViewOnDisplayModeChange = svc.secondaryViewController as? UINavigationController,
let displayModeUpdatable = detailViewOnDisplayModeChange.topViewController as? DisplayModeUpdatable
else { return }
displayModeUpdatable.displayModeWillChangeTo(displayMode)
}
/// 4 DisplayModeUpdatable Protocol conformance
extension ContentDetailViewcontroller: DisplayModeUpdatable {
func displayModeWillChangeTo(_ displayMode: UISplitViewController.DisplayMode) {
/// 5
verticalFeedTableView?.displayMode = displayMode
let constant: CGFloat = displayMode
!= .allVisible ? 100 : 0
tableViewTrailingConstraint?.constant = -constant
tableViewLeadingConstraint?.constant = constant
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
verticalFeedTableView?.reload(animated: true) /// reloading to apply a nice animation effect when expand collapse.
}
func displayModeDidChangeTo(_ displayMode: UISplitViewController.DisplayMode) {
// Perform an action if needed
}
/// In VerticalFeedTableView.swift file.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
/// 6
guard let dataSource = dataSource,
case VerticalFeed.userPostsFeed(_) = dataSource.getModelAt(IndexPath(item: 0, section: section)) else { return 0 }
return displayMode != .allVisible ? 140.0 : 0
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment