10 мар. 2014 г.

NSPopupButton выпадающий список

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

Создадим форму, на которой расположим наши контролы интерфейса:

- PopUpButton;
- TextField;
- Button;
- Label.

Сделаем связи наших контролов с нашими аутлетами и экшенами:

IBOutlet NSTextField *textLabel; // к Label
IBOutlet NSTextField *textField; // к TextField
IBOutlet NSPopUpButton *popUpButton; // к popUpButton


- (IBAction)addItemToPopUpButton:(id)sender; // к кнопке "Добавить"
- (IBAction)itemPopUpButtonDidSelected:(id)sender; // к popUpButton

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


- (IBAction)addItemToPopUpButton:(id)sender {
    
    if (![[textField stringValueisEqual: @""]) {
        [popUpButton addItemWithTitle: [textField stringValue]];
    }
}

- (IBAction)itemPopUpButtonDidSelected:(id)sender {
    
    [textLabel setStringValue:[popUpButton titleOfSelectedItem]];
}

Наш результат:
Теперь когда мы введем текст в TextField - поле и нажмем кнопку добавить, то наш текст будет добавлен в выпадающий список элемент за элементом. Если мы выберем какой-то элемент из выпадающего списка, то этот текст отобразится в нашем Label.

9 мар. 2014 г.

StatusBar приложение

Простой пример приложения которое имеет свое меню в статус баре OS X.

Создадим новый проект в Xcode. Перейдем в Interface Builder и добавим до нашего созданного окна "меню" (Выберем в списке контролов интерфейса Menu и положим где-то рядом с окном.
Отредактируем элементы списка меню:

- Показать окно;
- Выход.

В AppDelegate.h добавим следующие строки:

IBOutlet NSMenu *statusBarMenu;
NSStatusItem *statusBarItem;

- (IBAction)showWindow:(id)sender;
- (IBAction)quitApp:(id)sender;

Соединим наш оутлет NSMenu с нашим добавленным меню. Наши экшены соотвествующими элементами меню.

В AppDelegate.m в методе awakeFromNib напишем следующий код:

statusBarItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
[statusBarItem setMenu:statusBarMenu];
[statusBarItem setTitle:@"МоеМеню"];
[statusBarItem setHighlightMode:YES];

В экшене showWindow пишем следующее:

[NSApp activateIgnoringOtherApps:YES];
[_window makeKeyAndOrderFront:nil];

Код будет показывать нам наше скрытое приложение, будь оно свернуто или закрыто.

В экшене quitApp пишем:

[NSApp terminate:nil];

Ну вот и все.
Также можно добавить иконку к нашему меню. Если убрать setTitle, то у нас будет вместо надписи в статус баре только иконка. Иконка должна быть соотвествующих размеров как для обычных экранов так и для ретина-экранов.


8 мар. 2014 г.

Установить бэйдж на иконку приложения с помощью Objective-C

Для быстрой установки бэйджа на иконку своего приложения можно с помощью метода NSDockTitle.

[[NSApp dockTile] setBadgeLabel:@"МойБэйдж"];

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

Здесь видно что текст отображается полностью и нигде не обрезан.



А вот тут уже другая история. Середина текста выковыряна, т.к. текст больше чем сама ширина иконки.

Не убиваемое приложение на OS X

Небольшая, невинная шалость, которую Вы можете сделать своему другу на его Маке. Инструменты которые нам понадобятся:

- Текстовый редактор;
- Терминал.

Предполагаю что у Вас уже есть некоторые знания по запуску приложений из терминала (launchd) и использованию launchctl инструмента. Все что нужно для не убиваемого приложения (будь то какое-нибудь фоновое приложение) это определить его в качестве сервиса / процесса ( службы) и запустить (получится что если вы его убьете (kill), то система автоматически его снова запустит). launchd используется для администрирования службы на OS X. У него есть инструмент launchctl который запускает / останавливает сервис / процессы (службу). Также - каждая служба определяется с помощью plist - файла. Давайте создадим такой файл:

<plist version="1.0">
 <dict>
    <key>Label</key>
    <string>com.apple.SafariService</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Applications/Safari.app/Contents/MacOS/Safari</string>
    </array>
    <key>OnDemand</key>
  <false/>
 </dict>
</plist>

Дальше все просто. Мы его обзываем как com.apple.SafariService и делаем его как исполняемое  (даем права на выполнение/запуск) дополнение Safari. Опция OnDemand говорит, что он должен всегда работать. Сохраняем XML как файл с именем com.apple.SafariServicе.plist и помещаем его в папку ~/Library/LaunchAgents. Теперь для "не убиваемой части" - откройте терминал и введите следующую команду:

$ launchctl load ~/Library/LaunchAgents/com.apple.SafariService.plist

Это запустит Safari, если он не работает. Также - это будет перезапускать Safari как только вы попытаетесь выйти из него. То же самое касается kill - как только вы отправите службе сообщение SIGTERM - ОС будет перезапускать приложение. Вот и все. Удачного издевательства!

7 мар. 2014 г.

Текущая дата OS X / iOS

Вывод текущей даты с учетом временной зоны в OS X и iOS:

NSDate *now = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
        
// Жесткое указание временной зоны
//[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Kyiv"]];
//[formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:3600 * 2]];
        
// Временная зона указанная в системных настройках
[formatter setTimeZone:[NSTimeZone localTimeZone]];
NSLog(@"%@",[formatter stringFromDate:now]);


4 мар. 2014 г.

Очередной минималистический концепт OS XI

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


Второй концепт Mac OS XI. Это фокусировка на главном браузере, Safari, который был минимализирован. Safari в OS XI имеет собственные макеты, созданные для определенных веб-сайтов, которые оптимизированы для Mac OS XI. Один из таких сайтов является Google. 
Google.com в Safari скрывает все стандартные инструменты Google за кнопки меню, расположенные в нижней части страницы, похожие на недавнем эксперименте Google, с черной полосой в верхней части своей страницы.



28 февр. 2014 г.

Mountain Range Wallpaper (original)

Mountain Range обои с разным разрешением под некоторые устройства.

1280x1024
Dual Monitors (3360x1050)
Android (2160x1920)
HD+ (1600x900)
FHD (1920x1080)
WUXGA (1920x1200)
iMac 27" (2560x1440)
Macbook Retina 13" (2560x1600)
Macbook Retina 15" (2880x1800)
QHD+ (3200x1800)

27 февр. 2014 г.