è¯ãäžæ¥ïŒ ç§ã®ååã¯ã€ãŽã¡ã³ã»ã¹ã¢ãªã³ã§ãã ç§ã¯Touch Instinctã®iOSéçºè ã§ãã
ä»æ¥ãVoiceOverãã¯ãããžãŒãiOSã«ã©ããªãã®ãããããã話ãããããšæããŸãã ãããŠãèŠèŠé害ã®ãã人ã«ãšã£ãŠãããããŒã«ã®ã¢ããªã±ãŒã·ã§ã³ããã䟿å©ã«ããæ¹æ³ã
VoiceOverãšã¯
ããã¯ãã¢ãã€ã«ããã€ã¹ã®ç»é¢äžã®ã³ã³ãã³ããèªã¿åããžã§ã¹ãã£ããŒã¹ã®æ¹æ³ã§ãã ãã®ãã¯ãããžãŒã«ããããŠãŒã¶ãŒã¯ç»é¢äžã®ã³ã³ãã³ãã衚瀺ããªããŠãã¢ãã€ã«ããã€ã¹ãå¶åŸ¡ã§ããŸãã 圌女ã¯ãã¢ããªã±ãŒã·ã§ã³ã€ã³ã¿ãŒãã§ã€ã¹ãšãŠãŒã¶ãŒã®éã®ä»²ä»è ãšããŠæ©èœããã¢ããªã±ãŒã·ã§ã³ã®ã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãšã¢ã¯ã·ã§ã³ã®è©³çŽ°ã声ã«åºããŠè©±ããŸãã
ãã®æ©èœã¯ãèŠèŠé害ã®ãã人ã«ãšã£ãŠç¹ã«äŸ¿å©ã§ãã VoiceOverã䜿çšãããšããã®çš®ã®åé¡ãæ±ãã人ã ãã¢ãã€ã«ããã€ã¹ãç°¡åã«äœ¿çšã§ããŸãã ãã®æ©èœãæå¹ã«ãããšããŠãŒã¶ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹å ã移åããŠãå®è¡ããå¿ èŠã®ããã¢ã¯ã·ã§ã³ãšãããã®ã¢ã¯ã·ã§ã³ã®çµæãç解ã§ããŸãã [1]
VoiceOverã®äœ¿çšæ¹æ³
ãŠãŒã¶ãŒãç»é¢äžã®ä»»æã®å Žæãã¿ãããããšãã¢ãã€ã«ããã€ã¹ïŒiPhoneãiPadãWatchïŒããã®å Žæã«ããèŠçŽ ã倧声ã§è©±ããŸãã
- èŠçŽ ãããã«ã¿ãããããšããããéžæãããŸãã
- ç»é¢äžã®ã³ã³ãã³ããã¹ã¯ããŒã«ããã«ã¯ã1æ¬ã§ã¯ãªã3æ¬ã®æã䜿çšããå¿ èŠããããŸãã
- 3æ¬ã®æã§ããã«ã¿ãããããšãããã¯ç»é¢ã®é³å£°ã³ãã³ãããªã³ãŸãã¯ãªãã«ãªããŸãã
- ã¢ã¯ã·ã§ã³ã®å®è¡äžã«2æ¬ã®æã§ããã«ã¿ãããããšããã®ã¢ã¯ã·ã§ã³ãåæ¢ãããããéå§ãããŠããªãå Žåã¯éå§ãããŸãã ããšãã°ãé»è©±ã§ã®äŒè©±äžã«ãç»é¢äžã§2æ¬ã®æã§ããã«ã¿ãããããšé話ãçµäºããŸã
VoiceOverãµããŒããã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããæ¹æ³
ã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯VoiceOverã§æ¢ã«æ£åžžã«æ©èœããŠããŸãã Appleã®ãšã³ãžãã¢ã«æ¬æãè¡šãã䟡å€ã¯ãããŸãããã¹ãŠã®æšæºã³ã³ããŒãã³ãã¯VoiceOverãã¯ãããžãŒãå®å šã«ãµããŒãããŠããŸãã ãã ããèŠèŠé害ã®ãã人ã«ãšã£ãŠã€ã³ã¿ãŒãã§ãŒã¹ããã䟿å©ã«ããããã«ãè¿œå ã®ã³ãŒããèšè¿°ããå¿ èŠãããå ŽåããããŸãã
VoiceOverãµããŒããèªåã§å®è£ ããå¿ èŠãããã³ã³ããŒãã³ãã¯2çš®é¡ã®ã¿ã§ãã
- ã°ã©ãã£ãã¯èŠçŽ ïŒã°ã©ãããã£ãŒããç»åã
- èŠèŠé害ã®ãã人ã«å ã é©åããŠããªãã£ãè€éãªèŠçŽ ïŒããšãã°ãç¥èªã®åœ¢åŒã®èŠåºããæã€è¡šã
æåã®ã¿ã€ãã¯éåžžã«ãŸããªã®ã§ã2çªç®ã®ã±ãŒã¹ã®ç¶æ³ãå€§å¹ ã«æ¹åããæ¹æ³ã詳现ã«æ€èšããŸãã
ãã以å€ã®å Žåã¯ãVoiceOverãæäŸããè¿œå æ©èœã䜿çšããããšã§ã®ã¿äœ¿ãããããåäžã§ããŸãã
èšèš
ã¢ããªã±ãŒã·ã§ã³ã«VoiceOverãªã©ã®æ¯æŽæè¡ã®ãµããŒããæåã«å«ãŸããŠããå Žåããã¹ãŠã¯èšèšããå§ãŸããŸãã Webã³ã³ãã³ããã¢ã¯ã»ã¹å¯èœã«ããããã®ç¹å®ã®ã¬ã€ããšã ã¢ãã€ã«ãã©ãããã©ãŒã ã«ãã®æšæºãé©çšããæ¹æ³ã«é¢ããã¬ã€ãããããŸã ã ãããã®ã¬ã€ãã¯ãèšèšãéå§ããåã«æäœéèªãå¿ èŠããããŸãã
ã¬ã€ã¢ãŠããæç»ããåŸãè¿œå æ å ±ãæ·»ä»ããå¿ èŠããããŸãã èŠèŠçã«ã¯èŠããŸããããèŠèŠé害ã®ãã人ã«ãšã£ãŠã¯éèŠã§ãã VoiceOverã®å Žåããã®ãããªæ å ±ã¯ããŠãŒã¶ãŒã察話ã§ãããã¹ãŠã®ç»é¢èŠçŽ ã®ããã¹ãã«ãã説æã§ãã衚瀺ãŸãã¯ã¯ãªãã¯ããŸãã ãããã®ç¹æ§ãããã¹ãã§èšè¿°ããããšãéèŠã§ãã
äŸ
ãã°ã€ã³ããŒãžã§ãremember meãïŒ4ïŒãåãæ¿ããŸãã
- æåã«èªãããã¹ãïŒç§ãèŠããŠãããŠãã ãã
- ã¢ã€ãã ã¿ã€ãïŒãã¹ã€ããã
- çŸåšã®å€ïŒããªã³ãŸãã¯ãªãã
- è¿œå ã®ãã³ãïŒããã°ã€ã³ãèšæ¶ããã«ã¯ããã«ã¿ããã
éçº
ããŒã«ã©ã€ãºãããæååãååŸããããéçºãéå§ã§ããŸãã ãŸãã ã¢ã¯ã»ã·ããªãã£ããã°ã©ãã³ã°ã¬ã€ãããèªã¿ãã ããã 次ã«ãUIAccessibility APIãããã«è©³ãã調ã¹ãŸãã
UIAccessibility
ãã®ãããã³ã«ã«ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãèšè¿°ããäžé£ã®ããããã£ãå«ãŸããŠããŸãã ãµããŒãã¢ããªã±ãŒã·ã§ã³ã¯ããã®æ
å ±ã䜿çšããŠãé害ãæã€ãŠãŒã¶ãŒãæ¯æŽããŸãã
ãã®ãããã³ã«ã«ã¯ãåºæºå¥ã«ã°ã«ãŒãåã§ããå€ãã®ããããã£ãå«ãŸããŠããŸãã
ã¢ã€ãã ã®èª¬æãæ åœïŒ
- isAccessibilityElement-ãã®èŠçŽ ã¯ãVoiceOverãä»ããéžæãšçºèšã«ãã®èŠçŽ ã䜿çšã§ãããã©ããã決å®ããŸãã
- accessibilityLabel-ãã¿ã³ã®ããã¹ããªã©ãèŠçŽ ã®ã³ã³ãã³ãã®ç°¡åãªèª¬æã ãã®ããã¹ããæåã«èªãŸããŸãã
accessibilityTraits-èŠçŽ ãæã€ç¹æ§ã®çµã¿åããïŒåæïŒã ãããã®æ©èœã¯ãVoiceOverãã¢ã€ãã ãšå¯Ÿè©±ããæ¹æ³ãç解ããã®ã«åœ¹ç«ã¡ãŸãã å€ãã®ç¹æ§[ https://developer.apple.com/reference/objectivec/nsobject/1615202-accessibilitytraits ]ããããŸããããããã®äžéšã®ã¿ããªã¹ãããŸãã
- æãäžè¬çã«äœ¿çšãããïŒ
- UIAccessibilityTraitButton-ã¢ã€ãã ãVoiceOverã«ãã£ãŠãã¿ã³ãšããŠèªèãããããšã瀺ããŸãã
- UIAccessibilityTraitLink-èŠçŽ ãVoiceOverã«ãã£ãŠãªã³ã¯ãšããŠèªèãããããšã瀺ããŸãã
- UIAccessibilityTraitImage-èŠçŽ ãVoiceOverã«ãã£ãŠç»åãšããŠèªèãããããšã瀺ããŸãã
- UIAccessibilityTraitSelected-ã¢ã€ãã ãéžæç¶æ ã§ããããšã瀺ããŸãã
- ãŸãã«ãã䜿çšãããŸããããèå³æ·±ãïŒ
- UIAccessibilityTraitCausesPageTurn-VoiceOverãããã¹ãã®èªã¿åããå®äºãããšãã«èŠçŽ ãããŒãžããããå¿ èŠãããããšã瀺ããŸãã
- UIAccessibilityTraitSummaryElement-ã¢ã€ãã ãç»é¢ã«è¡šç€ºãããå 容ã®æŠèŠãæäŸããããšã瀺ããŸãã ããšãã°ã倩æ°ã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®æž©åºŠã
- UIAccessibilityTraitStartsMediaSession-ãã®èŠçŽ ãã¢ã¯ãã£ãåããããšãã«ã¡ãã£ã¢ã»ãã·ã§ã³ãéå§ããããšã瀺ããŸãã ããšãã°ããŠãŒã¶ãŒããªãŒãã£ãªãé²é³ããŠãããšããVoiceOverã®é³å£°ãæ¶ããŸãã
- æãäžè¬çã«äœ¿çšãããïŒ
- accessibilityValue-èŠçŽ ã®çŸåšã®å€ã ããšãã°ãã¹ã©ã€ããŒã®å€ãããã¹ãããã¯ã¹ã®ããã¹ããæå®ã§ããŸãã ãã®ããã¹ãã¯ãaccessibilityLabelã§å²ãåœãŠãããããã¹ãã®åŸã«èªã¿èŸŒãŸããŸãã
- accessibilityHint-ãŠãŒã¶ãŒããã®èŠçŽ ã«é¢é£ä»ããããã¢ã¯ã·ã§ã³ãå®è¡ãããšããã«èµ·ããããšã®ç°¡åãªèª¬æã ãã®å€ã¯ãaccessibilityValueã§å€ãèšå®ãããŠããªãå ŽåãaccessibilityValueã§å²ãåœãŠãããããã¹ãã®åŸããŸãã¯accessibilityLabelã®åŸã«èªã¿èŸŒãŸããŸãã
- accessibilityLanguage-accessibilityLabelãaccessibilityValueãaccessibilityHintã®ããããã£ããããã¹ããçºé³ããããã«äœ¿çšããèšèªã
- èŠçŽ ã®ç©ºéç¹æ§ãæ
åœããããããã£ïŒ
- accessibilityActivationPoint-ç»é¢äžã®èŠçŽ ã®ã¢ã¯ãã£ãåã®ãã€ã³ãã
- accessibilityFrame-èŠçŽ ãé 眮ãããŠããç»é¢äžã®å Žæã
- accessibilityPath-éåžžã®é·æ¹åœ¢ã®ä»£ããã«èŠçŽ ãéžæããè¡ã
- ã¬ã€ã¢ãŠããæ
åœããããããã£ïŒ
- accessibilityElementsHidden-芪å ã§åã®ãã¢ã¯ã»ã¹å¯èœãªãèŠçŽ ãé衚瀺ã«ãããã©ããã
- shouldGroupAccessibilityChildren-åã®ãã¢ã¯ã»ã¹å¯èœãªãèŠçŽ ãã°ã«ãŒãåãããã©ããã
- accessibilityViewIsModal-çŸåšã®éå±€ã¬ãã«ãšåãéå±€ã¬ãã«ã«ããä»ã®èŠçŽ ãç¡èŠãããã©ããã
- ããã²ãŒã·ã§ã³ãæ
åœããããããã£ïŒ
- accessibilityNavigationStyle-ã³ã³ããã®åãããã²ãŒãããæ¹æ³ã説æããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«é害ã®ãããŠãŒã¶ãŒåãã®ã¢ã¯ã»ã·ããªãã£ã®åé¡ãããå Žåãã»ãšãã©ã®å Žåãããããã£ã®æåã®ã°ã«ãŒããæ£ãããªãŒããŒã©ã€ãããã ãã§æžã¿ãŸãã
FotMobã® UIAccessibilityã®äŸ
次ã«ãäžèšã®UIAccessibilityããããã£ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã®éåžžã«å ·äœçãªåé¡ã解決ããæ¹æ³ã®äŸã瀺ããŸãã
ãã¹ãäžã«ãVoiceOverã®ããã²ãŒã·ã§ã³ããŒã®ãã¿ã³ã®ååä»ãã«é¢é£ããããã€ãã®æ¬ ç¹ã確èªãããŸããã ãããã®åé¡ã解決ããã¢ããªã±ãŒã·ã§ã³å šäœã§ãã¿ã³ãåå©çšã§ããããã«ããããã«ããã¿ã³äœæã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããããšã«ããŸããã
ãŸãããã¹ãŠã®ãã¿ã³ã®ãªã¹ããšããããã®ãã¿ã³ãããèªäœã«æ ŒçŽã§ããå€ãæã€åæåãäœæããŸããã
enum Button { case calendar(date: Date) case filter(isActive: Bool) case alert(isActive: Bool) case commentary case share case favorite(isSelected: Bool) case addToCalendar case edit case close }
次ã«ãåæå€ããUIBarButton
ããã³UIButton
æ¢è£œã®ã€ã³ã¹ã¿ã³ã¹ãäœæããæ¡åŒµæ©èœãäœæãããŸããã
extension Button { private var icon: UIImage? { switch self { case .calendar(let date): let icon = R.image.ic_calendar() let dayOfMonth = // * get day of month * // let iconWithDate = //* render icon with day of month number *// return iconWithDate case .filter(let isActive): return isActive ? R.image.filter_active() : R.image.filter_inactive() case .alert(let isActive): return isActive ? R.image.notification_bell_title_bar_active() : R.image.notification_bell_title_bar_inactive() case .commentary: return R.image.icon_audio_commentary_off() case .share: return R.image.icon_share() case .favorite(let isSelected): return (isSelected ? R.image.starOn() : R.image.starOff())?.withRenderingMode(.alwaysTemplate) case .addToCalendar: return R.image.icon_calendar() case .edit: return R.image.edit() case .close: return R.image.close() } } func buttonWith(target: Any, action: Selector, buttonSize: ButtonSize = .iconSize) -> UIButton { let button = UIButton() button.setImage(icon, for: .normal) button.addTarget(target, action: action, for: .touchUpInside) let size: CGSize switch buttonSize { case .custom(let customSize): size = customSize case .iconSize: size = icon?.size ?? .zero } button.frame = CGRect(.zero, size) return button } func barButtonWith(target: Any, action: Selector, buttonSize: ButtonSize = .iconSize) -> UIBarButtonItem { let item = UIBarButtonItem(customView: buttonWith(target: target, action: action, buttonSize: buttonSize)) switch self { case .calendar(let date): let dateFormatter = DateFormatter() dateFormatter.dateStyle = .medium item.accessibilityLabel = R.string.localizable.calendar() item.accessibilityValue = dateFormatter.string(from: date) item.accessibilityHint = R.string.localizable.select_date_to_filter_matches_hint() case .filter(let isActive): item.accessibilityLabel = R.string.localizable.filter() item.accessibilityValue = isActive ? R.string.localizable.active() : R.string.localizable.inactive() case .alert(let isActive): item.accessibilityLabel = R.string.localizable.set_alerts() item.accessibilityValue = isActive ? R.string.localizable.alerts_enabled() : R.string.localizable.alerts_disabled() item.accessibilityHint = R.string.localizable.edit_match_alerts() case .commentary: item.accessibilityLabel = R.string.localizable.commentary_window_title() case .share: item.accessibilityLabel = R.string.localizable.share() case .favorite(let isSelected): item.accessibilityLabel = R.string.localizable.toggle_favorite() item.accessibilityValue = isSelected ? R.string.localizable.in_favorites() : R.string.localizable.not_favorites() case .addToCalendar: item.accessibilityLabel = R.string.localizable.add_to_calendar() case .edit: item.accessibilityLabel = R.string.localizable.edit() case .close: item.accessibilityLabel = R.string.localizable.close() } return item } }
æåŸã®ãã¿ã³ã®äœæã¯æ¬¡ã®ããã«ãªããŸããã
class SomeController { private let navBarButtons: [Button] = [.commentary, .share, .addToCalendar] private var navBarButtonItems: [UIBarButtonItem] { return navBarButtons.flatMap { switch $0 { case .commentary: return $0.barButtonWith(target: self, action: #selector(self.onBtnCommentaryClicked), buttonSize: .rightBarButtonSize) case .share: return $0.barButtonWith(target: self, action: #selector(self.onBtnShareMatchClicked), buttonSize: .rightBarButtonSize) case .addToCalendar: return $0.barButtonWith(target: self, action: #selector(self.onBtnAddMatchToCalendarClicked), buttonSize: .rightBarButtonSize) default: return nil } } } func updateBarButtons() { navItem.setRightBarButtonItems(navBarButtonItems, animated: false) } }
ãããã®å€æŽåŸãVoiceOverã®æ£ããååãã¢ããªã±ãŒã·ã§ã³ã«è¡šç€ºãããã ãã§ãªããè¿œå æ å ±ãè¿œå ãããŸãããããã¯èŠèŠé害ãæã€äººã ã«ãšã£ãŠéåžžã«äŸ¿å©ã§ãã ããšãã°ãã«ã¬ã³ããŒãã¿ã³ãéžæãããšããã®ååã ãã§ãªããéžæããæ¥ä»ãèªã¿èŸŒãŸããŸãã
éç¥ãã¿ã³ã«ã€ããŠãåæ§ã§ãã ãã¿ã³ãéžæãããç¶æ ïŒéç¥ããªã³ïŒã§ãããã©ããããŠãŒã¶ãŒã«éç¥ããŸãã ãŸãããŠãŒã¶ãŒããã¿ã³ãã¿ãããããšã©ããªããããŠãŒã¶ãŒã«éç¥ããŸãã
ãããã®å°ããªæ¡åŒµã«ãããã¢ããªã±ãŒã·ã§ã³ã®äœ¿çšãå€§å¹ ã«ç°¡çŽ åãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã§ã®ãã1ã€ã®åé¡ã¯ãããŒã ã®çµ±èšæ å ±ãå«ãããŒãã«ã§ããã VoiceOverã®å Žåããã®ãããªããŒãã«ã¯ãäœããã®åœ¢ã§é¢é£ä»ããããŠããªãç¥èªãšæ°åã®ã»ããã«ãããŸããã VoiceOverããªã³ã«ããŠã¢ããªã±ãŒã·ã§ã³ãå®è¡ããããšãããšãèŠèŠé害è ã¯ãã®æå³ã®ãªãåèªã®ã»ãããåŠçã§ããªãããšãããã«æããã«ãªããŸãã
ããã§ã¯ãèŠçŽ ã®ã°ã«ãŒãåãšVoiceOverçšã«ç¹å¥ã«æºåãããè¡ã䜿çšããŸããã ããšãã°ãããŒãã«ã¿ã€ãã«ã¯ãPL WDL±GD PTSãã§ã¯ãªãããããŒãã«ããããŒïŒãã¬ã€æžã¿ããŠã©ã³ããããŒããã¹ãããŽãŒã«å·®ããŽãŒã«å·®å€ããã€ã³ãããšããå±é圢åŒã§è¡šç€ºãããŸãã
è¡šã®åè¡ãšã¿ã€ãã«ã«ã¯ããã£ãŒã«ãã®å®å šãªèª¬æãå«ãŸããŠããŸãããäœçœ®ïŒ4ããã³ãã§ã¹ã¿ãŒã»ãŠãã€ãããããã¬ã€æžã¿ïŒ36ããŠã©ã³ïŒ21ããããŒïŒ9ããã¹ãïŒ6ããŽãŒã«å·®ïŒ72-38ããŽãŒã«å·®å€ïŒ 34ããã€ã³ãïŒ72»
ãã¹ãäž
ç®ãéããŠãã¹ãã§ãããã¹ã¿ãŒãçµéšããŠãããªããããªãã¯å¹žéã§ãã ãã ããå€ãã®å Žåãæ©èœãæ€èšŒãã責任ã¯ããã°ã©ããŒã«ãããŸãã
ã·ãã¥ã¬ãŒã¿ãŒ
VoiceOverã¯ã·ãã¥ã¬ãŒã¿ã§ãµããŒããããŠããªããšããäºå®ã«ãããããããã¢ããªã±ãŒã·ã§ã³ããã¹ãããããšãã§ããŸãã Xcodeãšå ±ã«ã€ã³ã¹ããŒã«ãããAccessibility InspectorãŠãŒãã£ãªãã£ã¯ãããã«åœ¹ç«ã¡ãŸãã
ãã®ãŠãŒãã£ãªãã£ã§ã¯æ¬¡ã®ããšãã§ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®å¯çšæ§ã«é¢ããäžè¬çãªåé¡ãèŠã€ããŸãã
- æ€èšŒã¢ãŒãã§åã¢ã€ãã ã®ã¢ã¯ã»ã·ããªãã£å±æ§ã確èªããŠãã ããã
- äžè¬çãªã¢ã¯ã»ã·ããªãã£èšå®ãå€æŽããåèµ·åããã«ã¢ããªã±ãŒã·ã§ã³ã«ã©ã®ããã«åœ±é¿ãããã確èªããŸãã
ç§èªèº«ã®çµéšããããã®ãŠãŒãã£ãªãã£ã¯éçºã«ã¯ååã§ãããå®å šãªãã¹ãã«ã¯äžååã§ãããšèšããŸãã 圌女ã¯ããã¹ããçºé³ãããå¥èªç¹ã«é¢é£ããéåžžã«éèŠãªåé¡ãèŠéãå¯èœæ§ãããããã§ãã
ãã¹ã¿ãŒ
äœããããVoiceOverããªã³ã«ããŠæ¬åœã«ã¢ããªãè©Šãããšãã§ããèŠèŠé害è ãããå Žåã 幞éãªããšã«ãæãããã®ãããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³å šäœã調ã¹ãVoiceOverãããŸãæ©èœããªããã¹ãŠã®å Žæã«ã€ããŠè©³çŽ°ãªèª¬æãããŸããã ããããã¹ãŠã®æ¬ ç¹ãä¿®æ£ããããšãã§ããŸããã 圌ã¯åŒãç¶ãã¢ããªã±ãŒã·ã§ã³ã®å¯çšæ§ãæ¹åããã®ãæäŒã£ãŠãããŸããã
ãŠãŒã¶ãŒã±ã¢
VoiceOverã¯ãèŠèŠéããã®ãããŠãŒã¶ãŒåãã®çã«ã¢ã¯ã»ã¹å¯èœãªã¢ããªã±ãŒã·ã§ã³ãäœæã§ããé«åºŠãªãã¯ãããžãŒã§ãã
ãã¹ãŠã®Appleãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«çµã¿èŸŒãŸããŠãããã»ãŒãã®ãŸãŸäœ¿çšã§ããŸãã ãããã£ãŠãVoiceOverã䜿çšãããããã®ãµããŒãä»ãã®ã¢ããªã±ãŒã·ã§ã³ãéçºãããã«é¢ä¿ãªããVoiceOverã¯ã©ãã§ãåãã§äºæž¬å¯èœãªåäœãããŸãã
åªããVoiceOver察å¿ã¢ããªã¯ã2015幎ã®ã¯ãŒã¯ãããŒã§èµ·ãã£ãããã«ãiOSãã¶ã€ã³è³ãåè³ããããšãããããŸãã
ã¯ãŒã¯ãããŒã¢ããªã¯ãiOSã¢ã¯ã»ã·ããªãã£æ©èœã®åªãã䜿çšãç¹ã«æ確ã«ã©ãã«ä»ããããã¢ã€ãã ãææ ®æ·±ããã³ããããã³ãã©ãã°/ããããã¢ããŠã³ã¹ã¡ã³ããåããVoiceOverã®åªããå®è£ ã«ãããã¢ããªã䜿ããããè¿ éã«ã¢ã¯ã»ã¹ã§ããããã2015幎ã®Apple Design Awardã«éžã°ããŸããç®ã®äžèªç±ãªäººã匱èŠã®äººã«ã [2]
ããããããã¹ãŠã®ããŒã ãã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠåããã£ãŒãããã¯ãåãåããããšèããŠããŸãã ãŠãŒã¶ãŒãæ©èœã«é¢ä¿ãªããã¢ããªã±ãŒã·ã§ã³ã䜿ããããããããã«å¯èœãªéãã®ããšããã¹ãŠå®è¡ããŠãã ããã