Главная » iPhone » Progress HUDs iPhone: когда важно блокировать любые действия

0

Существует еще один объект определения прогресса, но он сам по себе не является индикатором. Класс uiProgressHUD отображает объект UI Progress Indicator и любой сопутствующий текст в полупрозрачном окне. Когда вы хотите донести до пользователя информацию о том, что он действительно не должен что-либо делать в каком-либо определенном окне до момента завершения операции, то именно для этих целей и существует класс UiProgressHUD. Такое окно располагается поверх окна целого вида, затемняя и надежно блокируя доступ к любым другим компонентам данного вида. Это можно увидеть в iPhone в случаях, когда меняются определенные возможности транспортного уровня, а также когда блокируется доступ к клавиатуре при отправке сообщений SMS.

Чтобы создать объект UiProgressHUD, инициализируйте его вместе с областью отображения родительского объекта:

UiProgressHUD *hud = [ [ UiProgressHUD alloc ] initwithFrame: viewRect ];

Текст для HUD задается с помощью метода setText этого объекта:

[ hud setText: @"Please’Wait. I’m doing something REALLY important." ];

Затем прикрепите данный HUD к большому виду или окну:

[ mainView addSubview: hud ];

Хотя этот объект и инкапсулирует UlProgressIndicator, однако ни метод startAnimation, ни метод stopAnimation напрямую недоступны. Индикатор

I

HUD активируется и деактивируется вызовом метода show: [ hud show: YES ];

Когда придет время отобразиться, HUD затенит родительский вид. Затем он активирует вращающийся индикатор и отобразит текст, который был для него определен. Когда ваше приложение завершит обработку, спрячьте HUD:

[ hud show: NO ];

Пример: "Hello, HUD!"

Пример в этом разделе берет приложение "Hello, World!" из главы 3 и добавляет к нему пятисекундный uiProgressHUD. Этот HUD будет отображаться поверх объекта uiTextview, а затем удаляться после истечения времени таймера.

Чтобы скомпилировать данный пример из командной строки, воспользуйтесь пакетом инструментов следующим образом:

$ arm-apple-darwin9-gcc -о MyExample MyExample.m -lobjc

-framework UIKit -framework Foundation -framework CoreFoundation

Листинги 7.9 и 7.10 содержат соответствующий код.

#import <UIKit/UIKit.h> #import <UIKit/UITextView.h> #import <UIKit/UIProgressHUD.h>

@interface MainView : Uiview {

UiTextview *textView;

}

-   (id)initwithFrame:(CGRect)frame;

-   (void)dealloc; @end

@interface MyApp : UiApplication {

UlWindow ‘window; MainView *mainView;

}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification; @end

#import "MyExample.h"

int main(int argc, char **argv) {

return UIApplicationMain(argc, argv, @"MyApp", @"MyApp");

}

UIProgressHUD *hud; @implementation MyApp

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { window = [ [ UlWindow alloc ] initWithContentRect: [ UIHardware fullScreenApplicationContentRect ]

];

CGRect rect = [ UIHardware fullScreenApplicationContentRect ]; rect.origin.x = rect.origin.у = O.Of;

mainView = [ [ MainView alloc ] initWithFrame: rect ];

[ window setContentView: mainView ]; [ window orderFront: self ]; [ window makeKey: self ] ; [ window _setHidden: NO ];

hud = [ [ UIProgressHUD alloc ] initWithFrame: rect J; [ hud setText: @"Please Wait" ]; [ mainView addSubview: hud ]; [ hud show: YES ];

NSTimer *timer = [ NSTimer scheduledTimerWithTimelnterval: 5.0 target: self

selector: ©selector(handleTimer:) userlnfo: nil repeats: NO ];

}

-    (void) handleTimer: (NSTimer *) timer {

{ hud show: NO ];

}

©end

©implementation MainView

-    (id)initWithFrame:(CGRect)rect {

self = [ super initWithFrame: rect ]; if (nil != self) {

textView = [ [ UiTextview alloc ] initWithFrame: rect ]; [ textView setText: ©"Hello, World!" ]; [ self addSubview: textView ];

}

return self;

}

-    (void)dealloc {

[ self dealloc ]; [ super dealloc ];

}

©end

Как это работает

HUD прогресса работает очень схожим образом, что и индикаторы, рассмотренные ранее в этой главе:

1.     При порождении приложения создается объект MainView и вызывается его метод initwithFrame.

2.     Метод initwithFrame создает объект UITextView и прикрепляет его к основному виду.

3.      После того как основной вид добавлен к окну, создается UiProgressHUD и прикрепляется к нему, а затем активируется.

4.     Создается объект NSTimer с триггером в 5 секунд. Каждый цикл триггера UiProgressHUD получает указание скрыться, открывая под собой исходный UITextView.

Для дальнейшего изучения

?   Воспользуйтесь своими знаниями листов предупреждений, полученными в главе 3, для создания "листа прогресса" без кнопок. Для заполнения строки используйте объект NSTimer. Когда строка достигнет своего края, автоматически уберите лист предупреждений. Такой сценарий идеально подойдет для тех случаев, когда вашему приложению требуется проверить наличие каких-либо обновлений продукта в Интернете.

?   Проверьте наличие прототипов UIProgressBar.h, UI Progress HUD.h и UlProgressIndicator.h в папке пакета инструментов. Они могут находиться в папке includes вашего пакета инструментов: /toolchain/sys/usr/include/UIKit.

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии