Slide 1

Slide 1 text

1

Slide 2

Slide 2 text

2

Slide 3

Slide 3 text

3

Slide 4

Slide 4 text

note inc. ೥݄ελʔτ 4

Slide 5

Slide 5 text

note inc. cakes͸ଟ਺ͷΫϦΤΠλʔ΍ग़൛ࣾͱఏܞ͍ͯ͠Δίϯςϯπ഑৴αΠτ Ͱ͢ɻಡऀͱΫϦΤΠλʔΛΑΓ਎ۙʹ݁ͼ͚ͭΔ͜ͱͰɺίϯςϯπͱͷ ৽͍͠ग़ձ͍ͷ৔Λఏڙ͠·͢ɻ 5

Slide 6

Slide 6 text

note inc. ೥݄ελʔτ 6

Slide 7

Slide 7 text

note inc. ΫϦΤΠλʔ͕จষ΍ը૾ɺԻ੠ɺಈըΛ౤ߘͯ͠ɺϢʔβʔ͕ͦͷίϯςϯπΛ ָ͠ΜͰԠԉͰ͖ΔϝσΟΞϓϥοτϑΥʔϜɻͩΕ΋͕૑࡞Λָ͠ΜͰଓ͚ΒΕ ΔΑ͏ɺ҆৺Ͱ͖Δงғؾ΍ɺଟ༷ੑΛେ੾ʹ͍ͯ͠·͢ɻ 7

Slide 8

Slide 8 text

note inc. ϛογϣϯ ͩΕ΋͕૑࡞Λ͸͡Ίɺ ଓ͚ΒΕΔΑ͏ʹ͢Δɻ 8

Slide 9

Slide 9 text

ΞΫηγϏϦςΟ 9

Slide 10

Slide 10 text

΢ΣϒΞΫηγϏϦςΟج൫ҕһձ 
 https://waic.jp/knowledge/accessibility/ “ҰൠʹΞΫηγϏϦςΟͱ͸ɺΞΫηεͷ͠΍͢͞Λҙຯ͠·͢ɻస ͯ͡ɺ੡඼΍αʔϏεͷར༻͠΍͢͞ͱ͍͏ҙຯͰ΋࢖ΘΕ·͢ɻ” ΞΫηγϏϦςΟ 10

Slide 11

Slide 11 text

ΞΫηγϏϦςΟ • ো֐ऀ΍ߴྸऀ޲͚ͷରԠͱࢥΘΕ͕͕ͪͩɺશਓྨ͕৘ใʹ৮ΕͨΓػೳΛମݧ Ͱ͖Δ͜ͱΛ໨ࢦ͢ • ಛʹը໘Λཁ͢Δ΢ΣϒαΠτ΍εϚʔτϑΥϯΞϓϦέʔγϣϯʹ͓͍ͯ͸ɺࢹ֮ ো֐Λ࣋ͭਓ΍ࢹྗ͕௿Լͨ͠ਓʹෆศΛײͤͯ͡͞͠·͏͜ͱ͕ଟ͍ͨΊɺࢹ֮ తͳαϙʔτΛߦ͏͜ͱ͕த৺ͱͳΔ • ྫ: ը໘ͷಡΈ্͛ػೳ΍ɺը໘΍ϑΥϯτͷ֦େػೳΛαϙʔτ • ͜ͷൃදͰ΋AppleϓϥοτϑΥʔϜͷΞΫηγϏϦςΟʹؔ͢ΔػೳͰ͋Δ VoiceOverΛத৺ʹ঺հ 11

Slide 12

Slide 12 text

