Skip to content
This repository was archived by the owner on Nov 3, 2025. It is now read-only.

Commit 3261089

Browse files
committed
support accessibilityPerformEscape
1 parent b2f5bd7 commit 3261089

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed

PanModal/View/PanContainerView.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,34 @@ import UIKit
1515
having to do those changes directly on the view
1616
*/
1717
class PanContainerView: UIView {
18+
19+
private weak var presentedViewController: UIViewController?
1820

1921
init(presentedView: UIView, frame: CGRect) {
2022
super.init(frame: frame)
2123
addSubview(presentedView)
24+
presentedViewController = presentedView.parentViewController
2225
}
2326

2427
@available(*, unavailable)
2528
required init?(coder aDecoder: NSCoder) {
2629
fatalError("init(coder:) has not been implemented")
2730
}
2831

32+
override func accessibilityPerformEscape() -> Bool {
33+
var shouldPerforEscape: Bool = true
34+
if let panModalPresentable = presentedViewController as? PanModalPresentable {
35+
shouldPerforEscape = panModalPresentable.allowsDragToDismiss || panModalPresentable.allowsTapToDismiss
36+
presentedViewController?.dismiss(animated: true, completion: nil)
37+
}
38+
return shouldPerforEscape
39+
}
40+
}
41+
42+
private extension UIResponder {
43+
var parentViewController: UIViewController? {
44+
return next as? UIViewController ?? next?.parentViewController
45+
}
2946
}
3047

3148
extension UIView {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
//
2+
// UIAccessiblityPerformEscapeTests.swift
3+
// PanModalTests
4+
//
5+
// Created by Sungdoo on 2022/03/17.
6+
// Copyright © 2022 Detail. All rights reserved.
7+
//
8+
9+
import XCTest
10+
import PanModal
11+
12+
class UIAccessiblityPerformEscapeTests: XCTestCase {
13+
14+
class MockViewController: UIViewController, PanModalPresentable {
15+
var panScrollable: UIScrollView? { return nil }
16+
}
17+
18+
func testAccessibilityPerformEscape() throws {
19+
20+
let presenterViewController = UIApplication.shared.keyWindow?.rootViewController
21+
let panModal: UIViewController & PanModalPresentable = MockViewController()
22+
23+
presenterViewController?.presentPanModal(panModal)
24+
XCTAssertNotNil(presenterViewController?.presentedViewController, "panModal should have been presented")
25+
26+
let presentDidFisnish = XCTestExpectation()
27+
let dismissDidFinish = XCTestExpectation()
28+
29+
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
30+
31+
let panContainerView = panModal.view.superview
32+
presentDidFisnish.fulfill()
33+
34+
panContainerView?.accessibilityPerformEscape()
35+
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
36+
XCTAssertNil(presenterViewController?.presentedViewController, "panModal should have been dismissed")
37+
dismissDidFinish.fulfill()
38+
}
39+
}
40+
41+
wait(for: [presentDidFisnish, dismissDidFinish], timeout: 10)
42+
}
43+
}

0 commit comments

Comments
 (0)