48

私は少しイライラしています。メイン ウィンドウにステータスバーが表示されるアプリがあります。ビューとそのフレーム サイズを動的に設定したいので (たとえば、通話中にステータス バーが 40 ピクセルを占める可能性があります)。

私は2つのうちの1つを行うことができます:

[[UIScreen mainScreen] bounds];
[[UIScreen mainScreen] applicationFrame];

本当に厄介なのは、これら 2 つの出力が 2 つの異なる値のセットを出力し、それぞれが同じように役に立たないことです。

bounds出力します: {{0, 0}, {320, 480}}while
applicationFrame出力します{{0, 20}, {320, 460}}

ご覧のとおりbounds、正しい y 原点 (0 はステータスバーの真下から開始) を提供しますが、高さ 480 を提供しますが、これは正しくありません。ステータスバーが表示されているため、460 である必要があります。次にapplicationFrame、ステータスバーの 20 ピクセル下から開始する (キャップがある) が、正しい高さを示します。しかし、とにかく 20 ピクセル押し下げると、あまり役に立ちません。

何か助けはありますか?

4

5 に答える 5

50

実際、それは非常に便利です。
を要求すると、デバイス画面全体である画面の境界が取得UIScreenされます。Bounds(ステータス バーは画面の一部です)
しかしUIScreen、アプリケーションのルート ビューの場所と大きさを教えてくれるように頼む場合は、 を頼むと便利ですapplicationFrame。が座標系applicationFrameで返されることを除いて、2 つの呼び出しの間に直接的な関係はありません。UIScreen bounds(ただし、ステータス バーはアプリケーションの一部ではないため、異なる結果が説明されます)

applicationFrame
アプリケーションのウィンドウに使用するフレーム四角形。(読み取り専用)
@property(nonatomic, readonly) CGRect applicationFrame 説明
この
プロパティには、画面の境界からステータス バーが占める領域を差し引いたものが含まれます (表示されている場合)。アプリケーションの初期ウィンドウ サイズを取得するには、このプロパティを使用することをお勧めします。四角形はポイント単位で指定します。

于 2012-08-13T01:50:46.850 に答える
8

実際には、ステータス バーの下部で 0 が開始されません。それはその上から始まります。(0,0) に UILabel を追加すると、ステータス バーを非表示にしない限り表示されません。したがって、bounds は合計画面領域を提供し、applicationFrame はアプリケーションが使用する必要がある領域を提供します。ステータス バーを非表示にすると、アプリケーション フレームが境界に一致するはずです。

于 2011-07-08T15:52:16.457 に答える
1

同様の問題がありました。私がやっていたことはかなりばかげていましたが、これが誰かの役に立てば幸いです。

サブビューで私が持っていた:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UIView * otherSubview = [[UIView alloc] initWithFrame:frame];
        [self addSubview:otherSubview];
    }
    return self;
}

原点が (0,0) ではないフレームでサブビューを作成していたため、同じフレームを使用してサブビューのサブビューを生成したため、それらのサブビューも下にシフトしました。その結果、あなたが言及した厄介な黒いバナーができました。

次のようにしてこれを修正しました。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        CGRect rect = frame;
        rect.origin.x = 0;
        rect.origin.y = 0;
        UIView * otherSubview = [[UIView alloc] initWithFrame:rect];
        [self addSubview:otherSubview];
    }
    return self;
}
于 2012-04-22T01:23:39.813 に答える
0

あなたはUIWindowを見るかもしれません。UIView から継承しているため、境界とフレームがあり、iOS アプリはすべて単一ウィンドウです。-[UIApplication keyWindow] は、アプリ デリゲートによって設定されたウィンドウを返します。他のすべてのビューはメイン ウィンドウに固定されているため、これで正しい境界が得られると思います。

于 2011-03-01T06:06:11.083 に答える