΢ΣϒΞΫηγϏϦςΟͷ4ͭͷݪଇ • ஌֮Մೳ • ৘ใٴͼϢʔβΠϯλϑΣʔείϯϙʔωϯτ͸ɺར༻ऀ͕஌֮Ͱ͖Δํ๏Ͱར༻ऀʹఏࣔՄೳͰͳ ͚Ε͹ͳΒͳ͍ɻ • ૢ࡞Մೳ • ϢʔβΠϯλϑΣʔείϯϙʔωϯτٴͼφϏήʔγϣϯ͸ૢ࡞ՄೳͰͳ͚Ε͹ͳΒͳ͍ɻ • ཧղՄೳ • ৘ใٴͼϢʔβΠϯλϑΣʔεͷૢ࡞͸ཧղՄೳͰͳ͚Ε͹ͳΒͳ͍ɻ • ݎ࿚ੑ • ίϯςϯπ͸ɺࢧԉٕज़ΛؚΉ༷ʑͳϢʔβΤʔδΣϯτ͕࣮֬ʹղऍͰ͖ΔΑ͏ʹे෼ʹݎ࿚Ͱͳ ͚Ε͹ͳΒͳ͍ɻ 12 https://waic.jp/docs/UNDERSTANDING-WCAG20/intro.html

Slide 13

Slide 13 text

ϢʔβʔϏϦςΟͱͷؔ܎ • ࢖͍΍͢͞ͱ͍͏ίϯςΩετͰΑ͘ར༻͞ΕΔ͕ϢʔβʔϏ ϦςΟ͸ΞΫηγϏϦςΟ͕อͨΕ্ͨͰҙ͍ࣝͨ͠ • ͦ΋ͦ΋ΞΫηεͰ͖ͳ͚Ε͹ར༻͕Ͱ͖ͳ͍ͨΊ 13

Slide 14

Slide 14 text

ϢʔβʔϏϦςΟͱͷؔ܎ • ࢖͍΍͢͞ͱ͍͏ίϯςΩετͰΑ͘ར༻͞ΕΔ͕ϢʔβʔϏ ϦςΟ͸ΞΫηγϏϦςΟ͕อͨΕ্ͨͰҙ͍ࣝͨ͠ • ͦ΋ͦ΋ΞΫηεͰ͖ͳ͚Ε͹ར༻͕Ͱ͖ͳ͍ͨΊ 14 ϢʔβʔϏϦςΟ ΞΫηγϏϦςΟ

Slide 15

Slide 15 text

ΠϯΫϧʔγϒσβΠϯ • ॅΜͰ͍Δ৔ॴ΍೥୅ɺੑผͳͲʹΑΔจԽͷҧ͍ • ࿩ͨ͠Γฉ͍ͨΓɺॻ͍ͨΓಡΜͩΓ͢Δݴޠ 15 https://developer.apple.com/videos/play/wwdc2021/10275/ https://developer.apple.com/videos/play/wwdc2021/10304/ ͳͲ͜Ε·Ͱഉআ͞Ε͍ͯͨਓʑΛר͖ࠐΈͳ͕ΒแׅతʹσβΠϯ͢Δ ख๏ ΞΫηγϏϦςΟ΍ϢʔβʔϏϦςΟ +

Slide 16

Slide 16 text

ͳͥ ͰΞΫηγϏϦςΟ ͷ޲্ʹऔΓ૊Έ࢝Ί͔ͨ 16

Slide 17

Slide 17 text

औΓ૊Έ࢝Ί͖͔͚ͨͬ • ࣾ಺͔ΒΞΫηγϏϦςΟΛ޲্͍ͨ͠ͱ͍͏੠্͕͕Δ • ΋ͱ΋ͱΞΫηγϏϦςΟͷ޲্ʹڵຯ͕͋ͬͨ • ۀ຿ҕୗͱ͍͏ܗͰΞΫηγϏϦςΟʹؔ͢ΔΞυόΠεΛ͘ΕΔํ͕ δϣΠϯ • noteͷ7प೥ه೦ΠϕϯτͰΞΫηγϏϦςΟʹ΋ྗΛೖΕΔࢫΛൃද • ໡໨ͷํ͔Βͷ໰͍߹Θ͕ͤ͋ΓϢʔβʔΠϯλϏϡʔΛ࣮ࢪ 17

Slide 18

Slide 18 text

