私が直面している問題はこれです:
メインビューが右/左にアニメーション化した後に表示される、ニースデザインと左/右メニューを備えたiOS 7アプリを実装したいと思います。私はこれを[UIView animateWithDuration...]
コードですが、それほど重要ではありません。私が達成したいのは、メールボックスiOS 7アプリと同じ効果です。メインビューでステータスバーを(右/左に)移動します。
より良い説明のための画像:
私が見つけたのは、この問題に関する this 記事で、プライベートAPIを使用するいくつかの機能するコードがあり、App Storeでアプリを受け入れてもらいたいので使用しません。
同じ効果を達成したい(「合法」)。誰かが方法を知っていますか?
ありがとう!
その要点は、iOS 7で導入されたこのメソッドを使用することです。
https://developer.Apple.com/documentation/uikit/uiscreen/1617814-snapshotview :
これにより、ステータスバーを含むスクリーンショットを含むUIViewが取得されます。それができたら、現在のビューを非表示にしてから、スクリーンショットビューをプッシュするだけです。
ここに概念実証を投稿しました: https://github.com/simonholroyd/StatusBarTest
[〜#〜]ノート[〜#〜]Appleプロセスを確認しますが、これはプライベートAPIメソッドではありません。
したがって、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)];
}
そしてボイラー!これは私の質問で説明した効果として機能します。
これが誰かに役立つことを願っています!
このメソッドを使用して、スライダービューでスタチューバーを移動します。アプリケーションには、通常のウィンドウとその他の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;
}
BSPanViewController を作成したところ、この効果を非常に簡単に実現できます。それを使用するための制御と指示は GitHubにあります にすることができます。
実装は1と同じです Simon Holroydが説明 。