Как отобразить оверлей индикатора прогресса /HUD на iPhone?
Я хочу отобразить индикатор прогресса в полупрозрачном поле, которое плавает над табличным представлением. Другими словами, когда содержимое таблицы загружается, я хочу, чтобы над ним появлялась надпись "Updating".
Я видел это в нескольких приложениях в магазине, особенно в Facebook (когда вы встряхиваете, чтобы перезагрузить) и Darkslide.
Мой первый импульс - создать полупрозрачный UIView, поместить в него UILabel и UIProgressIndicatorView и добавить его в иерархию представлений... но где? UIView не может перекрывать своих братьев и сестер, поэтому я не могу сделать это подвид окна. Я также не могу сделать его подчиненным для таблицы, потому что тогда он будет прокручивать вверх и вниз с содержимым таблицы.
Я думал о создании нового UIWindow, но в документации в основном говорится: "Нет".
Я знаю, что CALayers могут перекрывать друг друга, так что это будет вариант, но я не могу поставить индикатор прогресса внутри CALayer, не так ли? Должен ли я показывать свой индикатор прогресса, который оживляет CALayer вместо UIView?
Мне не интересно узнать о частных API.
Изменить: Вопрос основывался на ошибочном предположении. NSViews (в Mac OS X) может не перекрываться, но UIViews на iPhone может.
Ответы
Ответ 1
Вы можете определенно перекрывать представления. Просто добавьте прозрачный оверлей в качестве подсмотра в tableView.
Из документации UIView:
Объекты UIView размещаются внутри объекта UIWindow во вложенной иерархии подзонов. Родительские объекты в иерархии представлений называются супервиками, а дети называются subviews. Объект вида претендует на прямоугольную область своего охватывающего супервизора, отвечает за весь чертеж в пределах этого региона и имеет право получать события, происходящие в нем. Представления Sibling могут перекрываться без каких-либо проблем, что позволяет создавать сложные представления.
Ответ 2
Я только что опубликовал мою версию HUD:
https://github.com/y0n3l/LGViewHUD
вы можете получить этот результат очень легко:
#import "LGViewHUD.h"
....
LGViewHUD* hud = [LGViewHUD defaultHUD];
hud.activityIndicatorOn=YES;
[email protected]"The longer....";
[email protected]"The better !";
[hud showInView:self.view];
![enter image description here]()
Как только задача завершена, просто вызовите
[[LGViewHUD defaultHUD] hideWithAnimation:HUDAnimationHideFadeOut];
и что это!
Ответ 3
Также есть довольно известный MBProgressHUD и SVProgressHUD
Они такие же, как @yonel HUD
Пример
[SVProgressHUD show];
[SVProgressHUD dismiss];
MBProgressHUD кажется теперь более популярным (если мы основываемся на звездах github)
Ответ 4
Любой объект, который живет в вашем MainWindow.xib, может получить доступ к окну приложения через розетку. Делегат приложения в стандартных проектах уже имеет его, но вы, вероятно, захотите добавить выход к контроллеру своего вида, который должен показывать оверлей прогресса.
Так как в UIKit UIWindow является UIView (в отличие от NSWindow против NSView в Cocoa), вы можете просто добавить представление прогресса в качестве подвид окна:
[window addSubview:progressView];
progressView будет охватывать весь пользовательский интерфейс приложения.
В этом примере используется техника для постепенного исчезновения изображения всплывающего окна Default.png:
http://michael.burford.net/2008/11/fading-defaultpng-when-iphone-app.html
В связи с недавним редактированием, с MacOS X 10.5 перекрытие Leopard NSView является детерминированным (они всегда могут перекрываться, вы просто получили неопределенные результаты), хотя он имеет различное упорядочение в обратном порядке в зависимости от того, содержит ли отображаемый вид поддерживается слоем или нет. Скорее всего, это побочный эффект интеграции CALayers в систему просмотра OS X.
Ответ 5
Ответ: Документы яблок довольно удивительны.
http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html
В настоящее время я перебираю прозрачные виды (по крайней мере, на обратной стороне салфетки в этот момент). Вы можете использовать их, чтобы удерживать кнопки меню, перемещать их в 3D-пространстве, просто гайки.
Я имею в виду, это религиозный тракт или что? Удивительные вещи от парней в NEXT:
Объекты UIView размещаются внутри объекта UIWindow во вложенной иерархии подзонов. Родительские объекты в иерархии представлений называются супервиками, а дети называются subviews. Объект вида претендует на прямоугольную область своего охватывающего супервизора, отвечает за весь чертеж в пределах этого региона и имеет право получать события, происходящие в нем. Представления Sibling могут перекрываться без каких-либо проблем, что позволяет создавать сложные представления.