簡體   English   中英

在iOS 7中移動狀態欄

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM