iOS. Приемы программирования Нахавандипур Вандад

— (void) enumerateFonts{

for (NSString *familyName in [UIFont familyNames]){

NSLog(@"Font Family = %@", familyName);

}

}

Запустив эту программу в симуляторе, я получил примерно такие результаты:

Font Family = Thonburi

Font Family = Academy Engraved LE

Font Family = Snell Roundhand

Font Family = Avenir

Font Family = Marker Felt

Font Family = Geeza Pro

Font Family = Arial Rounded MT Bo Font Family = Trebuchet MS

Выстроив такой список семейств шрифтов, мы можем перечислить гарнитуры в каждом семействе. Будем пользоваться методом fontNamesForFamilyName: класса UIFont, а в ответ получим массив названий гарнитур из того семейства шрифтов, которое мы указали как параметр:

— (void) enumerateFonts{

for (NSString *familyName in [UIFont familyNames]){

NSLog(@"Font Family = %@", familyName);

for (NSString *fontName in

[UIFont fontNamesForFamilyName: familyName]){

NSLog(@"\t%@", fontName);

}

}

}

Запустив этот код в симуляторе iOS, получим:

Font Family = Thonburi Thonburi-Bold Thonburi

Font Family = Academy Eng AcademyEngravedLetPla

Font Family = Snell Round SnellRoundhand-Bold SnellRoundhand-Black SnellRoundhand

Итак, мы видим, что Thonburi — это семейство шрифтов, а Thonburi-Bold — одна из гарнитур этого семейства. Теперь, зная имя шрифта, мы можем загружать шрифты в объекты типа UIFont с помощью метода класса fontWithName: size:, относящегося к классу UIFont:

__unused UIFont *font = [UIFont fontWithName:@"Thonburi-Bold"

size:12.0f];

Если в результате работы метода класса fontWithName: size:, относящегося к классу UIFont, имеем nil, это означает, что найти шрифт с указанным именем не удалось. Убедитесь, что шрифт с заданным вами именем присутствует в системе. Для этого сначала перечислите все семейства шрифтов, а потом все названия гарнитур из каждого семейства.

Кроме того, можно воспользоваться методом экземпляра systemFontOfSize:, относящимся к классу UIFont (или его «жирным» аналогом, boldSystemFontOfSize:), для загрузки локальных системных шрифтов — где бы они ни находились — прямо на устройстве, где работает ваш код. Стандартный системный шрифт в iOS — Helvetica.

Загрузив шрифты, можете переходить к разделу 17.2. Там мы воспользуемся загруженными шрифтами для отрисовки текста в графическом контексте.

См. также

Раздел 17.2.

17.2. Отрисовка текста

Постановка задачи

Требуется рисовать текст на экране устройства с iOS.

Решение

Воспользуйтесь методом drawAtPoint: withFont: класса NSString.

Обсуждение

Для отрисовки текста можно воспользоваться очень удобными методами, входящими в состав класса NSString. Один из таких методов — drawAtPoint: withFont:. Но прежде чем продолжить работу, еще раз удостоверьтесь в том, что выполнили все инструкции из введения к этой главе. Теперь у вас должен быть объект-вид, являющийся подклассом от UIView. Он должен называться GraphicsViewControllerView. Откройте этот файл. Если закомментирован метод экземпляра drawRect:, относящийся к объекту-виду, то раскомментируйте его, чтобы включить этот метод в объект:

#import «View.h»

@implementation View

— (id)initWithFrame:(CGRect)frame{

self = [super initWithFrame: frame];

if (self) {

// Код инициализации

}

return self;

}

— (void)drawRect:(CGRect)rect{

}

@end

Именно в методе drawRect: будет происходить все рисование, как мы указывали ранее. Здесь мы можем приступать к загрузке шрифта, а потом нарисовать на экране простую текстовую строку, которая будет начинаться на уровне 40 по оси X и на уровне 180 по оси Y (рис. 17.6):

