nib の通話中ステータス バーに応じてビューのサイズを変更するにはどうすればよいですか?
サイズ変更プロパティを設定するだけだと思いましたが、ルートUIViewでは有効になっていません。
(ここでの私の主な問題は、これが何と呼ばれているのかわからないことだと思います。シミュレーターメニューコマンドについて説明している場所を除いて、どのドキュメントにも通話中ステータスバーへの参照が見つかりません。)
iOS will invoke your viewController's viewWillLayoutSubviews method whenever there is a change in status bar. You can override that and adjust your subviews according to the new bounds.
- (void)viewWillLayoutSubviews {
// Your adjustments accd to
// viewController.bounds
[super viewWillLayoutSubviews];
}
-[UIApplication statusBarFrame] を探しており、UIApplicationDelegate で、ステータス バーのフレームが変更されたときに通知されるように、このデリゲート メソッドを実装する必要があります。
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame
ルート ビュー コントローラーが設定されていない場合、ステータス バーのサイズが変更されてもビューのサイズが自動的に変更されない場合があります。私はもともとアプリデリゲートにこれを持っていましたが、通話中に正しくサイズ変更されないことを除いて、アプリはすべての点で適切に機能しました。
[self.window addSubview:rootController.view];
上記の行をこれに変更したところ、通話中にアプリのサイズが自動的に変更されるようになりました。
[self.window setRootViewController:rootController];
ログでこれを見て原因を調査した後、この修正を発見しました。
Application windows are expected to have a root view controller at the end of application launch
これは、アプリケーションがバックグラウンドで実行されているときにコマンド + T を押すと完全に機能します。私のシナリオでは、ルート コントローラーはタブ バー コントローラーであり、各タブ内でナビゲーション コントローラーを再調整しています。
- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{
[UIView animateWithDuration:0.35 animations:^{
CGRect windowFrame = ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame;
if (newStatusBarFrame.size.height > 20) {
windowFrame.origin.y = newStatusBarFrame.size.height - 20 ;// old status bar frame is 20
}
else{
windowFrame.origin.y = 0.0;
}
((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame = windowFrame;
}];
}
「ルート UIView のサイズ変更プロパティが有効になっていない」とはどういう意味ですか?
通話中のステータスバーには特に指定はありませんし、そのあたりに API や通知はないと思います。代わりに、正しく自動サイズ変更するようにビューを設定する必要があります。
Xcode で新しいナビゲーション ベースのアプリを作成してみて、RootViewController.xib のテーブル ビューの自動サイズ変更設定を調べてください。うまくいけば、Apple の設定とプロジェクトで設定したものとの間に差分が見られるでしょう。
UITableView のようなビューでは、通常、テーブル セルの高さを変更する必要があり、 application:didChangeStatusBarFrame:を実装する以外にそれを行う方法はありません。しかし、大したことではありません。必要に応じて、行の高さを整数以外の値に設定できます。
私は同じ問題を抱えていました。私がしたことはこれでした。
私がはっきりしていたことを願っています。
ビュー フレームをプログラムで設定している場合は、ビューを手動で更新する必要があります。
-(void) viewDidAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
}
- (void)statusBarFrameWillChange:(NSNotification*)notification
{
// respond to changes
NSLog(@"STATUS BAR UPDATED");
NSDictionary *statusBarDetail = [notification userInfo];
NSValue *animationCurve = statusBarDetail[UIApplicationStatusBarFrameUserInfoKey];
CGRect statusBarFrameBeginRect = [animationCurve CGRectValue];
int statusBarHeight = (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication]statusBarOrientation])) ? statusBarFrameBeginRect.size.height : statusBarFrameBeginRect.size.width;
NSLog(@"status bar height %d", statusBarHeight);
}
-(void) viewDidDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationBackgroundRefreshStatusDidChangeNotification object:nil];
}
これにより、ステータス バーの新しい高さが得られ、これを使用してそれに応じてフレームを更新できます。
解決策は、ウィンドウ キーを作成したことを確認することです。
[window makeKeyAndVisible];
そうしないと、サブビューのサイズが自動的に変更されませんが、私が知る限り、他の症状はありません。
以前に投稿された解決策はどれもうまくいきませんでした。私にとってうまくいったのは、ビューに対して適切に制約を設定していなかったことです。私の状況では、ビュー内に 2 つの異なるコンテナー ビューがありました。
下部 (リスト内) のコンテナー ビューはUITableView
で、テーブルの下部まで正しくスクロールされませんでした。その理由は、インコール ステータス バーのオフセットが変更の原点 (左上隅) を引き起こしていたためでしたUITableView
が、サイズは同じままでした。これは、表の下部が画面からはみ出していたことを意味します。
解決策は、自動サイズ変更の高さの制約を適切に設定することでした。以下のスクリーンショットでは、自動サイズ変更ボックスの中央にある垂直方向の矢印です。