[英]Moving status bar in iOS 7
我面臨的問題是:
我想實現一個具有漂亮設計和左/右菜單的iOS 7應用,該菜單在主視圖向右/左動畫后顯示。 我正在使用[UIView animateWithDuration...]
代碼執行此操作,但這並不是很重要。 我要實現的效果與Mailbox iOS 7應用程序具有的效果相同:使用主視圖將狀態欄移開(向右/向左)
圖像以獲得更好的解釋:
我唯一發現的是關於此問題的這篇文章,其中有一些我不想使用的使用私有API的工作代碼,因為我希望我的應用程序可以在App Store上被接受。
我想達到同樣的效果(“合法”)。 有人知道怎么做嗎?
謝謝!
要點是使用iOS 7中引入的以下方法:
https://developer.apple.com/documentation/uikit/uiscreen/1617814-snapshotview :
這樣,您將獲得一個UIView,其中包含帶有狀態欄的屏幕截圖。 一旦有了它,只需隱藏當前視圖,然后四處移動屏幕快照視圖即可。
我在這里發布了概念證明: https : //github.com/simonholroyd/StatusBarTest
注意我尚未通過Apple審核過程提交執行此操作的代碼,但這不是私有API方法。
因此,在西蒙·霍爾羅伊德(Simon Holroyd)先生的最初推動和一些搜索之后,我找到了如何實現此“效果”功能的解決方案。 這是代碼:
statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];
編輯:先生pcholberg正確地指出,以前的代碼僅在iOS Simulator上不能在實際設備上運行,所以我根據他的建議對其進行了編輯
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
UIView *screenShot = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
[statusbarView addSubview:screenShot];
[statusbarView setClipsToBounds:YES];
[self.view addSubview:statusbarView];
[self setPrefersStatusBarHidden:YES];
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
...
- (BOOL)prefersStatusBarHidden
{
return prefersStatusBarHidden;
}
...
因此,第一部分創建上下文,使用Simon提到的方法,使用狀態欄繪制視圖,並將其另存為UIImage
第二部分將快照UIView
添加到我的viewController的UIView
第三部分將狀態欄的布爾值設置為YES(以便在上面的方法中更方便使用),並調用方法來重繪它
然后,這會將UIView設置為不起作用的狀態欄,並隱藏原始狀態欄,因此不會出現雙重渲染。 然后,我可以在[UIView animateWithDuration...
方法中使用此視圖
當我返回時,我在動畫塊的完成處理程序中使用以下代碼:
[statusbarView removeFromSuperview];
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
[self setPrefersStatusBarHidden:NO];
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
瞧! 這就像我的問題中描述的效果一樣。
希望這對某人有幫助!
我使用這種方法來移動帶有滑動條視圖的雕像欄,在一個應用程序中有兩個窗口,一個普通窗口,另一個statuBarWindow,我得到statuBarView,它的superView是statuBarWindows,並以滑動條視圖移動它。
- (UIView *)statuBarView
{
NSString *key = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9] encoding:NSASCIIStringEncoding];
id object = [UIApplication sharedApplication];
UIView *statusBar = nil;
if ([object respondsToSelector:NSSelectorFromString(key)]) {
statusBar = [object valueForKey:key];
}
return statusBar;
}
我剛剛創建了BSPanViewController ,它可以非常輕松地實現這種效果。 可以在GitHub上找到有關如何使用它的控件和說明。
該實現與Simon Holroyd解釋的實現相同。
根據我的經驗,App Store審閱者通常不關心私有API的使用,尤其是這種簡單無害的方法。 對於此任務,您可以通過幾種方法獲得指向應用程序狀態欄視圖的指針,您可以在iOS完整的標題中找到這些標題,例如https://github.com/nst/iOS-Runtime-Headers
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.