6

を使用してビューをサブビューとして追加しています[self.view addSubview:myView]。これはポートレートモードでうまく機能します。ただし、風景ではまったく機能しません。プログラムでレイアウト制約を追加するにはどうすればよいですか?

私のビューは現在、縦長の長方形のように見えますが、横長モードでは横長の長方形のように見える必要があります。

このコードを試して、コード内の制約がどのように機能するかを確認しましたが、常に例外が発生します。コードは次のとおりです。

[self.view addSubview:_preView];
NSLayoutConstraint *myConstraint = [NSLayoutConstraint
 constraintWithItem:_preView
 attribute:NSLayoutAttributeBottom
 relatedBy:NSLayoutRelationEqual
 toItem:self.view.superview
 attribute:NSLayoutAttributeBottom
 multiplier:1.0
 constant:-239];
[_preView addConstraint:myConstraint];

これにより、常に例外が発生します。上記のコードは、プレビューの下部がメイン ビューの下部より 239 ピクセル上にあることを確認するだけであることを知っています。しかし、それもうまくいきません。

ランドスケープの問題を解決できるように、これをソートするのを手伝ってもらえますか?

アップデート

生成される例外は次のとおりです。

2013-08-05 16:13:28.889 Sample Code[33553:c07] *** Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to install constraint on view. Does the constraint reference something from outside the subtree of the view? That's illegal. constraint:<NSLayoutConstraint:0x912c430 UIView:0x8561340.bottom == UILayoutContainerView:0x8257340.bottom - 20> view:<UIView: 0x85774e0; frame = (0 0; 320 568); opaque = NO; autoresize = W+H; autoresizesSubviews = NO; layer = <CALayer: 0x8577490>>' *** First throw call stack: (0x1a04012 0x173be7e 0x1a03deb 0x12ee4a0 0xbb983e 0xbb9a27 0xbb9b76 0xbb9d3b 0xbb9c4d 0x1c0d9 0x11395b3 0x19c3376 0x19c2e06 0x19aaa82 0x19a9f44 0x19a9e1b 0x24027e3 0x2402668 0x67fffc 0x2d3d 0x2c65) libc++abi.dylib: terminate called throwing an exception (lldb)

制約を追加する前にサブビューを追加したので、ビューが階層にあると確信しています。

更新 2

IB で親ビューのプロパティを「サブビューの自動サイズ変更」に設定しました。サブビューは、デバイスを回転させたときに横長の長方形に変換されるようになりましたが、狭すぎます。正しい幅であることを確認するためのコードが必要ですか?

4

3 に答える 3

0

上記のコードから、2 つの問題があります。1. 制約を親ビュー (必要に応じて self.view または self.view.superview) に追加する必要があります。2. myConstraint の一部である項目は、制約を追加するビュー階層に存在する必要があります。

myConstraint を _preView と self.view で形成できるかどうかを確認し、_preView を self.view にサブビューとして追加してから、myConstraint を self.view に追加することをお勧めします。

また、制約は理想的にはビューの-(void)updateConstraintsメソッドに配置する必要があり (カスタム ビューがある場合)、[self setNeedsUpdateConstraints];ビューで updateConstraints を呼び出したいときはいつでもビューを呼び出す必要があります (ビューの初期化後、回転後など)。updateConstraints を直接呼び出すことはありません。

于 2013-08-05T14:53:45.513 に答える
0

自動レイアウトについてはいくつかあります。レイアウトの制約を追加するときはいつでも、あいまいでないことを確認してください。あいまいなレイアウトは、ディスプレイで未定義の動作を引き起こす可能性があります。あいまいなレイアウトを作成することを決して許可しない IB を使用することをお勧めしますが、すべての制約を調べてそれらが有効であることを確認する必要があります。

プログラムで実行したい場合は、Visual languageを使用することをお勧めします。

レイアウトを使用する前に、これらのヒントを確認しておくと役立ちます。

于 2013-08-05T14:59:45.500 に答える