16 февр. 2014 г.

NSAffineTransform аффинные преобразования


Класс NSAffineTransform предоставляет методы для создания, объединения и применения аффинных преобразований. Преобразование определяет, как точки в одной системе координат трансформируются в точки в другой системе координат. Аффинное преобразование — особый тип преобразования, которое сохраняет параллельные линии в трансформируемом контуре, но не обязательно сохраняет длины или углы. Масштабирование, вращение и перенос являются наиболее часто используемыми действиями, поддерживаемыми аффинными преобразованиями, но также возможен и сдвиг объектов.
Методы класса:

Создание объекта NSAffineTransform
Название
Описание
+ transform
Создает и возвращает новый объект NSAffineTransform инициализированный единичной матрицей.
- initWithTransform:
Инициализирует матрицу текущего объекта с помощью другого объекта transform и возвращает текущий объект.

Накопительные преобразования

Название
Описание
- rotateByDegrees:
Применяет коэффициент поворота (измеряется в градусах) к матрице преобразования текущего объекта.
- rotateByRadians:
Применяет коэффициент поворота (измеряется в радианах), к матрице преобразования текущего объекта.
- scaleBy:
Применяет указанный коэффициент масштабирования для осей x и y к матрице преобразования текущего объекта.
- scaleXBy:yBy:
Применяет коэффициенты масштабирования для каждой оси матрицы преобразования текущего объекта.
- translateXBy:yBy:
Применяет указанный коэффициент переноса к матрице преобразования текущего объекта.
- appendTransform:
Добавляет заданную матрицу к матрице текущего объекта.
- prependTransform:
Добавляет заданную матрицу к матрице текущего объекта.
- invert
Инвертирует матрицу текущего объекта.

Преобразование данных и объектов

Название
Описание
- transformPoint:
Применяет преобразование текущего объекта к указанному объекту NSPoint и возвращает результаты.
- transformSize:
Применяет преобразование текущего объекта к указанному объекту NSSize и возвращает результаты.

Доступ к структуре трансформации


Название
Описание
- transformStruct
Возвращает матричные коэффициенты, хранящиеся в матрице текущего объекта.
- setTransformStruct:
Заменяет значения коэффициентов матрицы преобразования текущего объекта указанными значениями.

15 февр. 2014 г.

Урок по работе с NSTableVIew. Добавление данных

Для пользователя очень важно, чтобы данные были представлены в удобном виде. В этой статье мы рассмотрим как создается табличное представление данных в OS X. Урок предназначен для тех кто уже более-менее знаком с Objective-C, и протоколами. Для начала создадим новый проект в Xcode (Cocoa). Назовем его, например, TableViewAddDataTest. Добавим на нашу форму TableView контрол. Выставим размеры согласно нашей форме (окну).



Установим количество колонок в таблице равным 1-й (Attribute Inspector -> Columns). Дальше заходим в Connections Inspector и соединяем (делаем связь) нашему аутлету dataSource и делегату delegate с AppDelegate.

А теперь о главном. "Нельзя просто так взять и добавить строчку в таблицу напрямую", проще всего и быстрее будет пакетная передача объектов таблице, что чаще в роли пакетов объектов выступают массивы, в нашем случае NSArray (для одной колонки).

И так - поехали. В наш хидер-файл AppDelegate.h добавим протокол (делегат), объявим наш массив dataArray и объект myTableView через который будем работать с таблицей и будем использовать методы NSTableView класса:

//
//  AppDelegate.h
//  TableViewAddDataTest
//
//  Created by Sergey Krasiuk on 15.02.14.
//  Copyright (c) 2014 Sergey Krasiuk. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, NSTableViewDataSource>
{
    NSArray *dataArray;
    NSTableView *myTableView;
}

@property (assign) IBOutlet NSWindow *window;

@end

Главное что нужно помнить при работе с табличным представлением, это - два обязательных метода, без которых в таблице не появятся данные:


//  Нужно передать табличному представлению количество строк
//  для отображения данных, в нашем случае это колличество элементов в массиве.
- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView


//  Возвращает объект (данные которые будут отображаться в строке)
//  для каждой строчки row нашего табличного представления
- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

А теперь понятным языком. В первый метод мы должны передать количество объектов в нашем массиве. На основе этого в таблице будет выделена память под каждую строчку:


- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView
{
    return [dataArray count];
}

Следующий шаг. Мы должны передать для каждой строчки таблицы данные которые хранятся в нашем массиве. Т.е. человеческим языком индекс строки row будет равен индексу элемента нашего массива данных. В нашем случае мы передадим объекты типа NSString для каждой строки:


- (id) tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
    NSString *arrayString = [dataArray objectAtIndex:row];
    return arrayString;
}


Проинициализируем наш массив (заполним его данными), т.к. пока что передавать нам в таблицу нечего (лучше всего инициализацию делать в методе init (в нашем случае), не в applicationDidFinishLaunching, при запуске массив не успеет заполнится данными и мы в таблице ничего не получим):


