Skip to content

Commit 920d846

Browse files
authored
Hide Background Elements from Modal SwiftMessage in VoiceOver mode (#577)
* Add scrimView for better accessibility support in modal dimMode * Refactor masking view overlay creation into reusable function * Fix typo: renamed `tappedHander` to `tappedHandler`
1 parent 007f4cc commit 920d846

File tree

2 files changed

+22
-12
lines changed

2 files changed

+22
-12
lines changed

SwiftMessages/PassthroughView.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import UIKit
1010

1111
class PassthroughView: UIControl {
1212

13-
var tappedHander: (() -> Void)?
13+
var tappedHandler: (() -> Void)?
1414

1515
override init(frame: CGRect) {
1616
super.init(frame: frame)
@@ -27,11 +27,11 @@ class PassthroughView: UIControl {
2727
}
2828

2929
@objc func tapped() {
30-
tappedHander?()
30+
tappedHandler?()
3131
}
3232

3333
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
3434
let view = super.hitTest(point, with: event)
35-
return view == self && tappedHander == nil ? nil : view
35+
return view == self && tappedHandler == nil ? nil : view
3636
}
3737
}

SwiftMessages/Presenter.swift

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -368,15 +368,15 @@ class Presenter: NSObject {
368368
func installInteractive() {
369369
guard config.dimMode.modal else { return }
370370
if config.dimMode.interactive {
371-
maskingView.tappedHander = { [weak self] in
371+
maskingView.tappedHandler = { [weak self] in
372372
guard let strongSelf = self else { return }
373373
strongSelf.interactivelyHidden = true
374374
strongSelf.delegate?.hide(presenter: strongSelf)
375375
}
376376
} else {
377377
// There's no action to take, but the presence of
378378
// a tap handler prevents interaction with underlying views.
379-
maskingView.tappedHander = { }
379+
maskingView.tappedHandler = { }
380380
}
381381
}
382382

@@ -398,22 +398,32 @@ class Presenter: NSObject {
398398
elements += [view]
399399
}
400400
if config.dimMode.interactive {
401-
let dismissView = UIView(frame: maskingView.bounds)
402-
dismissView.translatesAutoresizingMaskIntoConstraints = true
403-
dismissView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
404-
maskingView.addSubview(dismissView)
405-
maskingView.sendSubviewToBack(dismissView)
406-
dismissView.isUserInteractionEnabled = false
407-
dismissView.isAccessibilityElement = true
401+
let dismissView = maskingViewOverlay()
408402
dismissView.accessibilityLabel = config.dimModeAccessibilityLabel
409403
dismissView.accessibilityTraits = UIAccessibilityTraits.button
410404
elements.append(dismissView)
405+
} else if config.dimMode.modal {
406+
let plainView = maskingViewOverlay()
407+
plainView.accessibilityTraits = UIAccessibilityTraits.none
408+
elements.append(plainView)
411409
}
412410
if config.dimMode.modal {
413411
maskingView.accessibilityViewIsModal = true
414412
}
415413
maskingView.accessibleElements = elements
416414
}
415+
416+
func maskingViewOverlay() -> UIView {
417+
let overlayView = UIView(frame: maskingView.bounds)
418+
overlayView.translatesAutoresizingMaskIntoConstraints = true
419+
overlayView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
420+
maskingView.addSubview(overlayView)
421+
maskingView.sendSubviewToBack(overlayView)
422+
overlayView.isUserInteractionEnabled = false
423+
overlayView.isAccessibilityElement = true
424+
425+
return overlayView
426+
}
417427

418428
installed = true
419429
guard let containerView = presentationContext.viewValue() else { return }

0 commit comments

Comments
 (0)