26 мар. 2014 г.
24 мар. 2014 г.
The Flat Project
The Flat Project - плоские иконки для OS X приложений. В наборе 34 иконки в формате .png и .icns
В набор вошли такие приложения:
Word, Excel, Powerpoint, Photoshop, Illustrator, Indesign, Pages, Numbers, Keynote, iMovie, iPhoto, iTunes, Garageband, Finder, Appstore, Facetime, Calendar, Contacts, Game Center, iBooks, Preview, Launchpad, Mail, Maps, Messages, Notes, Photo Booth, Reminders, Safari, Systemprefs, Trash, Xcode, Logic, Final Cut.
В набор вошли такие приложения:
Word, Excel, Powerpoint, Photoshop, Illustrator, Indesign, Pages, Numbers, Keynote, iMovie, iPhoto, iTunes, Garageband, Finder, Appstore, Facetime, Calendar, Contacts, Game Center, iBooks, Preview, Launchpad, Mail, Maps, Messages, Notes, Photo Booth, Reminders, Safari, Systemprefs, Trash, Xcode, Logic, Final Cut.
23 мар. 2014 г.
NSPopover и detachableWindowForPopover пример
NSPopover является анимированный всплывающий компонент, который показывает загруженные файлы в вэб-браузере Safari. Такой компонент был добавлен в Mac OS X Lion. Если вы когда-нибудь задумывались, как добавить его в код, то это очень просто.
Принцип работы состоит в том, что popover связывает NSView с определенной позицией в окне (с позицией вызывающего контрола интерфейса на форме). NSView содержит пользовательский материал который будет виден в popover.
Начнем. У нас есть окно. Добавим на окно нашей формы кнопку, по которой мы будем вызывать наш popover.
Также добавим NSView, на котором разместим иконку (также можно любой контрол, будь-то кнопку или текстовое сообщение).
Найдем в списке библиотеки объектов Popover и перетянем в наш список объектов (вместе с Popover автоматически будет перетянут и Popover View Controller).
Теперь свяжем наш NSView с Popover View Controller и выберем оутлет view.
Также создадим для кнопки экшен, из которой будет вызываться popover.
- (IBAction)showPopOver:(id)sender;
И создадим связку нашего Popover (в списке наших объектов) с оутлетом *popover.
В экшен кнопки добавим такой код:
Здесь макрос NSMaxXEdge будет показывать наш popover вертикально сверху от вызывающего контрола или снизу (в зависимости от вертикального расположения нашего окна). Если нужно показывать слева или справа - NSMaxYEdge.
Выделим наш Popover и в инспекторе атрибутов и в Popover -> Behavior выберем Transient. Этот атрибут будет позволять popover`у удаляться если кликнуть где-то в другом месте окна приложения.
Вот что должно получится:
detachableWindowForPopover - popover который при перетаскивании может преобразовываться в окошко NSWindow. Все тоже очень просто. Добавляем в наш список объектов NSWindow. Размещаем на нем что-то, можно ту же иконку. Выделяем наш popover и связываем delegate (popover`а) с App Delegate - объектом (в списке наших объектов). Теперь в хидер файл добавим NSPopoverDelegate делегат, который позволит нам создавать окно из popove`ра.
Связываем наше добавленное окно с оутлетом, по которому мы будем обращаться к этому окну.
Добавляем в .m - файл метод detachableWindowForPopover:
В принципе все. Должно работать. При появлении popove`ра перетаскиваем его в любое место и создается наше окошко.
Принцип работы состоит в том, что popover связывает NSView с определенной позицией в окне (с позицией вызывающего контрола интерфейса на форме). NSView содержит пользовательский материал который будет виден в popover.
Начнем. У нас есть окно. Добавим на окно нашей формы кнопку, по которой мы будем вызывать наш popover.
Теперь свяжем наш NSView с Popover View Controller и выберем оутлет view.
Также создадим для кнопки экшен, из которой будет вызываться popover.
- (IBAction)showPopOver:(id)sender;
И создадим связку нашего Popover (в списке наших объектов) с оутлетом *popover.
@property (assign) IBOutlet NSPopover *popover;
В экшен кнопки добавим такой код:
[[self popover] showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMaxXEdge];
Здесь макрос NSMaxXEdge будет показывать наш popover вертикально сверху от вызывающего контрола или снизу (в зависимости от вертикального расположения нашего окна). Если нужно показывать слева или справа - NSMaxYEdge.
Выделим наш Popover и в инспекторе атрибутов и в Popover -> Behavior выберем Transient. Этот атрибут будет позволять popover`у удаляться если кликнуть где-то в другом месте окна приложения.
Вот что должно получится:
detachableWindowForPopover - popover который при перетаскивании может преобразовываться в окошко NSWindow. Все тоже очень просто. Добавляем в наш список объектов NSWindow. Размещаем на нем что-то, можно ту же иконку. Выделяем наш popover и связываем delegate (popover`а) с App Delegate - объектом (в списке наших объектов). Теперь в хидер файл добавим NSPopoverDelegate делегат, который позволит нам создавать окно из popove`ра.
#import <Cocoa/Cocoa.h>
@interface AppDelegate : NSObject <NSApplicationDelegate, NSPopoverDelegate>
Связываем наше добавленное окно с оутлетом, по которому мы будем обращаться к этому окну.
@property (unsafe_unretained) IBOutlet NSWindow *popWindow;
Добавляем в .m - файл метод detachableWindowForPopover:
- (NSWindow *) detachableWindowForPopover:(NSPopover *)popover {
return [self popWindow];
}
В принципе все. Должно работать. При появлении popove`ра перетаскиваем его в любое место и создается наше окошко.
21 мар. 2014 г.
Добавить N-дней к NSDate
Есть два метода для достижении этой цели. Первый, является быстрым и немного грязноватым. И второй, который более безопасен в расчетах.
Первый способ включает в себя просто добавление количества дней в секундах:NSDate *now = [NSDate date]; int daysToAdd = 50; // или 60 :-) NSDate *newDate1 = [now addTimeInterval:60*60*24*daysToAdd]; NSLog(@"Быстрый расчет: %@", newDate1);
Данный метод имеет ряд ограничений. Он не заботиться о переходе на летнее или зимнее время. Таким образом, Вы обходите границы DST, в конечном итоге получите результат, который расходится между желаемым результатом вычисления на один час и в худшем случае на день.
Таким образом, следующий метод использует класс NSDateComponents и григорианский календарь, чтобы правильно добавить количество дней и корректно рассчитать результат:
NSDate *now = [NSDate date]; int daysToAdd = 50; // или 60 :-) // используем NSDateComponents NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; [components setDay:daysToAdd]; // Используем календарь NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; NSDate *newDate2 = [gregorian dateByAddingComponents:components toDate:now options:0]; NSLog(@"Правильный расчет: %@", newDate2);
Функции даты в Objective-C являются чрезвычайно мощными, но время от времени их трудно понять, для людей, которые являются начинающими программистами.
Конвертация NSString в массив символов
Один из способов сделать это - просто получить один символ подстроки из заданной полной строки:
NSString *s = @"Hello World"; int i; NSMutableArray *m = [[NSMutableArray alloc] init]; for (i = 0;i < [s length]; i++) {
[m addObject:[s substringWithRange:NSMakeRange(i, 1)]]; } NSLog([m description]);
20 мар. 2014 г.
Добавление числа в массив / Add number to Array
Обычно в массив типа NSArray или NSMutableArray нельзя добавить простое число или структуру, а только объект. Значит (в нашем примере) преобразуем наше простое число (например int) в объект. Число можно преобразовать как с помощью NSString, так и с помощью NSNumber.
NSMutableArray *myArray = [NSMutableArray arrayWithCapacity:30]; // должен быть мутабельным for (int x = 0; x < 30; x++) { // добавить как NSString [myArray addObject:[NSString stringWithFormat:@"%d", x]]; // добавить как NSNumber [myArray addObject:[NSNumber numberWithInt: x]]; } // результат NSLog([myArray description]);
Для обоих случаев используемые классы возвращают число как объект.