- (id) init
{
    self = [super init];
    
    if (self)
    {
        dataArray = [[NSArray alloc] initWithObjects:@"Первая строка", @"Вторая строка", @"Третья строка", @"Четвертая строка", @"Пятая строка", @"Шестая строка", nil];
    }
    
    return self;
}

Запускаем наш проект, и должно получится вот такое:
Нюанс в добавлении или удалении элементов (строк) из таблицы состоит в том чтобы вычислить выделенный объект (строку таблицы) и получить его индекс. Потом удалить/добавить объект под этим индексом из/в массива и вызвать в том же методе (в котором удаляем/добавляем объекты из массива) reloadTable. Табличное представление обновит данные из массива и покажет нужный результат:

- (void) tableViewSelectionDidChange: (NSNotification *) notification

Удачи в начинаниях. Еще один из примеров NSTableView


14 февр. 2014 г.

@property свойства класса


Ключевое слово @property позволяет объявить свойства класса в языке Objective C. По своей сути свойства являются средством написания кода, позволяющим удобно обращаться к полям класса, не нарушая принципа инкапсуляции и не используя синтаксис вызова методов. Свойства не обязательно должны базироваться на полях класса. Они могут, например, вычисляться во время каждого вызова. Основной смысл использования свойств – более удобный синтаксис в сравнении с обычными вызовами методов. Возможность использовать свойства появилась в языке Objective C начиная с версии 2.0. Для лучшего понимания принципов работы свойств рассмотрим несколько примеров. Предположим, у нас есть класс Car, содержащий поле speed для хранения скорости автомобиля. Тогда объявление этого класса будет выглядеть так:
@interface Car : NSObject
{
double speed;
}
-(double) getSpeed;
-(void) setSpeed:(double)s;
@end
Сообщения getSpeed и setSpeed позволяют читать и изменять закрытое поле speed, реализовывая принцип инкапсуляции. Реализация данного класса может выглядеть следующим образом:
@implementation Car
-(void) setSpeed:(double)s
{
if ( s>=0 )
{
speed = s;
}
}
-(double) getSpeed
{
return speed;
}
@end
Создание экземпляра этого класса и использование поля могут быть такими:
Car *car = [[Car alloc] init];
[car setSpeed:105];
NSLog(@"%f", [car getSpeed]);
[car release];
На приведенном выше примере можно увидеть, что чтение значений из полей класса и занесение новых значений синтаксически не очень удобно. Гораздо удобнее было бы напрямую обратиться к полям класса при помощи оператора -> Но тогда поля класса пришлось бы сделать открытыми и было бы невозможно контролировать значения, заносимые в поля. Применение свойств как раз и должно решить эту проблему. С использованием ключевого слова @property объявление класса примет такой вид:
@interface Car : NSObject{ double speed;} @property double speed; @end
Как видно из примера, при объявлении свойства указывается тип свойства и в данном случае он совпадает с типом поля класса. Так же Objective C допускает одинаковые названия свойств и полей классов. С учётом сделанных изменений, реализация класса будет такой:
@implementation Car
@synthesize speed;
@end
Упрощение кода в данном случае заметить не трудно. Мы просто убрали реализацию методов доступа к полю speed и заменили её на автоматическую генерацию поля при помощи ключевого слова @synthesize. Теперь попробуем воспользоваться созданным свойством:
Car *car = [[Car alloc] init];
car.speed = 45.5;
NSLog(@"%f", car.speed);
[car release];
Вот ради чего всё затевалось. Теперь мы можем обращаться к полю класса при помощи удобного оператора “точка”. В этом и есть основной смысл свойств. Но в этом коде всё ещё есть проблемы. Дело в том, что в поле speed можно запросто занести отрицательные значения. И данное автоматически сгенерированное свойство никак не может этому помешать. Такая реализация свойства не очень-то и полезна для класса Car. Поэтому переделаем реализацию, добавив в неё аксессоры для доступа к полю.
@implementation Car
-(void) setSpeed:(double)s
{
if(s>0) speed = s;
}
-(double) speed
{
return speed;
}
@end
Теперь свойство не позволит заносить в поле класса отрицательные значения. Несмотря на то, что кода стало больше, свойство защищает поле класса от некорректных значений. На примере можно увидеть, что имя метода, возвращающего значение, совпадает с именем свойства, а имя метода, записывающего новые значения почучается добавлением слова set в начало имени метода, название свойства начинается с большой буквы. В принципе, названия методов-аксессоров можно изменить. Для этого придётся внести изменения в объявление свойства:
@interface Car : NSObject
{
double speed;
}
@property (getter = getSpeed, setter = setSpeed:) double speed;
@end
После таких изменений объявления свойства метод, возвращающий значение свойства должен называться getSpeed, а метод задающий значение свойства, должен называться setSpeed.

Программирование на Objective-C. Урок 15

Програмирование на Objective-C. Урок 15

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 14

Програмирование на Objective-C. Урок 14

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 13

Програмирование на Objective-C. Урок 13

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 12

Програмирование на Objective-C. Урок 12

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