Рис. 17.6. Произвольная строка, нарисованная в графическом контексте вида

— (void)drawRect:(CGRect)rect{

UIFont *helveticaBold = [UIFont fontWithName:@"HelveticaNeue-Bold

size:40.0f];

NSString *myString = @"Some String";

[myString drawAtPoint: CGPointMake(40, 180)

withFont: helveticaBold];

}

В этом коде мы просто загружаем жирный шрифт Helvetica (кегль 40) и рисуем с его помощью текст Some String, который начинается в точке (40; 180).

17.3. Создание, установка и использование цветов

Постановка задачи

Требуется иметь возможность получать ссылки на цветовые объекты с последующим использованием этих объектов при рисовании различных форм в виде. К числу форм можно отнести текст, прямоугольники, треугольники и сегменты линий.

Решение

Воспользуйтесь классом UIColor.

Обсуждение

Во фреймворке UIKit программисту предоставляются высокоуровневые абстракции цветов, инкапсулированные в объекте UIColor. В этом классе имеются очень удобные методы класса, в частности redColor, blueColor, brownColor и yellowColor. Тем не менее, если вас интересует иной цвет, кроме тех, чьи параметры явно задаются как параметры этого метода класса UIColor, можно воспользоваться методом класса colorWithRed: green: blue: alpha:, относящимся к классу UIColor, и загрузить искомое цветовое значение. Возвращаемое значение этого метода относится к типу UIColor. Данный метод имеет следующие параметры:

• red — доля красного в конкретном оттенке. Это значение может находиться в диапазоне от 0.0f до 1.0f, где 0.0f полностью исключает красный компонент, а 1.0f дает максимально насыщенный темно-красный цвет;

• green — доля зеленого, смешиваемая с красным в цвете. Это значение также может находиться в диапазоне от 0.0f до 1.0f;

• blue — доля голубого, смешиваемая с красным и зеленым в цвете. Это значение также может находиться в диапазоне от 0.0f до 1.0f;

• alpha — матовость (непрозрачность) цвета. Это значение может находиться в диапазоне от 0.0f до 1.0f, где 1.0f делает цвет полностью матовым, а 0.0f — полностью прозрачным (иными словами, невидимым).

Имея объект типа UIColor, вы можете воспользоваться его методом экземпляра set, чтобы в текущем графическом контексте этот цвет использовался для рисования.

Можно применять метод класса colorWithRed: green: blue: alpha:, относящийся к классу UIColor, для загрузки основных цветов, например красного. Для этого параметру red просто сообщается значение 1.0f, а параметрам green и blue — значение 0.0f. Значение параметра alpha выбираете сами.

Взглянув на рис. 17.1, мы видим, что заданный по умолчанию цвет фона для созданного нами объекта-вида — серый, довольно некрасивый. Исправим это. Просто найдем метод экземпляра viewDidLoad контроллера вида GraphicsViewController и изменим фоновый цвет вида на белый, как показано здесь:

— (void)viewDidLoad{

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

}

Для отрисовки текста в текущем графическом контексте будем пользоваться методами экземпляра класса NSString, подробнее об этом — чуть позже.

Теперь загрузим в объект типа UIColor пурпурный цвет, а потом нарисуем в графическом контексте вида текст I Learn Really Fast, использовав для этого жирный шрифт Helvetica кегля 30 (о загрузке шрифтов рассказано в разделе 17.1):

— (void)drawRect:(CGRect)rect{

/* Загружаем цвет. */

UIColor *magentaColor =[UIColor colorWithRed:0.5f

green:0.0f

blue:0.5f

alpha:1.0f];

/* Задаем цвет в графическом контексте. */

[magentaColor set];

/* Загружаем шрифт. */

UIFont *helveticaBold = [UIFont fontWithName:@"HelveticaNeue-Bold"

size:30.0f];

/* Строка, которую требуется отрисовать. */

NSString *myString = @"I Learn Really Fast";

/* Рисуем строку выбранным шрифтом.

Цвет мы уже установили. */

[myString drawAtPoint: CGPointMake(25, 190)

withAttributes:@{

NSFontAttributeName: helveticaBold

}];}

