UIView
これは、私がいくつかのサブビューを設定しているいくつかの問題の最初のものです。UIView
実行時に画面上に動的に配置されるがあります。そのUIView
(マスター)には、aとaUIView
をラップする別の(子)が含まれています。この取り決めのために私が持っている要件は次のとおりです。UIImageView
UILabel
- デバイスが回転するとき、子供
UIView
はマスターの中心に留まらなければなりません。UIView
- のテキストは
UILabel
非常に長くても短くてUIView
もかまいませんが、画像とテキストを含む子は中央に配置したままにする必要があります。 - このシナリオを処理するためにUIViewをサブクラス化することは避けたいと思います。また、IBのいくつかの設定と、可能であれば少し強制的なサイズ変更コードを使用
willRotateToInterfaceOrientation.
して、これらすべてを処理したいフレーム/ポジショニングコードも避けたいと思います。autoresizingMask
これは、Interface Builderのコントロールの配置です(赤で強調表示されています)。
Interface Builderでは、autoresizingMask
説明されているコントロールのプロパティがそのように設定されています
UIView
(マスター):柔軟な上マージン、柔軟な左マージン、柔軟な右マージン、柔軟な幅UIView
(子):柔軟な上マージン、柔軟な下マージン、柔軟な左マージン、柔軟な右マージン、柔軟な幅、柔軟な高さ。(なしを除くすべてのモード)UIImageView
:柔軟な右マージンUILabel
:柔軟な右マージン
これは、ポートレートモードで実行時にプログラムで追加された後のビュー(画像とテキストを含む赤いバー)です。
マスターUIView
の背景は明るい赤色の画像です。子供UIView
の背景はそれよりもわずかに暗く、UILabel
の背景はさらに暗くなります。アプリが回転に反応したときに境界が見えるように、色を付けました。
私には次のことが明らかです。
- 中央に配置されていませんが...
- テキストをIBのデフォルト値から「このマップエクステントにデータがありません」から変更した後。「TEST1、123」へ。ラベルは正しく収縮します。
これは、縦向きで追加され、横向きモードに回転された後のビューです。
ここから私はそれを見ることができます:
- それはまだ中央に配置されておらず、おそらく回転前の元のフレームの原点にあります
- UIView(子)は、表示されるべきではないときに画面全体に表示されるように拡張されました。
- UIView(マスター)が画面幅に合わせて適切に拡張されました。
これは私が今いる場所に私を導いたコードです。showNoDataStatusView
viewDidLoadからメソッドを呼び出します。
// Assuming
#define kStatusViewHeight 20
- (void)showNoDataStatusView {
if (!self.noDataStatusView.superview) {
self.noDataStatusView.frame = CGRectMake(self.mapView.frame.origin.x,
self.mapView.frame.origin.y,
self.mapView.frame.size.width,
kStatusViewHeight);
self.noDataStatusView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgRedStatus.png"]];
// Position the label view in the center
self.noDataStatusLabelView.center = CGPointMake(self.noDataStatusView.frame.size.width/2,
self.noDataStatusView.frame.size.height/2);
// Test different text
self.noDataStatusLabel.text = @"Testing, 123.";
// Size to fit label
[self.noDataStatusLabel sizeToFit];
// Test the status label view resizing
[self.noDataStatusLabelView resizeToFitSubviews];
// Add view as subview
[self.view addSubview:self.noDataStatusView];
}
}
次の点に注意してください:
resizeToFitSubviews
は、を呼び出してもUIViewがサブビューに合わせて自動的にサイズ変更されないことがわかったときにUIViewに配置したカテゴリですsizeToFit
。この質問、およびこの質問は問題を説明しました。以下のカテゴリのコードを参照してください。- このすべてのロジックを処理するUIViewサブクラスを作成することを考えましたが、やり過ぎのようです。これをIBに配置するのは簡単なはずですよね?
- 本のすべてのサイズ変更マスク設定を設定し、ラベルとビューのサイズ変更が発生する順序と、マスタービューがサブビューとして追加されるポイントを調整してみました。毎回奇妙な結果が出るので、何も機能していないようです。
UIView resizeToFitSubviewsカテゴリの実装方法:
-(void)resizeToFitSubviews
{
float width = 0;
float height = 0;
// Loop through subviews to determine max height/width
for (UIView *v in [self subviews]) {
float fw = v.frame.origin.x + v.frame.size.width;
float fh = v.frame.origin.y + v.frame.size.height;
width = MAX(fw, width);
height = MAX(fh, height);
}
[self setFrame:CGRectMake(self.frame.origin.x, self.frame.origin.y, width, height)];
}
私が知りたいのは、UIView
スーパービューがビュー階層に追加された後、(子)が適切に中央に配置されない理由です。適切な幅になっているように見えますが、ラベルに「このマップ範囲にデータがありません」と表示されたときに、IBで持っていたフレームが何とか保持されています。
また、デバイスの回転後に中央に配置されない理由と、ここで採用しているアプローチが賢明かどうかも知りたいです。おそらくこれが私が抱えている他の問題を引き起こしています。ここでのUIViewレイアウトのヘルプは大歓迎です。
ありがとう!