Программирование на Objective-C. Урок 11

Програмирование на Objective-C. Урок 11

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)

NSString - работа со строкой

Класс NSString предоставляет возможность работы с неизменяемой строкой, которая представлена в виде массива символов в кодировке Unicode. Такая строка может быть однажды создана, но не может быть изменена всё время своего существования. Представление строк в виде объектов даёт возможность использовать большое количество методов для обработки строк, а также позволяет использовать строки везде, где можно использовать объекты Objective C. Объекты NSString могут быть легко получены на основе строк языка С, и наоборот, на основе объекта NSString можно получить строку C, заканчивающуюся символом с кодом 0. Для эффективной работы с изменяемыми строками следует пользоваться объектами класса NSMutableString.

Основные методы класса:



НазваниеОписание
uppercaseStringВозвращает строку, полученную из указанной путём перевода букв в верхний регистр
lowercaseStringВозвращает строку, полученную из указанной путём перевода букв в нижний регистр
capitalizedStringВозвращает строку, полученную из указанной путём перевода первых букв всех слов в верхний регистр
isEqualToStringПроверяет равенство двух строк
compareСравнивает две строки
stringWithCStringСоздаёт объект объект NSString на основе стандартной строки языка С
rangeOfStringВозвращает диапазон символов первой указанной строки, в который входит вторая указанная строка
componentsSeparatedByStringВозвращает объект NSArray, содержащий строки, полученные разделением указанной строки указанным строковым разделителем
componentsJoinedByStringВозвращает строку, полученную объединением массива строк
intValueПытается преобразовать строку в целое число и возвращает это число
doubleValueПытается преобразовать строку в число с плавающей запятой и возвращает это число
integerValueПытается преобразовать строку в объект NSInteger и возвращает этот объект
UTF8StringВозвращает строку языка С, полученную из указанного объекта NSString

Примеры использования:


Язык Objective C полностью поддерживает строки языка C. Вы можете в любой момент создать такую строку через указатель, а так же использовать средства языка С для обработки таких строк. Создать простую строку языка С можно так:

char * cString = "Hello world";

Каждая такая строка – это массив букв, который заканчивается символом с кодом 0. Вот ещё один способ создания строки языка С:
char cString[] = "Another string";
Основной недостаток строк в языке С – неудобство работы с ними. Существует много функций для обработки таких строк, но многие из них не так удобны, как хотелось бы и они часто работают напрямую с указателями на символы строк. Это может потенциально привести к ошибкам в работе со строками, поэтому в языке Objective C был предложен новый класс для работы со строками. Класс NSString содержит большое количество удобных и мощных методов для решения многих задач, возникающих при работе со строками. Для того, чтобы воспользоваться в программе объектом строки вовсе необязательно писать сложный код. Можно воспользоваться вот таким способом:
@"A constant Objective C string object";
Если вы хотите вывести объект NSString в консоль, можно воспользоваться форматированным выводом при помощи функции NSLog. В данном случае эта функция будет принимать 2 строки: первая – строка формата, вторая – строка параметра. В строке формата символы %@ будут заменены на строку параметра, после чего результирующая строка будет выведена в консоль.
NSLog (@"%@", @"This is a constant character string object");
Строки, созданные таким образом, являются объектами NSConstantString, который наследует от класса NSString и для них легко можно вызвать различные методы. Например, можно получить длину строки при помощи метода length:
int len = [@"Hello big world!" length];
NSLog (@"Length = %i", len);
Объект NSString позволяет управлять регистром букв в строке для этого есть несколько методов. Например, при помощи метода lowercaseString строку можно преобразовать в нижний регистр:
NSString *lowerStr = [@"SAMPLE STRING" lowercaseString];
NSLog(@"%@", lowerStr);
Строки можно сравнивать между собой, используя метод isEqualToString, который возвращает значение типа BOOL:
NSString *str1 = @"Abcd";
NSString *str2 = @"efghh";
BOOL equal = [str1 isEqualToString:str2];
NSLog(@"Strings is equal? %@", equal? @"YES" : @"NO");
Часто бывает нужно разделить строку на подстроки, используя какую-то разделяющую строку. Для этого достаточно вызвать метод  componentsSeparatedByString, который возвращает массив полученных подстрок. Метод принимает всего один параметр, это и есть разделяющая строка:
NSString *str = @"One, Two, Three";
NSArray *arr = [str componentsSeparatedByString:@", "];
NSLog(@"%@", arr);

13 февр. 2014 г.

Программирование на Objective-C. Урок 10

Програмирование на Objective-C. Урок 10

Objective-C является забавным и захватывающим языком программирования. Кроме того,этот язык основной для написания программ для Mac, IPod, iPhone и IPAD. Этот курс сосредоточен на Objective-C, построению простых приложений. Если вы желаете создавать приложения для настольных или мобильных устройств, это первый шаг к изучению, этот курс поможет вам начать работать, чтобы стать программистом! Чтобы начать обучение уже сегодня, просто посмотрите и попробуйте то, что показано в видео.


Скачать (720р)