好的,我在應用啓動後立即添加一個UIImageView
的概念,並將其動畫化爲假飛濺動畫。但是,狀態欄會干擾。iOS:在狀態欄上動畫初始屏幕
我需要一個UIImageView
頂部的東西,包括狀態欄,當它消失時,應用程序會顯示狀態欄。因此,設置最初隱藏的狀態欄,然後將其設置爲動畫並不是一個可行的選項。
好的,我在應用啓動後立即添加一個UIImageView
的概念,並將其動畫化爲假飛濺動畫。但是,狀態欄會干擾。iOS:在狀態欄上動畫初始屏幕
我需要一個UIImageView
頂部的東西,包括狀態欄,當它消失時,應用程序會顯示狀態欄。因此,設置最初隱藏的狀態欄,然後將其設置爲動畫並不是一個可行的選項。
你需要的是第二個UIWindow
與windowLevel
的UIWindowLevelStatusBar
或更高。您可以在應用程序委託中創建兩個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]
您可以添加子視圖到應用程序的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];
}];
}
}
糾正我,如果我錯了,我認爲這段代碼不會使imageView重疊狀態欄,如在狀態欄頂部。 – Mazyod
謝謝,我不理解的'UIWindow'辦法的事情是如何添加一個新的窗口到應用程序?我不能''self.window addSubWindow];',如果你知道我的意思嗎? – Mazyod
'self.window'應該保存你的主'UIWindow'。然後創建另一個「UIWindow」對象,使它成爲關鍵和可見的,做你的動畫,並在最後讓你的主窗口關鍵和可見。 –
對不起,但要麼我不理解你,要麼你的回答錯誤。搜索後,我意識到只需創建一個「UIWindow」實例,就可以將它添加到層次結構中,而不需要其他工作。剩下的是,按照你的建議將它移到前面。我將添加我找到的代碼,並解決我的問題。謝謝。 – Mazyod