관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] iOS 17+에서 UIActivityViewController 접근성 버그 해결 방법 (포커스가 UIActivityViewController로 자동으로 잡히지 않는 버그) 본문

iOS 응용 (swift)

[iOS - swift] iOS 17+에서 UIActivityViewController 접근성 버그 해결 방법 (포커스가 UIActivityViewController로 자동으로 잡히지 않는 버그)

jake-kim 2024. 6. 3. 01:35

iOS 17+에서 UIActivityViewController 접근성 버그

  • 버튼을 눌러서 UIActivityViewController를 띄우는 화면에서 접근성이 버튼에서 자동으로 UIActivityViewController으로 이동되지 않는 현상
    • 기본지식) fullScreen 모달 스타일로 UIViewController가 화면에 보여지게되면 접근성도 UIViewController로 자동으로 포커스가 이동되어야 하는데 iOS 17+ 에서 UIActivityViewController를 present로 띄우면 포커스가 자동으로 이동 안되는 경우가 존재

UIActivityViewController를 띄우는 예제

코드)

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let shareButton = UIButton(type: .system)
        shareButton.setTitle("Share", for: .normal)
        shareButton.addTarget(self, action: #selector(shareButtonTapped), for: .touchUpInside)
        shareButton.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(shareButton)
        NSLayoutConstraint.activate([
            shareButton.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            shareButton.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
    }

    @objc func shareButtonTapped() {
        let activityViewController = UIActivityViewController(activityItems: [], applicationActivities: nil)
        present(activityViewController, animated: true, completion: nil)
    }
}

해결 방법

  • present되고나서 UIAccessibility.post를 사용하여 강제로 포커스를 잡는 방법
    • UIAccessibility.post(notification:arguments:)에 관한 설명은 이전 포스팅 글 참고
    • 주의사항) notification 타입은 .screenChanged가 아닌 .layoutChanged로 해야 동작하고 argument에는 VC이 아니라 UIView를 넣어주어야함
present(activityViewController, animated: true) {
    UIAccessibility.post(notification: .layoutChanged, argument: activityViewController.view)
}
Comments