Fix DuckableContainerVC not resetting when dismissed programatically

Fixes #396
This commit is contained in:
Shadowfacts 2023-05-28 15:06:59 -07:00
parent 9a734565b0
commit 473ef018c9
3 changed files with 15 additions and 13 deletions

View File

@ -8,8 +8,6 @@
import UIKit import UIKit
public protocol DuckableViewController: UIViewController { public protocol DuckableViewController: UIViewController {
var duckableDelegate: DuckableViewControllerDelegate? { get set }
func duckableViewControllerShouldDuck() -> DuckAttemptAction func duckableViewControllerShouldDuck() -> DuckAttemptAction
func duckableViewControllerMayAttemptToDuck() func duckableViewControllerMayAttemptToDuck()
@ -26,10 +24,6 @@ extension DuckableViewController {
public func duckableViewControllerDidFinishAnimatingDuck() {} public func duckableViewControllerDidFinishAnimatingDuck() {}
} }
public protocol DuckableViewControllerDelegate: AnyObject {
func duckableViewControllerWillDismiss(animated: Bool)
}
public enum DuckAttemptAction { public enum DuckAttemptAction {
case duck case duck
case dismiss case dismiss

View File

@ -11,7 +11,7 @@ let duckedCornerRadius: CGFloat = 10
let detentHeight: CGFloat = 44 let detentHeight: CGFloat = 44
@available(iOS 16.0, *) @available(iOS 16.0, *)
public class DuckableContainerViewController: UIViewController, DuckableViewControllerDelegate { public class DuckableContainerViewController: UIViewController {
public let child: UIViewController public let child: UIViewController
private var bottomConstraint: NSLayoutConstraint! private var bottomConstraint: NSLayoutConstraint!
@ -87,7 +87,6 @@ public class DuckableContainerViewController: UIViewController, DuckableViewCont
} }
private func doPresentDuckable(_ viewController: DuckableViewController, animated: Bool, completion: (() -> Void)?) { private func doPresentDuckable(_ viewController: DuckableViewController, animated: Bool, completion: (() -> Void)?) {
viewController.duckableDelegate = self
viewController.modalPresentationStyle = .custom viewController.modalPresentationStyle = .custom
viewController.transitioningDelegate = self viewController.transitioningDelegate = self
present(viewController, animated: animated) { present(viewController, animated: animated) {
@ -96,7 +95,10 @@ public class DuckableContainerViewController: UIViewController, DuckableViewCont
} }
} }
public func duckableViewControllerWillDismiss(animated: Bool) { func dismissalTransitionWillBegin() {
guard case .presentingDucked(_, _) = state else {
return
}
state = .idle state = .idle
bottomConstraint.isActive = false bottomConstraint.isActive = false
bottomConstraint = child.view.bottomAnchor.constraint(equalTo: view.bottomAnchor) bottomConstraint = child.view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
@ -144,7 +146,7 @@ public class DuckableContainerViewController: UIViewController, DuckableViewCont
case .block: case .block:
viewController.sheetPresentationController!.selectedDetentIdentifier = .large viewController.sheetPresentationController!.selectedDetentIdentifier = .large
case .dismiss: case .dismiss:
duckableViewControllerWillDismiss(animated: true) // duckableViewControllerWillDismiss()
dismiss(animated: true) dismiss(animated: true)
} }
} }
@ -189,7 +191,7 @@ public class DuckableContainerViewController: UIViewController, DuckableViewCont
@available(iOS 16.0, *) @available(iOS 16.0, *)
extension DuckableContainerViewController: UIViewControllerTransitioningDelegate { extension DuckableContainerViewController: UIViewControllerTransitioningDelegate {
public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? { public func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
let controller = UISheetPresentationController(presentedViewController: presented, presenting: presenting) let controller = DuckableSheetPresentationController(presentedViewController: presented, presenting: presenting)
controller.delegate = self controller.delegate = self
controller.prefersGrabberVisible = true controller.prefersGrabberVisible = true
controller.selectedDetentIdentifier = .large controller.selectedDetentIdentifier = .large
@ -215,6 +217,14 @@ extension DuckableContainerViewController: UIViewControllerTransitioningDelegate
} }
} }
@available(iOS 16.0, *)
class DuckableSheetPresentationController: UISheetPresentationController {
override func dismissalTransitionWillBegin() {
super.dismissalTransitionWillBegin()
(self.delegate as! DuckableContainerViewController).dismissalTransitionWillBegin()
}
}
@available(iOS 16.0, *) @available(iOS 16.0, *)
extension DuckableContainerViewController: UISheetPresentationControllerDelegate { extension DuckableContainerViewController: UISheetPresentationControllerDelegate {
public func presentationController(_ presentationController: UIPresentationController, willPresentWithAdaptiveStyle style: UIModalPresentationStyle, transitionCoordinator: UIViewControllerTransitionCoordinator?) { public func presentationController(_ presentationController: UIPresentationController, willPresentWithAdaptiveStyle style: UIModalPresentationStyle, transitionCoordinator: UIViewControllerTransitionCoordinator?) {

View File

@ -23,7 +23,6 @@ protocol ComposeHostingControllerDelegate: AnyObject {
class ComposeHostingController: UIHostingController<ComposeHostingController.View>, DuckableViewController { class ComposeHostingController: UIHostingController<ComposeHostingController.View>, DuckableViewController {
weak var delegate: ComposeHostingControllerDelegate? weak var delegate: ComposeHostingControllerDelegate?
weak var duckableDelegate: DuckableViewControllerDelegate?
let controller: ComposeController let controller: ComposeController
let mastodonController: MastodonController let mastodonController: MastodonController
@ -107,7 +106,6 @@ class ComposeHostingController: UIHostingController<ComposeHostingController.Vie
return return
} else { } else {
dismiss(animated: true) dismiss(animated: true)
duckableDelegate?.duckableViewControllerWillDismiss(animated: true)
} }
} }