web-dev-qa-db-ja.com

iOS 7のステータスバーの移動

私が直面している問題はこれです:

メインビューが右/左にアニメーション化した後に表示される、ニースデザインと左/右メニューを備えたiOS 7アプリを実装したいと思います。私はこれを[UIView animateWithDuration...]コードですが、それほど重要ではありません。私が達成したいのは、メールボックスiOS 7アプリと同じ効果です。メインビューでステータスバーを(右/左に)移動します。

より良い説明のための画像:

Mailbox app with status bar moved to the side

私が見つけたのは、この問題に関する this 記事で、プライベートAPIを使用するいくつかの機能するコードがあり、App Storeでアプリを受け入れてもらいたいので使用しません。

同じ効果を達成したい(「合法」)。誰かが方法を知っていますか?

ありがとう!

36
Gyfis

その要点は、iOS 7で導入されたこのメソッドを使用することです。

https://developer.Apple.com/documentation/uikit/uiscreen/1617814-snapshotview

これにより、ステータスバーを含むスクリーンショットを含むUIViewが取得されます。それができたら、現在のビューを非表示にしてから、スクリーンショットビューをプッシュするだけです。

ここに概念実証を投稿しました: https://github.com/simonholroyd/StatusBarTest

[〜#〜]ノート[〜#〜]Appleプロセスを確認しますが、これはプライベートAPIメソッドではありません。

48
Simon Holroyd

したがって、Simon Holroyd氏による最初のPushといくつかの検索の後に、この「効果」機能を実現する方法の解決策を見つけました。これはコードです:

statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)];

編集:mister pcholbergは、以前のコードが実際のデバイスでは機能せず、iOSシミュレータでのみ機能することを正しく指摘したので、彼の推奨により編集しました

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として保存します

2番目の部分は、viewControllerのUIViewにスナップショットUIViewを追加します

そして、3番目の部分では、ステータスバーのブール値を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)];

}

そしてボイラー!これは私の質問で説明した効果として機能します。

これが誰かに役立つことを願っています!

7
Gyfis

このメソッドを使用して、スライダービューでスタチューバーを移動します。アプリケーションには、通常のウィンドウとその他のstatuBarWindowの2つのウィンドウがあり、statuBarWindowsであるstatuBarViewを取得して、スライダービューで移動します。

- (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;
}
7
signal

BSPanViewController を作成したところ、この効果を非常に簡単に実現できます。それを使用するための制御と指示は GitHubにあります にすることができます。

実装は1と同じです Simon Holroydが説明

3
simonbs