36

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

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

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

ステータス バーが横に移動したメールボックス アプリ

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

私は同じ効果を(「合法的に」)達成したいと思います。誰も方法を知っていますか?

ありがとう!

4

5 に答える 5

48

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

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

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

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

: Apple レビュー プロセスを通じてこれを行うコードを提出していませんが、これはプライベート API メソッドではありません。

于 2013-09-25T17:01:54.500 に答える
7

このメソッドを使用して、スライダー ビューでスタチューバーを移動します。アプリケーションには 2 つのウィンドウ、1 つの通常のウィンドウ、もう 1 つの statuBarWindow があり、superView が 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;
}
于 2014-02-17T10:47:14.277 に答える
7

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

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

編集: ミスター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;
}

...


したがって、最初の部分はコンテキストを作成し、サイモンが言及した方法を使用し、ステータスバーでビューを描画し、それをUIImage

2番目の部分は、スナップショットUIViewをviewControllerに追加します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)];

}

そして出来上がり!これは、私の質問で説明されている効果として機能します。

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

于 2013-09-26T22:29:23.950 に答える
3

この効果を非常に簡単に達成できるようにするBSPanViewControllerを作成しました。コントロールとその使用方法に関する説明は、GitHub にあります。

実装はSimon Holroyd によって説明されたものと同じです。

于 2013-11-17T16:37:21.900 に答える
-3

私の経験では、App Store のレビュアーは通常、プライベート API の使用、特にこれが単純で無害であることを気にしません。このタスクでは、 https://github.com/nst/iOS-Runtime-Headersのような iOS の完全なヘッダーで見つけることができるいくつかのメソッドを介して、アプリケーションのステータス バー ビューへのポインターを取得できます。

于 2013-09-25T16:45:02.137 に答える