Результат показан на рис. 17.7.

Рис. 17.7. Строка, отрисованная выбранным цветом в графическом контексте

Кроме того, мы можем воспользоваться методом экземпляра drawInRect: withFont:, относящимся к классу NSString, чтобы нарисовать текст внутри прямоугольной области. Текст будет растянут, чтобы он полностью занял отведенное пространство. Фреймворк UIKit даже позволяет переносить часть текста на следующую строку, если он не будет умещаться в отведенном прямоугольнике по горизонтали. Границы прямоугольной области инкапсулированы в структурах CGRect. Для создания границ прямоугольника можно использовать функцию CGRectMake:

— (void)drawRect:(CGRect)rect{

/* Загружаем цвет. */

UIColor *magentaColor = [UIColor colorWithRed:0.5f

green:0.0f

blue:0.5f

alpha:1.0f];

/* Задаем цвет в графическом контексте. */

[magentaColor set];

/* Загружаем шрифт. */

UIFont *helveticaBold = [UIFont boldSystemFontOfSize:30];

/* Строка, которую требуется отрисовать. */

NSString *myString = @"I Learn Really Fast";

/* Рисуем строку выбранным шрифтом.

Цвет мы уже установили. */

[myString drawInRect: CGRectMake(100, /* x */

120, /* y */

100, /* ширина */

200) /* высота */

options: NSStringDrawingUsesLineFragmentOrigin

attributes:@{

NSFontAttributeName: helveticaBold

}

context: nil];

}

Функция CGRectMake принимает четыре параметра:

• x — положение начала координат прямоугольника по оси X относительно графического контекста. В iOS это значение соответствует количеству точек, отсчитанному вправо от левой стороны прямоугольника;

• y — положение начала координат прямоугольника по оси Y относительно графического контекста. В iOS это значение соответствует количеству точек, отсчитанному вниз от верхней стороны прямоугольника;

• width — ширина прямоугольника в точках;

• height — высота прямоугольника в точках.

Результат выполнения кода показан на рис. 17.8.

Рис. 17.8. Отрисовка строки в прямоугольном пространстве

UIColor — это, в сущности, предоставляемая в UIKit оболочка для класса CGColor из фреймворка Core Graphics. Переходя к довольно низкоуровневому программированию — то есть на уровне Core Graphics, — мы неожиданно обретаем значительно более полный контроль над использованием цветовых объектов и даже можем определить цветовые компоненты, из которых состоит конкретный оттенок. Допустим, в каком-то другом коде вы получили объект типа UIColor и хотите определить, каковы содержащиеся в нем доли компонентов red, green, blue и alpha. Чтобы получить компоненты, из которых состоит объект UIColor, выполните следующие шаги.

1. Используйте метод экземпляра CGColor, относящийся к классу UIColor. В результате вы получите цветовой объект типа CGColorRef, представляющий собой ссылку на цветовой объект (Color Reference) — объект из фреймворка Core Graphics.

2. Применяйте функцию CGColorGetComponents для получения компонентов, составляющих цветовой объект.

3. При необходимости пользуйтесь функцией CGColorGetNumberOfComponents, чтобы определить количество компонентов, примененных для создания данного оттенка (красный + зеленый и т. д.).

Вот пример:

— (void) drawRect:(CGRect)rect{

/* Загрузка цвета */

UIColor *steelBlueColor = [UIColor colorWithRed:0.3f

green:0.4f

blue:0.6f

alpha:1.0f];

CGColorRef colorRef = [steelBlueColor CGColor];

const CGFloat *components = CGColorGetComponents(colorRef);

NSUInteger componentsCount = CGColorGetNumberOfComponents(colorRef);

NSUInteger counter = 0;

for (counter = 0;

counter < componentsCount;

counter++){

NSLog(@"Component %lu = %.02f",

(unsigned long)counter + 1,

components[counter]);

}

}

