2013-01-12 110 views
0

好的,我在應用啓動後立即添加一個UIImageView的概念,並將其動畫化爲假飛濺動畫。但是,狀態欄會干擾。iOS:在狀態欄上動畫初始屏幕

我需要一個UIImageView頂部的東西,包括狀態欄,當它消失時,應用程序會顯示狀態欄。因此,設置最初隱藏的狀態欄,然後將其設置爲動畫並不是一個可行的選項。

回答

2

你需要的是第二個UIWindowwindowLevelUIWindowLevelStatusBar或更高。您可以在應用程序委託中創建兩個UIWindow對象,一個使用常規視圖層次結構,另一個使用圖像,第二個使用淡入淡出效果(或者需要製作動畫)。這兩個窗口應該是可見的,飛濺窗口在上面。

這種方法很複雜,因爲根據您的常規視圖層次結構,您可能會遇到旋轉問題。我們已經在我們的軟件中完成了這項工作,並且運行良好。


編輯:

適應解(窗口的辦法,很簡單):

UIImageView* splashView = [[UIImageView alloc] initWithImage:[UIImage imageWithBaseName:@"Default"]]; 
[splashView sizeToFit]; 

UIViewController* tmpVC = [UIViewController new]; 
[tmpVC.view setFrame:splashView.bounds]; 
[tmpVC.view addSubview:splashView]; 

// just by instantiating a UIWindow, it is automatically added to the app. 
UIWindow *keyWin = [UIApplication sharedApplication].keyWindow; 
UIWindow *hudWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0.0f, -20.0f, keyWin.frame.size.width, keyWin.frame.size.height)]; 

[hudWindow setBackgroundColor:[UIColor clearColor]]; 
[hudWindow setRootViewController:tmpVC]; 
[hudWindow setAlpha: 1.0]; 
[hudWindow setWindowLevel:UIWindowLevelStatusBar+1]; 
[hudWindow setHidden:NO]; 

_hudWin = hudWindow; 

[UIView animateWithDuration:2.3f animations:^{ 
    [_hudWin setAlpha:0.f]; 
} completion:^(BOOL finished) { 
    [_hudWin removeFromSuperview]; 
    _hudWin = nil; 
}]; 

最後,歸功於this guy


一種更簡單的方法是啓動與隱藏狀態欄應用程序,你有沒有想以動畫的視圖層次結構的頂部視圖和動畫完成後,在狀態欄中顯示使用[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]

+0

謝謝,我不理解的'UIWindow'辦法的事情是如何添加一個新的窗口到應用程序?我不能''self.window addSubWindow];',如果你知道我的意思嗎? – Mazyod

+0

'self.window'應該保存你的主'UIWindow'。然後創建另一個「UIWindow」對象,使它成爲關鍵和可見的,做你的動畫,並在最後讓你的主窗口關鍵和可見。 –

+0

對不起,但要麼我不理解你,要麼你的回答錯誤。搜索後,我意識到只需創建一個「UIWindow」實例,就可以將它添加到層次結構中,而不需要其他工作。剩下的是,按照你的建議將它移到前面。我將添加我找到的代碼,並解決我的問題。謝謝。 – Mazyod

0

您可以添加子視圖到應用程序的UIWindow。將UIImageView的幀的Y座標設置爲-20像素以處理狀態欄。

默認PNG圖像添加到您的窗口,並標記爲:

static const NSInteger kCSSplashScreenTag = 420; // pick any number! 
UIImageView *splashImageView; 

// Careful, this wont work for iPad! 
if ([[UIScreen mainScreen] bounds].size.height > 480.0f) // not best practice, but works for detecting iPhone5. 
{ 
    splashImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default-568h"]]; 
} 
else 
{ 
    splashImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Default"]]; 
} 

splashImageView.frame = CGRectMake(0.0f, -20.0f, splashImageView.image.size.width, splashImageView.image.size.height); 
splashImageView.tag = kCSSplashScreenTag; 
[self.window addSubview:splashImageView]; 
[splashImageView release]; 

[self _fadeOutSplaceImageView]; 

然後淡出出來

- (void)_fadeOutSplashImageView 
{ 
    UIView *splashview = [self.window viewWithTag:kCSSplashScreenTag]; 
    if (splashview != nil) 
    { 
     [UIView animateWithDuration:0.5 
           delay:0.0 
          options:0 
         animations:^{ 
          splashview.alpha = 0.0f; 
         } 
         completion:^(BOOL finished) { 
          [splashview removeFromSuperview]; 
         }]; 
    } 
} 
+0

糾正我,如果我錯了,我認爲這段代碼不會使imageView重疊狀態欄,如在狀態欄頂部。 – Mazyod