4

多くの入力フィールドを持つある種の「フォーム」を作成しています(テキストフィールド、スイッチ、ピッカーからの情報収集など)。
このフォームには 6 つのセクションがあり、一部の回答の性質はインターフェイスの残りの部分に影響を与えます (たとえば、車を所有していると選択すると、その下にさらに多くのオプションが表示されます)。

mainViewそれを達成するために、 のサブビューである非常に大きなビュー ( ) の作成を開始しましたが、大きくUIScrollViewなりすぎたので、セクションごとに 1 つの nib ファイルを作成することにしました。各 nib ファイルのファイル所有者を my に設定し、MainFormViewController各ビュー (section1View、section2View など) のアウトレットを作成します。セクション ビューを次の-viewDidLoadようにロードします。

// Section 1
UINib *nib1  = [UINib nibWithNibName:@"Section1" bundle:nil];
[nib1 instantiateWithOwner:self options:nil];
CGRect frame1 = self.section1View.frame;
frame1.origin.y = 10;
[self.section1View setFrame:frame1];
[self.mainView addSubview:self.section1View]; // mainView is the one I add to the scrollView

// Section 2 (goes 10px below section 1)
UINib *nib2  = [UINib nibWithNibName:@"Section2" bundle:nil];
[nib2 instantiateWithOwner:self options:nil];
CGRect frame2 = self.section2View.frame;
frame2.origin.y = frame1.origin.y + frame1.size.height + 10;
[self.section2View setFrame:frame2];
[self.mainView addSubview:self.section2View];

// Same approach for all other sections
// ...

これでうまくいくようですが、私の問題は、これらのセクション サブビューの高さを変更すると、残りのサブビューを高さの変更に適応させることができないことです。たとえば、最初のセクションの高さを変更すると:

CGRect mainFrame = self.mainView.frame;
CGRect section1Frame = self.section1View.frame;
section1Frame.size.height -= 150;
mainFrame.size.height -= 150;
[UIView animateWithDuration:0.3 animations:^(){
    self.section1View.frame = section1Frame;
    self.mainView.frame = mainFrame;
    self.scrollView.contentSize = mainFrame.size;
} completion:^(BOOL finished){
    //
}];

残りのビュー (section2View、section3View など)は、私が試した向きに関係なく、フレームの変更に「追従」しません。mainView私の理解ではmainView、サブビューの自動サイズ変更オプションに従って、のフレームを変更すると、そのサブビューのフレームに影響を与えるはずですよね? 私の場合、サブビューは同じ場所にとどまります。
Interface Builder のメイン ビューの [サブビューの自動サイズ変更] オプションが選択されています。

誰でもそれで私を助けることができますか?

4

3 に答える 3

5

他のセクションが 150 ピクセル上になることを期待していますか? それを達成できる自動サイズ変更マスクはないと思います。

上マージンが固定されてsection2Viewいる場合、スーパービューのサイズが変更されても移動しません。上マージンが柔軟で下マージンが柔軟な場合、移動しますが、75px のみです。上マージンのみが柔軟な場合、正しく上に移動しますが、それはセクション 1 が変更された場合にのみ機能します。

概要: セクションの 1 つのサイズを変更する場合、すべてのセクションの位置を手動で修正する必要があります。セクションを に入れるNSArrayと、非常に簡単になります。

またはそれ以上 -UITableViewこの状況に最適な a を使用してください。

于 2012-04-04T14:35:15.737 に答える
3

nib からビューをロードしても、自動サイズ変更の問題は発生しません。自動サイズ変更マスクが間違っていると思われます。

そうは言っても、これをテストするためにサンプルプロジェクトをまとめました。あなたがどのような影響を与えようとしているのか正確にはわかりませんが、サンプルを github に置いたので、問題に対処するのに役立つかどうかを確認できます.

https://github.com/jdecarlo/StackOverflow9920412

サンプルが問題の解決に役立たない場合は、この回答に理由を説明するコメントを追加してください。修正します。

于 2012-04-04T14:21:49.853 に答える
1

自動サイズ変更マスクが正しく設定されていますか? これを確認するには、すべてのビューとサブビューが作成された後にどこかにブレークポイントを使用し、次のコマンドを GDB ウィンドウに入力します。

po [[self mainView] recursiveDescription]

ビューとサブビューの階層全体が、すべてのフレームと自動サイズ変更マスクとともに表示されます。

于 2012-04-02T21:28:57.683 に答える