После запуска кода получим в окне консоли следующий вывод:

Component 1 = 0.30

Component 2 = 0.40

Component 3 = 0.60

Component 4 = 1.00

См. также

Раздел 17.1.

17.4. Отрисовка изображений

Постановка задачи

Требуется возможность отрисовывать изображения на экране устройства с iOS.

Решение

Используйте класс UIImage для загрузки изображения и относящийся к изображению метод drawInRect: для отрисовки картинки в графическом контексте.

Обсуждение

Фреймворк UIKit очень упрощает задачи, связанные с рисованием. Все, что от вас требуется, — загрузить ваши изображения в экземпляры типа UIImage. В классе UIImage содержатся разнообразные методы класса и экземпляра, предназначенные для загрузки изображений. Вот некоторые из наиболее важных:

• iNamed: (метод класса) — загружает изображение (если его удалось правильно загрузить, то и кэширует). Параметр этого метода — имя изображения в пакете, например Tree Texture.png;

• iWithData: (метод класса) — загружает изображение из данных, инкапсулированных в экземпляре объекта NSData, который был передан данному методу в качестве параметра;

• initWithContentsOfFile: (метод экземпляра (для инициализации)) — использует указанный параметр как путь к изображению, которое должно быть загружено. Применяется для инициализации объекта изображения;

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

• initWithData: (метод экземпляра (для инициализации)) — использует полученный параметр типа NSData для инициализации изображения. Эти данные должны относиться к валидному изображению.

Чтобы добавить изображение в ваш проект в Xcode, выполните следующие шаги.

1. Найдите, где именно расположено изображение на вашем компьютере.

2. Перетащите это изображение в категорию изображений, которая обычно называется is.xcassets. Всю остальную работу Xcode выполнит за вас.

Для того чтобы получить ярлык Xcode, выполните следующие шаги:

1) найдите приложение Xcode в обозревателе;

2) находясь в обозревателе (Finder), нажмите на Xcode сочетание Command+I, чтобы получить информацию о приложении;

3) щелкните на ярлыке в верхнем левом углу окна справки Xcode;

4) нажмите Command+C, чтобы скопировать ярлык;

5) откройте приложение для предварительного просмотра (Preview);

6) нажмите сочетание клавиш Command+V, чтобы вставить ярлык Xcode в новое изображение;

7) полученный файл ICNS с пятью отдельными страницами сохраните в формате PDF, а потом удалите все, кроме ярлыка с наиболее высоким разрешением (страница 1 файла ICNS).

В этом разделе книги мы нарисуем изображение в графическом контексте, чтобы продемонстрировать общий принцип отрисовки изображений. Я уже нашел нужный файл и перетащил это изображение в мою программу для iOS. Теперь в пакете приложения есть изображение под названием Xcode.png (рис. 17.9).

Рис. 17.9. Ярлык Xcode, находящийся в приложении Xcode

Вот код для отрисовки изображения:

— (void)drawRect:(CGRect)rect{

UIImage *i = [UIImage iNamed:@"Xcode.png"];

if (i!= nil){

NSLog(@"Successfully loaded the i.");

} else {

Страницы: «« ... 6667686970717273 ... »»

Читать бесплатно другие книги:

Рассмотрены основы информатики и описаны современные аппаратные средства персонального компьютера. С...
Молодые парни из экстремистской организации «Русский трибунал» объявили партизанскую войну «предател...
Покончив с несчастливым браком, Грейс решила, что больше никогда не доверится мужчине и не поставит ...
Лиз Сазерленд только мечтала о том, чтобы черная полоса ее жизни когда-нибудь сменилась белой. Пробл...
В старину ставили храмы на полях сражений в память о героях и мучениках, отдавших за Родину жизнь. Н...
В учебном пособии представлены вариативные авторские методики воспитания и развития волевых качеств ...