0

UIViewをサブビューとしてInterfaceBuilder(基本的なシングルビューアプリケーション)のメインUIViewに追加しました。制約を設定しないと、サブビューが消えます。

subview's frame = (0 0; 320 0);

何故ですか?

末尾のスペース、先頭のスペース、上部のスペース、下部のスペースなどの制約を追加しようとしても、ビューが消えてしまいます。

どうすればこれを解決できますか?

ありがとうございました。

少し明確にするために、テストプロジェクト(シングルビューアプリケーション)を作成し、画像のようにメインビューに2つのサブビューを追加しました。デフォルトの制約は変更しませんでした。そして、あなたは画像のログでエラーを見ることができます。 テストプロジェクト

ログ:

**2013-01-19 17:16:02.435 Test[8871:c07] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x106178c0 h=--- v=--- V:[UIWindow:0x9917040(480)]>",
    "<NSLayoutConstraint:0x106159e0 UIView:0x991a5a0.bottom == UIWindow:0x9917040.bottom>",
    "<NSLayoutConstraint:0x991ab00 V:|-(518)-[BottomView:0x9919c90]   (Names: '|':UIView:0x991a5a0 )>",
    "<NSLayoutConstraint:0x10615960 V:|-(20)-[UIView:0x991a5a0]   (Names: '|':UIWindow:0x9917040 )>",
    "<NSLayoutConstraint:0x991aa80 BottomView:0x9919c90.bottom == UIView:0x991a5a0.bottom>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x991aa80 BottomView:0x9919c90.bottom == UIView:0x991a5a0.bottom>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.**

制約: ここに画像の説明を入力してください

また、シミュレーターの結果は次のとおりです。 ここに画像の説明を入力してください

4

1 に答える 1

0

これらのログを理解することは良い習慣ですが、Autolayout を使用する場合は、これを読む必要があります。誰もが簡単だと言いますが、個人的には簡単ではありません。

AutoLayout の Apples プログラミング ガイド

このガイド、特にデバッグ セクションをお読みください。

ビューを追加する場合、非常に一般的なルールとして、ビューの autoresizingmasks (Spring と struts) をオフにする必要があります。ビューをサブビューとして追加し、2 つまたは 3 つの制約を与えます。上記のケースでは、スーパービューの左または先頭のスペースが 0 であるという制約を与えます。スーパービューの上部スペースは 0 で、幅は 320 です。

編集; ビューを追加する例を次に示します。フレームを作成する必要はありません。制約は少し奇妙かもしれません。1 つ目は、ビューをスーパービューの中央に配置します。2 番目は幅 200 を指定します。次の方法は、ビューを下部に配置し、高さを 2 にする垂直方向の制約です。

    UIView *sView = [[UIView alloc] init];
[sView setTranslatesAutoresizingMaskIntoConstraints:NO];
[superView addSubview:sView];

[superView addConstraint:[NSLayoutConstraint constraintWithItem:sView
                                                 attribute:NSLayoutAttributeCenterX
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:superView
                                                 attribute:NSLayoutAttributeCenterX
                                                multiplier:1.0
                                                  constant:0]];

[superView addConstraint:[NSLayoutConstraint constraintWithItem:sView
                                                             attribute:NSLayoutAttributeWidth
                                                             relatedBy:NSLayoutRelationEqual
                                                                toItem:Nil
                                                             attribute:NSLayoutAttributeWidth
                                                            multiplier:1.0
                                                              constant:200]];

[superView addConstraints:[NSLayoutConstraint
                                  constraintsWithVisualFormat:@"V:[sView(2)]|"
                                  options:0
                                  metrics:nil
                                  views:NSDictionaryOfVariableBindings(sView)]];
于 2013-01-21T11:06:05.707 に答える