23

nib の通話中ステータス バーに応じてビューのサイズを変更するにはどうすればよいですか?

サイズ変更プロパティを設定するだけだと思いましたが、ルートUIViewでは有効になっていません。

(ここでの私の主な問題は、これが何と呼ばれているのかわからないことだと思います。シミュレーターメニューコマンドについて説明している場所を除いて、どのドキュメントにも通話中ステータスバーへの参照が見つかりません。)

4

11 に答える 11

24

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];
}
于 2011-11-30T01:53:05.723 に答える
16

-[UIApplication statusBarFrame] を探しており、UIApplicationDelegate で、ステータス バーのフレームが変更されたときに通知されるように、このデリゲート メソッドを実装する必要があります。

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame  
于 2009-07-11T20:39:54.337 に答える
7

ルート ビュー コントローラーが設定されていない場合、ステータス バーのサイズが変更されてもビューのサイズが自動的に変更されない場合があります。私はもともとアプリデリゲートにこれを持っていましたが、通話中に正しくサイズ変更されないことを除いて、アプリはすべての点で適切に機能しました。

[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
于 2013-02-27T02:04:49.070 に答える
7

これは、アプリケーションがバックグラウンドで実行されているときにコマンド + 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;
}];

}

于 2013-07-04T10:37:13.053 に答える
6

「ルート UIView のサイズ変更プロパティが有効になっていない」とはどういう意味ですか?

通話中のステータスバーには特に指定はありませんし、そのあたりに API や通知はないと思います。代わりに、正しく自動サイズ変更するようにビューを設定する必要があります。

Xcode で新しいナビゲーション ベースのアプリを作成してみて、RootViewController.xib のテーブル ビューの自動サイズ変更設定を調べてください。うまくいけば、Apple の設定とプロジェクトで設定したものとの間に差分が見られるでしょう。

于 2009-07-11T20:44:36.930 に答える
3

UITableView のようなビューでは、通常、テーブル セルの高さを変更する必要があり、 application:didChangeStatusBarFrame:を実装する以外にそれを行う方法はありません。しかし、大したことではありません。必要に応じて、行の高さを整数以外の値に設定できます。

于 2009-11-06T09:51:55.280 に答える
1

私は同じ問題を抱えていました。私がしたことはこれでした。

  1. IB で xib ファイルを開きます
  2. すべてのインターフェイス要素は、デフォルトで top と一緒に移動するようにアタッチされており、'Size Inspector' の 'Autosizing' プロパティに表示されます。そのため、画面下部の UI 要素については、上部からのリンクを削除し、代わりに下部からのリンクを作成します。他はそのままにしておきます。
  3. 問題が解決しました!!!

私がはっきりしていたことを願っています。

于 2011-05-13T07:54:35.563 に答える
1

ビュー フレームをプログラムで設定している場合は、ビューを手動で更新する必要があります。

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

これにより、ステータス バーの新しい高さが得られ、これを使用してそれに応じてフレームを更新できます。

于 2015-11-30T13:54:48.170 に答える
0

解決策は、ウィンドウ キーを作成したことを確認することです。

[window makeKeyAndVisible];

そうしないと、サブビューのサイズが自動的に変更されませんが、私が知る限り、他の症状はありません。

于 2009-12-30T06:05:58.293 に答える
0

以前に投稿された解決策はどれもうまくいきませんでした。私にとってうまくいったのは、ビューに対して適切に制約を設定していなかったことです。私の状況では、ビュー内に 2 つの異なるコンテナー ビューがありました。

ストーリーボードでのシーンの表示。

下部 (リスト内) のコンテナー ビューはUITableViewで、テーブルの下部まで正しくスクロールされませんでした。その理由は、インコール ステータス バーのオフセットが変更の原点 (左上隅) を引き起こしていたためでしたUITableViewが、サイズは同じままでした。これは、表の下部が画面からはみ出していたことを意味します。

解決策は、自動サイズ変更の高さの制約を適切に設定することでした。以下のスクリーンショットでは、自動サイズ変更ボックスの中央にある垂直方向の矢印です。

ここに画像の説明を入力

于 2014-11-25T16:05:56.110 に答える