Пользовательский арабский шрифт в iOS

Я пытаюсь создать приложение для iphone, которое отображает в основном контент на арабском языке. Я хочу использовать собственный арабский шрифт для отображения этого контента, а не арабский шрифт по умолчанию для iPhone. Я использовал следующий код:

- (void)viewDidLoad {
    [super viewDidLoad];
    [arabicLabel setFont: [UIFont fontWithName: @"Simple Indust Shaded" size: 20]];
    arabicLabel.text = @"السلام عليكم";
}

где arabicLabel — это UILabel IBOutlet. Я помещаю метку в ресурсы приложения и добавляю ее в файл info.plist как элемент массива UIAppFont. Также используется шрифт Unicode.

Когда я запускаю этот код на симуляторе, метка отображает арабский шрифт по умолчанию (не мой пользовательский шрифт); однако он установил свой размер равным 20, как указано в коде!

Я не понимаю, что я здесь сделал не так... Я знаю, что в файле info.plist я должен добавить имя файла шрифта с расширением (ttf), что я и сделал. Кроме того, я знаю, что в предыдущем коде мне нужно было указать фактическое имя шрифта, а не имя файла, поэтому я открыл файл на своем Mac и использовал заголовок, который появился при открытии файла (Simple Indust Shaded).

Я что-то упускаю? Существуют ли какие-либо дополнительные требования для пользовательских шрифтов, кроме Unicode?

NB: Я проделал ту же процедуру для пользовательского английского шрифта, и это сработало!...


person Thursday Moh    schedule 11.09.2010    source источник


Ответы (2)


Короткий ответ

Похоже, это ошибка в iOS.

Длинный ответ

Как вы, возможно, знаете, арабский текст должен быть сформирован до того, как его можно будет отобразить, что означает преобразование основных букв (Unicode:0600-06FF) на соответствующие им контекстные буквы (Unicode: FE70-FEFF).

iOS выполняет эту предварительную обработку автоматически для арабского текста, но по какой-то причине он забывает о пользовательском шрифте и просто использует системный шрифт по умолчанию при отображении связанных букв.

Итак, это ошибка в iOS, и вам следует подождать, пока она не будет решена.

Обходной путь

Однако, если вы не можете ждать, вы можете использовать этот обходной путь: Выполните предварительную обработку текста вручную перед рендерингом. Это позволит пропустить этап предварительной обработки iOS, который вызывает эту проблему, и, таким образом, отобразить текст с использованием вашего пользовательского шрифта.

Если вы хотите протестировать это решение, просто скопируйте следующую строку и попробуйте ее в своем проекте:

arabicLabel.text = @"ﺍﻟﺴﻼﻡ ﻋﻠﻴﻜﻢ";
person Hejazi    schedule 05.12.2010
comment
Можете ли вы рассказать нам больше об обходном пути? Я попытался добавить файлы arabicShaper, но не знаю, что делать дальше, иначе это позволит использовать любой пользовательский шрифт или только определенный? - person AmineG; 09.06.2011
comment
Что ж, вы должны вызвать функцию shape и передать строку, которую хотите отобразить, и она вернет сформированную строку, которую вы можете назначить arabicLabel.text. И да, это работает с большинством шрифтов, нет необходимости в пользовательских шрифтах. - person Hejazi; 11.06.2011
comment
Я думаю, что я также должен найти решение для преобразований между FriBidiChar и NSString.... - person AmineG; 11.06.2011
comment
@ кто-то0, у тебя получилось? Не могли бы вы поделиться некоторыми деталями? Например, как вы включили код предварительной обработки в приложение для iOS и какой шрифт вы использовали? - person Mustafa; 07.09.2011
comment
@ Мустафа, нет, я этого не делал. Наконец я использовал стандартный шрифт. - person AmineG; 07.09.2011
comment
Это очень плохо. Мне не везет с пользовательскими арабскими шрифтами. Интересно, как доступные приложения это делают!? - person Mustafa; 08.09.2011

ЭТОТ ОТВЕТ ДЛЯ НИЖЕ IOS 7.

Я также прошел через эту ситуацию, вы можете создать свой собственный метод хеш-карты для замены 0600-06ff char вашим собственным шрифтом, но для этого вам нужно проверить, сопоставлен ли ваш глиф в TTF с 0600-06FF, чем вам нужно изменить Unicode, отображаемый глифом ur, за исключением 0600-06ff

например, если я сделал TTF и сопоставил 'و' с unicode 0627, и когда я попытаюсь увидеть эффект от введенного unicode 0627 char, т.е. (когда я набираю 'ا', он должен показывать 'و'), он не будет применять мое пользовательское изображение против этого, потому что ios6 не позволит вам изменить глиф в определенном диапазоне. но если бы я сопоставил этот пользовательский символ с серией Fxxx или другой, чем 0600-06ff, это легко позволило бы мне внести пользовательские изменения

Арабский (0600–06FF, 255 символов) вы не можете воспроизвести этот диапазон или изменить изображение этого глифа на свое собственное изображение, поэтому ваш глиф сопоставляется с приведенным ниже арабским юникодом Дополнение к арабскому языку (0750–077F, 48 символов) Арабский расширенный-A (08A0—08FF, 39 символов) Формы представления на арабском языке-A (FB50—FDFF, 608 символов) Формы представления на арабском языке-B (FE70—FEFF, 140 символов)

вот ссылка на аналогичный тип вещей, сделанный с использованием пользовательского арабского класса, и я также получил от него помощь класс пользовательского арабского шрифта

person Community    schedule 13.01.2014