औΓ૊Έ࢝Ί͖͔͚ͨͬ • ࣾ಺͔ΒΞΫηγϏϦςΟΛ޲্͍ͨ͠ͱ͍͏੠্͕͕Δ • ΋ͱ΋ͱΞΫηγϏϦςΟͷ޲্ʹڵຯ͕͋ͬͨ • ۀ຿ҕୗͱ͍͏ܗͰΞΫηγϏϦςΟʹؔ͢ΔΞυόΠεΛ͘ΕΔํ͕ δϣΠϯ • noteͷ7प೥ه೦ΠϕϯτͰΞΫηγϏϦςΟʹ΋ྗΛೖΕΔࢫΛൃද • ໡໨ͷํ͔Βͷ໰͍߹Θ͕ͤ͋ΓϢʔβʔΠϯλϏϡʔΛ࣮ࢪ 18

Slide 19

Slide 19 text

໡໨ͷํ΁ͷΠϯλϏϡʔΛ࣮ࢪ • ZoomͰ࣮ࢪ • ීஈͲͷΑ͏ʹnoteΛར༻͍ͯ͠Δ͔ • noteͰࠔ͍ͬͯΔ͜ͱ͕ͳ͍͔ 19

Slide 20

Slide 20 text

໡໨ͷํ΁ͷΠϯλϏϡʔΛ࣮ࢪ • ZoomͰ࣮ࢪ • ීஈͲͷΑ͏ʹnoteΛར༻͍ͯ͠Δ͔ • noteͰࠔ͍ͬͯΔ͜ͱ͕ͳ͍͔ • iOSΞϓϦͰهࣄʹݟग़͠ը૾͕ઃఆͰ͖ͳ͍ • هࣄΛެ։͢Δࡍʹϋογϡλάͷઃఆ͕͏·͍͔͘ͳ͍ 20

Slide 21

Slide 21 text

هࣄʹݟग़͠ը૾͕ઃఆͰ͖ͳ͍༷ࢠ 21

Slide 22

Slide 22 text

هࣄΛެ։͢Δࡍʹϋογϡλάͷઃఆ͕͏·͍͔͘ͳ͍༷ࢠ 22

Slide 23

Slide 23 text

͜ΕΒͷ༷ࢠΛݟͯࢥ͍·ͨ͠ 23

Slide 24

Slide 24 text

όά΍Μ… 24

Slide 25

Slide 25 text

ଊ͑ํͷมԽ • ͜Ε·Ͱ͸ΞΫηγϏϦςΟΛ޲্ͤ͞Α͏ͱࢥͬͯ΋Ͳ͏ߦಈ͠ ͍͍ͯͷ͔෼͔Βͳ͔ͬͨ • ࣮ࡍʹಈ༷͘ࢠΛݟΔ͜ͱͰɺͨͩͷෆ۩߹ͩͱଊ͑ΒΕΔΑ͏ʹ • ΞΫηγϏϦςΟ޲্Λܝ͛ͯ΋ͳ͔ͳ͔λεΫ͸ਐΈਏ͍ • 1ͭͷόάमਖ਼ͱ͍͏λεΫʹ෼ղ͢Ε͹༏ઌ౓্͕͕ͬͯ͘Δ 25

Slide 26

Slide 26 text

VoiceOverͷ࢖͍ํ 26

Slide 27

Slide 27 text

VoiceOverͷ੾Γସ͑ํ๏ 27

Slide 28

Slide 28 text

VoiceOverͷ؆୯ͳ࢖͍ํ 28

Slide 29

Slide 29 text

https://developer.apple.com/videos/play/wwdc2018/226/ “VoiceOver: App Testing Beyond The Visuals” 29

Slide 30

Slide 30 text

࣮ࡍʹൃੜͨ͠໰୊ͱͦͷղܾํ๏ 30

Slide 31

Slide 31 text

