2009-02-27 90 views
23

我想在浮動在表視圖上的半透明框中顯示進度指示器。換句話說,當表格內容被下載時,我想要一個「更新」標籤出現在它上面。如何在iPhone上顯示進度指示器覆蓋/ HUD?

我已經在店裏的幾個應用程序,尤其是Facebook的(當你搖動重裝)和Darkslide看到了這一點。

我第一個衝動是創建一個半透明的UIView,放置一個UILabel和UIProgressIndicatorView裏面,並把它添加到視圖層次...但在哪裏? UIView可能不會重疊其兄弟,所以我無法將它作爲窗口的子視圖。 我也不能讓它成爲表格的子視圖,因爲那樣它會隨表格內容一起上下滾動。

我想過創建一個新的UIWindow,但文檔基本上說不要

我知道CALayers可以互相重疊,所以這將是一種選擇,但我不能把一個進度指示一個CALayer的裏面,可以嗎?我應該推出自己的進度指示器來激活CALayer而不是UIView嗎?

我沒興趣聽有關private APIs

編輯:的問題是基於一個錯誤的假設。 NSViews(在Mac OS X上)可能不會重疊,但iPhone上的UIViews可能會。

+0

你可以節省你的手機如果符合您的需求,可以使用[MBProgressHUD](https://github.com/matej/MBProgressHUD)進行一些工作。 – 2009-08-12 13:29:03

回答

14

你絕對可以重疊的意見。只需將透明覆蓋圖作爲子視圖添加到tableView中即可。

從UIView的文檔:

UIView的對象被佈置在一個UIWindow對象內,在子視圖的嵌套層級。視圖層次結構中的父對象稱爲超級視圖,子視圖稱爲子視圖。視圖對象聲明其封閉超視圖的矩形區域,負責該區域內的所有繪圖,並且有資格接收其中發生的事件。同胞視圖能夠重疊,沒有任何問題,允許複雜的視圖佈局。

+0

Interface Builder誤導了我!我知道NSViews不能重疊,如果你在IB中創建重疊的UIViews,它會用警告標記它們。謝謝你讓我直截了當。 – benzado 2009-02-27 01:52:24

1

居住在MainWindow.xib中的任何對象都可以通過插座訪問應用程序窗口。標準項目中的應用程序委託已經擁有了它,但是您可能需要將該插件添加到需要顯示進度疊加層的視圖控制器中。

由於UIKit中的UIWindow是一個UIView(不同於NSWindow與一個NSView在可可),你可以簡單地添加你的進步視圖作爲窗口的子視圖:

[window addSubview:progressView];

progressView將覆蓋整個應用程序UI。

本例使用的技術中淡出爲Default.png飛濺圖像:

http://michael.burford.net/2008/11/fading-defaultpng-when-iphone-app.html


隨着相對於最近編輯,如MacOS X的10的。5 Leopard NSView重疊是確定性的(它們總是可能重疊,你只是得到了不確定的結果),儘管它具有不同的前後排序,這取決於包含的視圖是否支持圖層。這很可能是將CALayers集成到OS X視圖系統中的一個副作用。

-1

回答:蘋果文檔非常棒。 http://developer.apple.com/iphone/library/featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html

目前我進入過度鋪設透明視圖(至少在這一點上的餐巾背面)。你可以使用它們來保存菜單按鈕,在3D空間中移動它們,只需要堅果。

我的意思是這是一個宗教道或什麼?來自NEXT傢伙的驚人材料:

UIView對象被安排在一個UIWindow對象中,嵌套在子視圖中。視圖層次結構中的父對象稱爲超級視圖,子視圖稱爲子視圖。視圖對象聲明其封閉超視圖的矩形區域,負責該區域內的所有繪圖,並且有資格接收其中發生的事件。同胞視圖能夠重疊,沒有任何問題,允許複雜的視圖佈局。

15

我剛剛發佈我的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]; 

就是這樣!

+0

感謝您的開源解決方案 – shkschneider 2012-08-21 09:04:46

+0

非常感謝您的分享,這真是太棒了! – kernix 2012-11-24 09:19:06

9

還有一些相當著名MBProgressHUD & SVProgressHUD
他們是同類型@yonel的HUD

[SVProgressHUD show]; 
[SVProgressHUD dismiss]; 

SVProgressHUD Examples MBProgressHUD現在似乎更流行的(如果我們基於github的明星)