Создаем виджеты для iOS 5

Антон Титков
Development Разработка программ для AppStore Разработка программ для Cydia
Создаем виджеты для iOS 5
В этой теме я расскажу как создавать виджеты для iOS 5.(Необходим установленный Theos)

Для примера нам нужен будет шаблон.После скачивание переименвываем его в template и переносим его в пользовательскую директорию.

Содержимое шаблона:
1)ярлык theos(оригинал в /opt/theos),необходим для компиляции
2).mm файл,реализация виджета
3)header.h файл,интерфейс виджета
4)BBWeeAppController-Protocol.h, протокол,содержащий private API для создания виджета
5)layout,там все для создания .deb
6)Makefile,мейкфайл


Откроем протокол:
@protocol BBWeeAppController <NSObject>
- (id)view;

@optional
- (float)viewHeight;
- (void)viewWillAppear;
- (void)viewDidAppear;
- (void)viewWillDisappear;
- (void)viewDidDisappear;
- (void)willRotateToInterfaceOrientation:(int)arg1;
- (void)willAnimateRotationToInterfaceOrientation:(int)arg1;
- (void)didRotateFromInterfaceOrientation:(int)arg1;
- (void)loadPlaceholderView;
- (void)loadFullView;
- (void)unloadView;
- (void)loadView;
- (id)launchURL;
- (id)launchURLForTapLocation:(struct CGPoint)arg1;
@end


Единственный обязательный метод -(id)view, остальные не обязательные

Так-как -(id)view является required методом,значит он должен быть обязательно реализован в .m(.mm) файле.Вообще этот метод отвечает за отображение нашего виджета.

Посмотрим пример его реализации.Открываем .mm файл в шаблоне.

Реализация метода -(id)view
- (UIView *)view
{
    if (_view == nil)
    {
        _view = [[UIView alloc] initWithFrame:CGRectMake(2, 0, 316, 71)];                    
        UIImage *bg = [[UIImage imageWithContentsOfFile:@"/System/Library/WeeAppPlugins/WeeAppTest.bundle/WeeAppBackground.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:71]; 
        UIImageView *bgView = [[UIImageView alloc] initWithImage:bg];//Бекграунд виджета
        bgView.frame = CGRectMake(0, 0, 316, 71);
        [_view addSubview:bgView];
        [bgView release];
        UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 316, 71)];
        lbl.backgroundColor = [UIColor clearColor];
        lbl.textColor = [UIColor whiteColor];
        lbl.text = @"iT0ny's Test Widget";
        lbl.textAlignment = UITextAlignmentCenter;
        [_view addSubview:lbl];
        [lbl release];
    }
    return _view;
}


Сначала проверяем вид на пустоту
Далее первым делом создаем наш вью.
_view = [[UIView alloc] initWithFrame:CGRectMake(2, 0, 316, 71)];

CGRectMake(2, 0, 316, 71),это стандартные значения для виджета,но 71 можем поменять например на 90,чтобы изменить его высоту.

Затем создаем UIImage для бекграунда:
UIImage *bg = [[UIImage imageWithContentsOfFile:@"/System/Library/WeeAppPlugins/WeeAppTest.bundle/WeeAppBackground.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:71];


Создаем UIImageView для отображения нашего бекграунда:
UIImageView *bgView = [[UIImageView alloc] initWithImage:bg];//Бекграунд виджета
 bgView.frame = CGRectMake(0, 0, 316, 71);


Прикрепляем bgView к виду нашего виджета:
[_view addSubview:bgView];
[bgView release];


Создаем надпись на виджете:
UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 316, 71)];
lbl.backgroundColor = [UIColor clearColor];
lbl.textColor = [UIColor whiteColor];
lbl.text = @"iT0ny's Test Widget";
lbl.textAlignment = UITextAlignmentCenter;
[_view addSubview:lbl];
[lbl release];

Возвращаем наш вид.
Это всего лишь пример реализации,вы можете делать что вашей фантазии угодно.

Интересные опциональные методы:

1)- (float)viewHeight;-отвечает за высоту
Реализация:
- (float)viewHeight{
return 71.0f;
}

2)- (void)willRotateToInterfaceOrientation:(int)arg1;
- (void)willAnimateRotationToInterfaceOrientation:(int)arg1;
- (void)didRotateFromInterfaceOrientation:(int)arg1;
Методы отвечающие за ориентацию виджета в зависимости от ориентации девайса


3)- (id)launchURL;
- (id)launchURLForTapLocation:(struct CGPoint)arg1;

Очень интересные методы,отвечают за переход на URL по тапу на виджет(- (id)launchURL;) и по тапу на область(- (id)launchURLForTapLocation:(struct CGPoint)arg1;)


Реализация 1 метода:
- (NSURL*)launchURL{
   return [NSURL URLWithString:@"cydia://"];//тап на виджет перенесет вас в сидию
}

Проверяем наш шаблон.

Запускаем Terminal.app
Вводим
cd template

Enter
make

После удачного компилирования,в папке template появится папка obj,в ней будет лежать WeeAppTest.dylib,через свойства файла убираем разрешение .dylib, полученный WeeAppTest копируем в layout/System/Library/WeeAppPlugins/WeeAppTest.bundle

Для тех кто еще не освоился с theos,скомпиленный виджет http://d.pr/Eqtf (.bundle в архиве)


После этого по ssh(или как вам удобней) переносим WeeAppTest.bundle на ваш девайс под управлением iOS5 в System/Library/WeeAppPlugins/ .Делаем респринг.Виджет должен появится в центре уведомлений.Пробуем нажать на виджет,нас перенесет в Cydia

12 июня 2011, 15:11

Ответы