࣮ࡍʹൃੜͨ͠໰୊ͱͦͷղܾํ๏ • tapGestureRecognizer͕ઃఆ͞Ε͍ͯΔUIView͕બ୒Ͱ ͖ͳ͍໰୊ • ը૾ͷΈͷϘλϯͰҙਤ͠ͳ͍ಡΈ্͕͛͞Εͯ͠·͏໰୊ • ϋʔϑϞʔμϧ͕ด͡ΒΕͳ͍໰୊ 31

Slide 32

Slide 32 text

tapGestureRecognizer͕ઃఆ͞ Ε͍ͯΔUIView͕બ୒Ͱ͖ͳ͍໰୊ 32

Slide 33

Slide 33 text

ίʔυΠϝʔδ lazy var containerView: UIView = { let view = UIView(frame: view.bounds) view.isUserInteractionEnabled = true view.addGestureRecognizer( UITapGestureRecognizer(target: self, action: #selector(tap(sender:)))) return view }() @objc private func tap(sender: UITapGestureRecognizer) { showTappedAlert() } 33

Slide 34

Slide 34 text

tapGestureRecognizer͕ ઃఆ͞Ε͍ͯΔUIView͕બ୒Ͱ͖ͳ͍໰୊ 34

Slide 35

Slide 35 text

मਖ਼಺༰ view.isAccessibilityElement = true + 35

Slide 36

Slide 36 text

tapGestureRecognizer͕ ઃఆ͞Ε͍ͯΔUIView͕બ୒Ͱ͖ͳ͍໰୊मਖ਼൛ 36

Slide 37

Slide 37 text

ը૾ͷΈͷϘλϯͰҙਤ͠ͳ͍ ಡΈ্͕͛͞Εͯ͠·͏໰୊ 37

Slide 38

Slide 38 text

ίʔυΠϝʔδ lazy var button: UIButton = { let button = UIButton(type: .custom) let configuration = UIImage.SymbolConfiguration( font: UIFont.systemFont(ofSize: 280)) let image = UIImage(systemName: "heart", withConfiguration: configuration) button.setImage(image, for: .normal) return button }() 38

Slide 39

Slide 39 text

ը૾ͷΈͷϘλϯ͕ ҙਤ͠ͳ͍ಡΈ্͕͛͞Εͯ͠·͏໰୊ 39

Slide 40

Slide 40 text

मਖ਼಺༰ button.accessibilityLabel = "εΩ" + 40

Slide 41

Slide 41 text

ը૾ͷΈͷϘλϯ͕ ҙਤ͠ͳ͍ಡΈ্͕͛͞Εͯ͠·͏໰୊मਖ਼൛ 41

Slide 42

Slide 42 text

ϋʔϑϞʔμϧ͕ด͡ΒΕͳ͍໰୊ 42

Slide 43

Slide 43 text

ϋʔϑϞʔμϧ͕ด͡ΒΕͳ͍໰୊ 43

Slide 44

Slide 44 text

मਖ਼಺༰ 1 lazy var closeButton: UIButton = { let button = UIButton(type: .custom) button.setTitle("ด͡Δ", for: .normal) button.addTarget(self, action: #selector(close(sender:)), for: .touchUpInside) return button }() @objc private func close(sender: Any) { dismiss(animated: true) } 44

Slide 45

Slide 45 text

मਖ਼಺༰ 2 private var cancellable: AnyCancellable? private func subscribeVoiceOver() { cancellable?.cancel() cancellable = NotificationCenter.default.publisher( for: UIAccessibility.voiceOverStatusDidChangeNotification ) .sink { [weak self] _ in self?.handleVoiceOverStatus() } } private func handleVoiceOverStatus() { closeButton.isHidden = !UIAccessibility.isVoiceOverRunning } 45

Slide 46

Slide 46 text

ϋʔϑϞʔμϧ͕ ด͡ΒΕΔΑ͏ʹमਖ਼൛ 46

Slide 47

Slide 47 text

ߋʹମݧΛ޲্ͤ͞Δ6ͭͷࢪࡦ 47

Slide 48

Slide 48 text

ߋʹମݧΛ޲্ͤ͞Δ6ͭͷࢪࡦ • ϑΥʔΧε͕౰͍ͨͬͯΔཁૉͰԿ͕Ͱ͖Δͷ͔Λ஌Β͍ͤͨ • Կ͔ಈ࡞Λͨ͠Β༻ҙͨ͠ςΩετΛಡΈ্͍͛ͨ • Կ͔ಈ࡞Λͨ͠ࡍʹϑΥʔΧε͞ΕΔ৔ॴΛࢦఆ͍ͨ͠ • ೔෇ͷಡΈ্͛ΛࣗવʹରԠ͍ͨ͠ • Ϧετը໘ͰεΠονͷON/OFFͷૢ࡞Λࣗવʹ͍ͨ͠ • ݟग़͠δϟϯϓػೳ΁ͷରԠΛ͍ͨ͠ 48

Slide 49

Slide 49 text

ϑΥʔΧε͕౰͍ͨͬͯΔཁૉͰ Կ͕Ͱ͖Δͷ͔Λ஌Β͍ͤͨ 49

Slide 50

Slide 50 text

50 Կ͕Ͱ͖Δͷ͔͕෼͔Βͳ͍༷ࢠ

Slide 51

Slide 51 text

ରԠ಺༰ 51 cell.accessibilityHint = "μϒϧλοϓͰ࡟আ" +

Slide 52

Slide 52 text

52 Կ͕Ͱ͖Δͷ͔͕෼͔ΔΑ͏ʹͳ༷ͬͨࢠ

Slide 53

Slide 53 text

Կ͔ಈ࡞Λͨ͠Β༻ҙͨ͠ςΩετ ΛಡΈ্͍͛ͨ 53

Slide 54

Slide 54 text

ίʔυΠϝʔδ 54 private func showErrorMessage(_ errorMessage: String) { errorLabel.text = errorMessage }

Slide 55

Slide 55 text

55 Τϥʔ͕දࣔ͞Εͯ΋ ؾ͚ͮͳ͍༷ࢠ

Slide 56

Slide 56 text

ରԠ಺༰ 56 private func showErrorMessage(_ errorMessage: String) { errorLabel.text = errorMessage UIAccessibility.post(notification: .announcement, argument: errorMessage) } + https://developer.apple.com/documentation/uikit/uiaccessibility/notification

Slide 57

Slide 57 text

57 Τϥʔ͕දࣔ͞Ε͍ͯΔ͜ͱʹ ؾ͚ͮΔΑ͏ʹͳ༷ͬͨࢠ

Slide 58

Slide 58 text

Կ͔ಈ࡞Λͨ͠ࡍʹϑΥʔΧε ͞ΕΔ৔ॴΛࢦఆ͍ͨ͠ 58

Slide 59

Slide 59 text

Կ͔ಈ࡞Λͨ͠ࡍʹϑΥʔΧε͞ΕΔ৔ॴΛࢦఆ͍ͨ͠ 59

Slide 60

Slide 60 text

मਖ਼಺༰ @objc private func next(sender: Any) { UIAccessibility.post(notification: .layoutChanged, argument: messageLabel) } + 60 https://developer.apple.com/documentation/uikit/uiaccessibility/notification

Slide 61

Slide 61 text

Կ͔ಈ࡞Λͨ͠ࡍʹϑΥʔΧε͞ΕΔ৔ॴΛࢦఆ͍ͨ͠ରԠ൛ 61

Slide 62

Slide 62 text

೔෇ͷಡΈ্͛ΛࣗવʹରԠ͍ͨ͠ 62

Slide 63

Slide 63 text

ίʔυΠϝʔδ1 lazy var dateLabel: UILabel = { let label = UILabel() label.textColor = .label label.font = UIFont.preferredFont(forTextStyle: .headline) label.textAlignment = .center label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping return label }() 
 
 private func showNow() { dateLabel.text = dateFormatter.string(from: now) } 63

Slide 64

Slide 64 text

ίʔυΠϝʔδ2 private lazy var dateFormatter: DateFormatter = { guard let dateFormat = DateFormatter.dateFormat( fromTemplate: "yyyy/MM/dd HH:mm", options: 0, locale: .current) else { fatalError("failed get date format from template") } var calendar = Calendar(identifier: .gregorian) let timeZone = TimeZone.current let locale = Locale.current calendar.locale = locale var dateFormatter = DateFormatter() dateFormatter.calendar = calendar dateFormatter.timeZone = timeZone dateFormatter.locale = locale dateFormatter.dateFormat = dateFormat return dateFormatter }() 64

Slide 65

Slide 65 text

65 ೔෇ͷಡΈ্͛ΛࣗવʹରԠ͢Δલ

Slide 66

Slide 66 text

मਖ਼಺༰ 66 private func showNow() { dateLabel.text = dateFormatter.string(from: now) dateLabel.accessibilityLabel = accessibilityDateFormatter.string(from: now) } private lazy var accessibilityDateFormatter: DateFormatter = { var calendar = Calendar(identifier: .gregorian) let timeZone = TimeZone.current let locale = Locale.current calendar.locale = locale var dateFormatter = DateFormatter() dateFormatter.calendar = calendar dateFormatter.timeZone = timeZone dateFormatter.locale = locale dateFormatter.dateStyle = .long dateFormatter.timeStyle = .medium return dateFormatter }() + +

Slide 67

Slide 67 text

67 ೔෇ͷಡΈ্͛ΛࣗવʹରԠ൛

Slide 68

Slide 68 text

Ϧετը໘ͰεΠονͷON/OFFͷૢ࡞ Λࣗવʹ͍ͨ͠ 68

Slide 69

Slide 69 text

69 Ϧετը໘ͰεΠονͷON/OFFͷૢ࡞վળલ

Slide 70

Slide 70 text

मਖ਼಺༰ 70 private func setUp() { isAccessibilityElement = true } 
 
 override var accessibilityLabel: String? { get { titleLabel.text } set {} } override var accessibilityValue: String? { get { toggleSwitch.accessibilityValue } set {} } override var accessibilityTraits: UIAccessibilityTraits { get { toggleSwitch.accessibilityTraits } set {} } override func accessibilityActivate() -> Bool { toggleSwitch.isOn.toggle() return true } SwitchAccessibleViewCell.swift

Slide 71

Slide 71 text

71 Ϧετը໘ͰεΠονͷON/OFFͷૢ࡞վળޙ

Slide 72

Slide 72 text

ݟग़͠δϟϯϓػೳ΁ͷରԠΛ͍ͨ͠ 72

Slide 73

Slide 73 text

ϩʔλʔػೳ • “VoiceOver ϩʔλʔΛ࢖ͬͯ VoiceOver ͷಈ࡞ΛมߋͰ͖· ͢ɻVoiceOver ͷԻྔ΍࿩͢଎͞Λมߋͨ͠Γɺը໘্Ͱ߲໨ؒ ΛҠಈͨ͠Γ͢Δ͜ͱ͕Ͱ͖ɺͦͷଞͷૢ࡞΋ՄೳͰ͢ɻ” 
 https://support.apple.com/ja-jp/HT204783 • 1ຊࢦͷ্ԼεϫΠϓͰར༻Մೳ • ը໘্Λ2ຊࢦͰճ͢Α͏ʹಈ͔͢͜ͱͰઃఆΛมߋ • ΧελϜػೳΛ࡞੒͢Δ͜ͱ΋Մೳ 
 https://developer.apple.com/documentation/uikit/ uiaccessibilitycustomrotor 73

Slide 74

Slide 74 text

ίʔυΠϝʔδ 74 private func makeHeadlineLabel(with title: String) -> UILabel { let label = UILabel() label.font = UIFont.preferredFont(forTextStyle: .headline) label.textColor = UIColor.label label.text = title label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping return label }

Slide 75

Slide 75 text

75 ݟग़͠δϟϯϓػೳ΁ͷରԠલ

Slide 76

Slide 76 text

मਖ਼಺༰ 76 private func makeHeadlineLabel(with title: String) -> UILabel { let label = UILabel() label.font = UIFont.preferredFont(forTextStyle: .headline) label.textColor = UIColor.label label.text = title label.numberOfLines = 0 label.lineBreakMode = .byWordWrapping label.accessibilityTraits = [.header] return label } +

Slide 77

Slide 77 text

77 ݟग़͠δϟϯϓػೳ΁ͷରԠޙ

Slide 78

Slide 78 text

78 static var none: UIAccessibilityTraits The accessibility element has no traits. static var button: UIAccessibilityTraits The accessibility element behaves like a button. static var link: UIAccessibilityTraits The accessibility element behaves like a link. static var image: UIAccessibilityTraits The accessibility element behaves like an image. static var searchField: UIAccessibilityTraits The accessibility element behaves like a search field. static var keyboardKey: UIAccessibilityTraits The accessibility element behaves like a keyboard key. static var staticText: UIAccessibilityTraits The accessibility element behaves like static text that can't change. static var header: UIAccessibilityTraits The accessibility element is a header that divides content into sections, such as the title of a navigation bar. static var tabBar: UIAccessibilityTraits The accessibility element behaves like a tab bar. static var summaryElement: UIAccessibilityTraits The accessibility element provides summary information when the app starts. static var selected: UIAccessibilityTraits The accessibility element is currently in a selected state. static var notEnabled: UIAccessibilityTraits The accessibility element isn't in an enabled state and doesn't respond to user interaction. static var adjustable: UIAccessibilityTraits The accessibility element allows continuous adjustment through a range of values. static var allowsDirectInteraction: UIAccessibilityTraits The accessibility element allows direct touch interaction for VoiceOver users. static var updatesFrequently: UIAccessibilityTraits The accessibility element frequently updates its label or value. static var causesPageTurn: UIAccessibilityTraits The accessibility element causes an automatic page turn when VoiceOver finishes reading the text within it. static var playsSound: UIAccessibilityTraits The accessibility element plays its own sound when the user activates it. static var startsMediaSession: UIAccessibilityTraits The accessibility element starts a media session when the user activates it. accessibilityTraits https://developer.apple.com/documentation/uikit/uiaccessibility/uiaccessibilitytraits

Slide 79

Slide 79 text

ΞΫηγϏϦςΟͷઃఆΛ֬ೝ͢ΔTips 79

Slide 80

Slide 80 text

ΞΫηγϏϦςΟͷઃఆΛ֬ೝ͢ΔTips • ʮԻ੠ίϯτϩʔϧʯΛ༗ޮʹͯ͠ ʮΦʔόʔϨΠʯͷઃఆΛʮ߲໨ ໊ʯʹ͢Δ͜ͱͰઃఆࡁΈͷϥϕϧ ͕ՄࢹԽͰ͖Δ • VoiceOverΛ࣮ࡍʹ࢖Θͣͱ΋ϥϕ ϧͷ֬ೝ͕Ͱ͖ͯศར 80

Slide 81

Slide 81 text

Accessibility Inspector 81 • ΞΫηγϏϦςΟʹؔ͢ΔΑΓৄࡉ ͷ৘ใΛௐ΂Δʹ͸Xcodeʹ෇ଐͷ Accessibility InspectorΛར ༻

Slide 82

Slide 82 text

ΞΫηγϏϦςΟʹؔ͢Δςετ • SnapshotTesting 
 https://github.com/pointfreeco/swift-snapshot-testing • AccessibilitySnapshot 
 https://github.com/cashapp/AccessibilitySnapshot • A11yUITests 
 https://github.com/rwapp/A11yUITests 82

Slide 83

Slide 83 text

ར༻ऀͷ੠ • “ૉఢͳॻ͖खͱܨ͕Δ৔ॴͰ͋Γɺࢲࣗ਎͕ࣗ෼Λදݱ͢Δ৔ॴͰ͋ΔnoteͰ ͜Ε͔Β΋ॻ͍͍͖͍ͯͨɻͦͷҰาͱͯ͠ΞΫηγϏϦςΟͷվળ͸େ͖ͳྗ ʹͳͬͨɻ” 
 https://note.com/azusa_1202/n/neeeb0112c395 • “note͕ΞΫηγϏϦςΟʹऔΓ૊Ή͜ͱʹΑΓɺࢲͷΑ͏ͳεΫϦʔϯɾϦʔ μʔ࢖༻ऀ͚ͩͰͳ͘ɺ਎ମ΍ೝ஌ʹࠔ೉͞Λײ͡Δਓ΍ಡࣈো֐΍ॻࣈো֐ͳ Ͳɺ͍Ζ͍Ζͳ“ଟ༷ੑ”ʹԠ͑ΒΕΔαʔϏεʹ͍͍ۙͮͯ͘ͱࢥ͍·͢ɻ” 
 https://note.com/kokoa_nattsu/n/nc08f81cda989 83

Slide 84

Slide 84 text

ࠓޙͷల๬ • ͷ΢ΣϒɾΞϓϦͷΞΫηγϏϦςΟͷ޲্׆ಈ͸·ͩ·ͩ࢝ ·ͬͨ͹͔ΓͰෆ׬શ • ΞΫηγϏϦςΟͷ޲্ʹΰʔϧ͸ͳ͍ • ఆৗͷ։ൃɾ඼࣭؅ཧͷதʹ૊ΈࠐΜͰ։ൃΛਐΊͯߦ͖͍ͨ • ఆظతʹϢʔβʔΠϯλϏϡʔ΍ΞϯέʔτͳͲΛ࣮ࢪͯ͠ར༻ऀͷ੠Λ र্͍͍͛ͯ͘࢓૊Έͮ͘Γ 84

Slide 85

Slide 85 text

·ͱΊ • ΞΫηγϏϦςΟΛ޲্͢Δͱҙؾࠐ·ͣʹόάΛमਖ਼͢Δͱ͍͏ҙࣝ • NSObject͕͍࣋ͬͯΔaccessibilityؔ࿈ϓϩύςΟ͔Β • ༻్ʹ߹ΘͤͯUIAccessibility΍Accessibility Frameworkͷ ػೳΛར༻ͯ͠ମݧΛ޲্Λ͍͚ͤͯ͞͹Αͦ͞͏ • ΞΫηγϒϧͳΞϓϦ͕૿͑Δ͜ͱͰɺࠔ͍ͬͯΔਓ͕গ͠Ͱ΋ݮΕ͹ 85

Slide 86

Slide 86 text

৘ใऩू • https://developer.apple.com/accessibility/ • https://a11yj.herokuapp.com 
 #apple-app νϟϯωϧͰAppleϓϥοτϑΥʔϜʹؔ͢Δ৘ใަ׵ • https://a11y-guidelines.orange.com/en/ • https://accrefs.jp 
 Webʹؔ͢Δ৘ใ͕΄ͱΜͲ͚ͩͲΞϓϦ΋গ͠ 86

Slide 87

Slide 87 text

ͰͷऔΓ૊Έ • ΞΫηγϏϦςΟڧԽͷҰ؀ͰɺεΫϦʔϯϦʔμʔʹΑΔಡΈ্͛ͷΧ ΠθϯΛߦ͍·ͨ͠ 
 https://note.com/info/n/n4dbe29c380a1 • VoiceOverɺDynamic TypeͳͲɺiOSΞϓϦͷΞΫηγϏϦςΟػೳ ͷڧԽΛߦ͍·ͨ͠ 
 https://note.com/info/n/nfcc92e285d96 • ͳͲͳͲ 87

Slide 88

Slide 88 text

αϯϓϧίʔυ 88 https://github.com/fromkk/AccessibilitySampler

Slide 89

Slide 89 text

89