Что не так с отображением символов валют в iOS

Особое сочетание шрифтов и символов в iOS-приложениях снижает производительность приложения. Этой колонкой мы частично закроем вопрос. Оценить статью на сайте: 👍👎

Что не так с отображением символов валют в iOS

Что не так с отображением символов валют в iOS

Что не так с отображением символов валют в iOS, фотография 1

В июне 2016 года в App Store появилось разработанное нами приложение ИЛЬ-ДЕ БОТЭ. Клиент попросил нас использовать шрифт Carisma. R системным шрифтам платформы iOS он не относится, что можно понять после попытки найти его здесь. Работая над приложением, мы отметили, что символы валют, попадающие в диапазон от U+20B6 (символ турского ливра) до U+20BE (символ грузинского лари) и набранные шрифтом, не входящим в число системных, снижают производительность приложения. Символ рубля — как раз из указанного диапазона.

Найдите отличия:

currency-character-display-in-iOS.gif#as

Капитан выходит на связь

Экран справа лагает. Это заметно по показателю загруженности CPU.

Давайте-ка это обсудим.

Разберёмся подробнее, в каких именно ситуациях снижается производительность. Для этого разобьём представление строки с символом валюты на составные части:

  1. текст может содержаться в следующих сущностях: UILabel, UITextView и UITextField;
  2. в этих сущностях может использоваться обычная строка NSString и атрибутированная NSAttributedString;
  3. Для строки мы можем получить символ рубля одним из трёх способов:
    1. используя HTML:
    2. используя unicode:
    3. используя number formatter:

HTML

NSString *htmlString = @«<p>500 ₽</p> «; self.string = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUnicodeStringEncoding] options:@{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];

unicode

self.string = [[NSAttributedString alloc] initWithString: @«500 \u20BD»];

number formatter

NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [numberFormatter setCurrencyCode:@«RUB»]; [numberFormatter setMaximumFractionDigits:0]; self.string = [[NSAttributedString alloc] initWithString:[numberFormatter stringFromNumber:@500]];

Комбинируя сущности, можно заметить, что производительность снижают следующие сочетания:

  1. UILabel, тип строки: attributed, методы получения символа: 2 или 3;
  2. UITextView, тип строки: любой, методы получения символа: любой;
  3. UITextField, тип строки: любой, методы получения символа: любой.

Эксперимент заключался в измерении нагрузки на процессор при пролистывании списка, элементы которого содержали символ рубля. Средняя нагрузка на процессор для нормального состояния не превышала 10%, а если была проблема, нагрузка колебалась в районе 30–80%, что можно видеть на гифках.

symbols.png#asset:7364

На картинке обведены символы, с которыми наблюдается описанная проблема.

Чтобы приложение вело себя нормально, нужно избегать тех сочетаний, что выявили мы, или использовать для символов валют системный шрифт San Francisco, а также шрифты из семейства Helvetica Neue. Но это минимальные требования. Истинная же причина увеличения нагрузки осталась загадкой.

Cкиллы
Что нужно знать и уметь, чтобы работать iOS-разработчиком

Необходимый минимум знаний, которыми должен владеть начинающий iOS-разработчик

Cкиллы
23 сентября 2016
Что нужно знать и уметь, чтобы работать дизайнером в России

Лайв Тайпинг рекомендует книги, блоги, принципы, умения и всё, без чего не обойдётся ни один отечественный дизайнер

Cкиллы
31 июля 2017
Почему мобильные приложения делаются в первую очередь для iOS?

Владельцы айфонов поблагодарят вас за качественное приложение и быстрее окупят разработку. Это ли не повод сделать первую ставку на iOS-версию?

Клиентам
08 апреля 2018