- Comment desactiver voice over sur iphone 3gs
- VoiceOver на iOS: решение типовых проблем
- Контролов измени порядок
- Сгруппируй через shouldGroupAccessibilityChildren
- Укажи первый элемент для фокусировки
- Типы оповещений для объектов
- Модальные окна показывай нативно
- Выровняй невидимые фреймы
- Подытожь главное действие
- И не забудь подписать индикатор загрузки
- VoiceOver на iOS: каждый контрол ведёт себя по-разному
- Особенности элементов управления — Trait collection
- Тип контрола
- Состояние контрола
- Особые свойства контролов
- Настраиваем могучий трейт .adjustable
- Заключение
Comment desactiver voice over sur iphone 3gs
Дисплей
LCD-дисплей устройства был разработан Apple и производился LG. Плотность дисплея составляет 163 ppi при диагонали экрана в 3,5 дюйма. Разрешение дисплея составляет 320×480 пикселей. В отличие от предшественника экран может передавать более насыщенные цвета. В изменения также входит жироотталкивающее покрытие, предназначенное для уменьшения загрязнения поверхности экрана. Дисплей управляется пальцами.
Камера
В iPhone 3GS встроена 3-мегапиксельная камера производства OmniVision. Камера имеет автофокус, автоматический баланс белого и способность снимать VGA-видео. В приложении «камера» появился ползунок позволяющий пользователям переключаться между фото и видео. При «тапе» по экрану камера фокусируется на это место, также есть возможность 5-ти кратного цифрового зума (iOS 4 и iOS 5). в iOS 5 появилась возможность блокировать автофокусировку и автоэкспозицию при удерживании пальца.
Процессор и оперативная память[править | править исходный текст]
iPhone 3GS работает на чипе Samsung APL0298C05, разработанный и произведённый компанией Samsung. Он состоит из центрального процессора ARM Cortex-A8 с частотой 833 МГц (программно занижено до 600 МГц) и графического процессора PowerVR SGX 535. iPhone 3GS оснащён 256 МБ оперативной памяти, что вдвое больше чем у iPhone 3G. Благодаря этому производительность увеличена и появилась поддержка многозадачности (после обновления операционной системы до iOS 4).
Флеш-память
Как и все модели iPhone он содержит встроенную флеш-память, не имея при этом слотов расширения. Первоначально были выпущены 16 GB и 32 GB варианты iPhone 3GS. Позже с релизом iPhone 4 была выпущена 8 GB модель, и вместе с этим прекратилось производство 16 GB и 32 GB моделей.
Питание и аккумулятор
iPhone 3GS оснащен внутренним 3,7 В 1219 мАч литий-ионным полимерным аккумулятором и способен сохранять до 80 % батареи после 400 полных циклов зарядки и разрядки. Индикатор заряда батареи в процентах был эксклюзивно для iPhone 3GS (Позже было включено в следующие поколения смартфона). Apple утверждает, что аккумулятор iPhone 3GS способен работать до 10 часов при просмотре видео, 9 часов просмотра веб-страниц через Wi-Fi. 12 часов в режиме разговора по сетям 2G, 5 часов в сетях 3G, 30 часов прослушивания музыки и 300 часов в режиме ожидания.
Магнитометр[править | править исходный текст]
Магнитометр, встроенный в iPhone 3GS используется для измерения силы и/или направления магнитного поля по отношению к устройству. Иногда радиосигналы вызывают помехи, в результате чего требуется выполнить повторную калибровку компаса (прорисовав в воздухе восьмёрку). В iOS встроено приложение «Компас», указывающее направление на северный полюс.
Сети
В дополнение трёхдиапазонной UMTS/HSDPA связи и четырёхдиапазонной GSM/GPRS/EDGE связи в iPhone 3G, в 3GS также имеется поддержка HSDPA связи со 7.2 Мбит скоростью загрузки.
Голосовое управление
Голосовое управление (Voice Control) введённая исключительно для iPhone 3GS функция (позже была введена в следующие поколения iPhone). Она позволяет звонить, управлять музыкой и использовать FaceTime с помощью голоса. Включалась двойным нажатием кнопки «Home» в iOS 3, после iOS 4 включается удержанием кнопки «Home» (двойное нажатие вызывает панель многозадачности).
Функции для людей с ограниченными возможностями
VoiceOver, инверсия цвета и Text Zoom были представлены как эксклюзивные функции iPhone 3GS. VoiceOver — функция, проговаривающая информацию об играющей музыке, диктующая текст и другие вещи представленные в iPod shuffle третьего поколения. Цветовая инверсия инвертирует цветовую гамму, а Text Zoom увеличивает размер шрифта на экране.
Источник
VoiceOver на iOS: решение типовых проблем
Когда берёшься адаптировать приложение для незрячих, часто что-то идёт не так: то порядок собьётся, то фокус не туда встанет. С другой стороны, есть UX, который легко пропустить, потому что не знаешь про возможные проблемы. В этой статье будем разбираться с типовыми проблемами и их решением.
Адаптация iOS-приложения — большая тема, в одну статью всё не влезло, поэтому выпускаю их серией.
В первой части мы разбирались с адаптацией приложений для незрячих с помощью VoiceOver: подписали контролы, сгруппировали их, исправили навигацию. Во второй части мы пошли дальше и рассмотрели «особенности», которые можно дать контролам, чтобы улучшить их работу для незрячих людей и в целом повысить удобство использования приложения.
Сегодня мы продолжим работу по адаптации экрана с пиццей: изменим порядок обхода, подытожим информацию о покупке, поправим модальное окно и улучшим индикатор загрузки.
Контролов измени порядок
Экран скролится, а кнопки находятся над UIScrollView . Получается так, что VoiceOver сначала пытается обойти все элементы внутри UIScrollView и только потом находит верхние кнопки. Для пользователя такое поведение VoiceOver будет неправильным: кнопки же находятся наверху, значит перебор и озвучивания должно начинаться с них.
Чтобы приступить к настройке, сначала разберёмся, как VoiceOver определяет порядок контролов. Делает он это так: берёт элементы из свойства accessibilityElements . По умолчанию там оказываются все view , у которых isAccessibilityElement = true .
Теперь мы сможем поставить кнопки в начало, переопределив accessibilityElements :
Сгруппируй через shouldGroupAccessibilityChildren
Обычно VoiceOver старается прочитать элементы в естественном порядке — слева направо, сверху вниз:
Если вы сгруппировали контролы, то вам нужно, чтобы VoiceOver переходил к ближайшему элементу в группировке, а не по порядку чтения. Поставьте .shouldGroupAccessibilityChildren = true , и порядок начнёт учитывать близость элементов. Свойство нужно ставить родительской view для всех элементов.
Укажи первый элемент для фокусировки
Другая проблема порядка чтения — при открытии экрана VoiceOver первым делом выбирает левый верхний элемент. Чаще всего это кнопка «Назад». С одной стороны, это позволяет быстро вернуться на предыдущий экран, если ошиблись. С другой стороны, так мы теряем понимание того, на каком экране оказались. Поправить ситуацию можно, если вручную выставить фокус на нужный контрол.
А как Эпл делает?
Странно, что UINavigationController ставит фокус на кнопку «Назад», мог бы сам ставить на заголовок открывшегося экрана. Со стороны удобства мне кажется правильным ставить фокус на тайтл или первый контрол, так мы даём больше информации о новом экране. Вернуться назад можно жестом скрабл.
Переставлять фокус можно с помощью функции оповещений UIAccessibility.post(notification: …) . Она принимает два параметра:
- Один из видов UIAccessibility.Notification .
- Объект, к которому надо применить оповещение. Чаще всего это строка с текстом или объект, который надо выделить после оповещения.
Поставить фокус на заголовок можно во viewDidLoad:
Передать можно объект, на который надо поставить фокус или текст, который надо произнести.
Типы оповещений для объектов
- .screenChanged — для больших изменений, когда показывается новый экран. Именно из-за него при открытии экрана фокус встаёт на первый элемент экрана.
- .layoutChanged — для меньших изменений на экране. Например, вы вводили данные карты, и после валидации кнопка «Оплатить» становится доступной.
- .announcement — для проговаривания текста. Подойдёт для обозначения ошибок или дополнительных пояснений. Плохо работает после действий пользователя, потому что в этот момент проговаривается только что нажатая кнопка. Но можно немного отложить по времени, тогда всё сработает.
Модальные окна показывай нативно
При работе с VoiceOver могут (и будут) выстреливать все косяки, допущенные в разработке. Например, мы делали ленту сообщений и, чтобы сообщения начинались снизу, решили перевернуть UITableView , а потом перевернуть все ячейки. Визуально всё в порядке, но список скролится вверх ногами тремя пальцами в VoiceOver.
Ещё мы столкнулись с проблемой, что никак не удавалось изменить ингредиенты, потому что на окно не получалось поставить фокус. Так случилось, потому что мы показывали вьюшку, а не UIViewController со специальным UIPresentationController. VoiceOver обращается к .firstResponder , а наша view им не была.
Если времени на переписывание нет, то можно для view поставить свойство accessibilityViewIsModal . Тогда VoiceOver будет фокусироваться только на этом view .
Выровняй невидимые фреймы
Порядок чтения считается по фреймам, иногда это даёт неожиданные результаты. Например, мы увеличили фрейм кнопки «i», чтобы было проще нажимать. Но он оказался выше фрейма названия пиццы, поэтому первым элементом фокуса оказалась кнопка «i». Даже несмотря на то, что она маленькая, находится справа и в целом не так важна.
Можно поменять порядок чтения через accessibilityElements , но я покажу другой способ. VoiceOver использует свойство accessibilityFrame , просто по умолчанию оно совпадает с обычным фреймом. Тут есть несколько решений:
- Переопределить сабкласс контрола и возвращать уменьшенное значение.
- Выставить правильный фрейм снаружи.
- Просто поправить фрейм, чтобы он был вровень с надписью.
Но важно, чтобы этот фрейм был в координатах экрана. Для простой конвертации есть функция UIAccessibility.convertToScreenCoordinates .
Её же можно использовать для объединения контролов. Например, нужно объединить свитчер и его подпись, так элемент станет крупнее, на него будет легче нажимать, уйдёт ненужное дублирование.
Ещё я сделал фокус крупнее с помощью .inset , так удобней нажимать.
С помощью фрейма и AccessibilityContainer можно делать доступными графики и таблицы.
Подытожь главное действие
Это уже больше про UX, но всё равно расскажу. Человек с нормальным зрением легко считает с экрана все настройки, но незрячему для этого надо вручную перебрать все контролы. Можно облегчить процесс и просуммировать все изменения в кнопке «Купить».
Например, чтобы получилось «Купить, кнопка. Добавили бекон, убрали Халапеньо. Цена 434₽», в коде не нужно писать ничего необычного, только собрать строчку с добавили/убрали:
И не забудь подписать индикатор загрузки
Если после добавления продукта в корзину вы ненадолго блокируете интерфейс и что-то загружаете, не забудьте сделать доступным индикатор загрузки:
- С помощью оповещения поставьте фокус на индикатор.
- Дайте фокусу название. Например, загружается.
- Поставьте accessibilityViewIsModal .
- Дайте знать, когда загрузка закончится.
Если после загрузки вы показываете новый экран, то VoiceOver сам переключит фокус, так станет понятно, что загрузка закончилась. В случаях посложнее можно явно сказать об этом или даже добавить вибрацию.
А как Эпл делает?
Интересно с этим работает Safari в iOS 13: во время загрузки страницы он каждую секунду издает щелчок, а когда страница загрузилась делает *вуп-туп*. Увы, со стороны апи это пока недоступно, ждём iOS 14.
Для адаптации экрана мы использовали разные подходы: поменяли порядок кнопок, указали первый элемент для фокуса, починили модальное окно, суммировали настройки на главной кнопке и поработали над удобством приложения. Этих знаний хватит, чтобы адаптировать почти любое приложение. Дерзайте.
В следующий раз расскажу про разницу между реализацией VoiceOver, Voice Control и UI тестов.
Чтобы не пропустить следующую статью, подписывайтесь на мой канал Dodo Pizza Mobile.
Источник
VoiceOver на iOS: каждый контрол ведёт себя по-разному
Привет, Хабр! Недавно я говорил про адаптацию приложений для незрячих и неподвижных людей. И не договорил!
Сегодня расскажу, как изменить поведение контролов с помощью accessibilityTraits и сделать жизнь незрячих чуть удобней. Знать работу этих трейтов (traits) важно, чтобы не писать свои костыли.
Адаптация iOS-приложения — большая тема, в одну статью всё не влезло, поэтому выпускаю их серией.
- Voice Control и VoiceOver: как адаптировать приложение для незрячих или неподвижных.
- VoiceOver на iOS: каждый контрол ведёт себя по-разному.
- VoiceOver на iOS: решение типовых проблем.
- Разница между реализацией VoiceOver, Voice Control и UI тестов. (In progress)
В первой части мы начали разбираться с адаптацией приложений для незрячих с помощью VoiceOver: подписали контролы, сгруппировали их, исправили навигацию. В этой статье пойдём дальше и рассмотрим «особенности», которые можно дать контролам, чтобы улучшить их работу для незрячих людей и в целом повысить удобство использования приложения.
Особенности элементов управления — Trait collection
VoiceOver имеет стандартный набор «особенностей» UITraitCollection , которые вы можете применять к контролам. Важно знать о них заранее, чтобы не придумывать своих решений. Я поделил их на три типа:
Тип контрола
VoiceOver знает про несколько базовых типов элементов. Часть из них уже настроена в вашем проекте, но всё равно расскажу про них.
Типы контролов используются для навигации: по ним можно быстро перемещаться с помощью ротора.
- .staticText — для надписей, которые не меняются. Текст просто прочитается.
- .header — заголовок: Добавить в пиццу, заголовок.
- .button — кнопка. Основной способ подписывать активные контролы: Изменить состав, кнопка.
- .image — картинка.
- .link — ссылка. Редкий гость в приложениях, частый на сайтах.
- .searchField — поиск.
Смотрим на примере:
- Указываем заголовок. .staticText ставится автоматически для всех надписей, а вот .header для заголовка нужно поставить вручную. При этом нужен и .header и .staticText .
- Отмечаем место под картинку. В прошлый раз все маленькие картинки мы скрыли от VoiceOver, информативность не потеряли. В этот раз картинка большая, ее так просто не скрыть: место станет пустым, это странно. Помечаем картинку как .image и подписываем .accessibilityLabel = «Пицца Пепперони Фреш с перцем» .
Конечно, кнопки закрытия и корзины надо подписать, об этом было в прошлой статье.
Состояние контрола
У контрола может быть три состояния: обычный, выбранный и отключенный. Интересно, что произносятся они в разное время и могут быть выбраны одновременно:
- .selected — добавляет «выбрано» перед названием контрола. Подходит для всех свитчеров и чекбоксов.
- .notEnabled — добавляет «недоступно». Эта настройка не видна в Interface Builder и управляется только программно.
Пример с добавлением топпингов в пиццу:
С помощью состояний можно объяснить пользователю, что топпинг добавлен. Удобно поправить прямо внутри ячейки. accessibilityTraits это OptionSet , поэтому к нему можно применять методы вставки .formUnion и удаления .formIntersection :
Особые свойства контролов
Есть ещё несколько необычных свойств. В нашем случае к экрану с пиццей они не подходят, но я всё равно расскажу про них, потому что информации о них мало. Возможно, это сэкономит вам время.
- .summaryElement — первое, что скажет приложение после запуска. Например, приложение погоды после запуска может сразу рассказать о температуре, а музыкальный плеер расскажет о включенной песне и исполнителе. В нашем случае можно говорить статус доставки, если заказа уже оформлен.
- .updatesFrequently — штука для таймеров. Новое значение будет проговариваться раз в несколько секунд.
- .causesPageTurn — скролит после прочтения. Вызовется accessibilityScroll(.next) у того контрола, который сможет это обработать. Смотрит по .firstResponder .
- .startsMediaSession — обычно VoiceOver повторяет название нажатой кнопки, чтобы подтвердить действие. Это мешает, если контрол проигрывает звук. Включите этот трейт, чтобы VoiceOver не повторял название контрола.
- .playsSound — стоит включить, если вы проигрываете собственный звук при фокусировании на контроле (если я всё правильно понял, сам ни разу не использовал).
- .allowsDirectInteraction — для рисования и обработки жестов. Контрол сразу обрабатывает касание, будто VoiceOver выключен.
- .keyboardKey — контрол начинает реагировать, как кнопка на клавиатуре. У VoiceOver есть несколько режимов ввода текста для таких случаев:
— standart typing — как простая кнопка в VoiceOver: сначала наведите фокус на букву, а затем нажмите дважды в любом месте, чтобы написать её. Набирать можно быстрее двумя руками: одним пальцем водить по клавиатуре (буквы будут озвучиваться) и касаться другим пальцем, чтобы подтвердить выбор клавиши.
— touch typing — однорукий ускоренный набор: водите пальцем по клавиатуре, чтобы озвучить кнопки. Отпустите палец, чтобы написать букву.
— direct touch typing — как обычный набор, будто VoiceOver выключен.
Видео про разные способы ввода:
Достаточно поставить галочку в IB, чтобы добавить поведение. С трейтом .adjustable так просто не получится, о нём отдельно.
Настраиваем могучий трейт .adjustable
И последний, особенно важный трейт .adjustable — элемент, который можно регулировать: так работают UIStepper и UISlider . Свайпните такой контрол вверх или вниз, чтобы изменить значение (не забывайте, что свайп влево/вправо переключит фокус на соседний элемент). Если у контрола есть UIPanGestureRecognizer, то можно тапнуть дважды и задержать второй тап, так жест сработает и можно управлять им напрямую, будто VoiceOver выключен.
Примеры применений для .adjustable :
Переключатель теста. Настройка теста состоит из пяти кнопок: три для выбора размера пиццы и две для типа теста. Их стоит сгруппировать и подписать, чтобы вместо пяти осталось две: «Размер, средний. Элемент регулировки» и «Тесто, традиционное. Элемент регулировки».
Нужно сделать в 4 шага:
- Сделать контейнер с кнопками доступным.
- Поставить трейт .adjustable .
- Реализовать методы увеличения и уменьшения.
- Возвращать новое значение для .accessibilityValue .
Теперь после свайпа вверх вызовется accessibilityIncrement() , вы увеличите внутренний счётчик, и VoiceOver прочитает новое значение из accessibilityValue.
Счетчик количества всего на свете. В данном блоке мы видим четыре контрола: кнопка минус, количество, кнопка плюс и цена. Можно объединить их в одну view и превратить в один контрол: «Количество, 1, 575 рублей. Элемент регулировки». После вертикального свайпа изменится количество, а затем произнесётся новое значение вместе с ценой.
Горизонтальные UICollectionView . Оказалось, что .adjustable удобно применять и для горизонтальных UICollectionView . Например, выбрать акцию в меню или машину в такси.
Заключение
В этот раз мы разобрали трейты: их типы, состояния и поведение. Это стандартный набор для типовых задач. Для сложных контролов можно использовать .adjustable.
В следующий раз посмотрим на решение типовых проблем: порядок обхода, модальные окна, индикаторы загрузки.
А ещё у нас сейчас открыта одна вакансия в мобильном направлении. Так что я просто оставлю это здесь: Senior iOS Developer (Нижний Новгород).
Источник