12

iOSアプリでプログラムで自動レイアウトを使用しようとしています。私はこの初期化コードを備えたシンプルなビューコントローラーを持っています

UIView *innerView = [[UIView alloc] initWithFrame:self.view.bounds];

UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button1 setFrame:CGRectMake(50, 50, 150, 50)];
[button1 setTitle:@"button1" forState:UIControlStateNormal];

UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button2 setFrame:CGRectMake(250, 50, 150, 50)];
[button2 setTitle:@"button2" forState:UIControlStateNormal];

[innerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[button1][button2(==button1)]|" options:NSLayoutFormatAlignAllBaseline metrics:0 views:NSDictionaryOfVariableBindings(button1, button2)]];

[innerView addSubview:button1];
[innerView addSubview:button2];
[self.view addSubview:innerView];

しかし、これを実行しようとすると、次のエラーが発生します。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: 
Unable to interpret '|' character, because the related view doesn't have a superview 
|[button1][button2(==button1)]| 
          ^'

どうしたの?

そして、パイプを削除しようとするとconstraintsWithVisualFormat、次の警告が表示されます。

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:0x716be10 h=--& v=--& UIRoundedRectButton:0x71631f0.midX == + 325>",
    "<NSAutoresizingMaskLayoutConstraint:0x7169940 h=--& v=--& H:[UIRoundedRectButton:0x715fb80(150)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x7169860 h=--& v=--& UIRoundedRectButton:0x715fb80.midX == + 125>",
    "<NSLayoutConstraint:0x7164cd0 UIRoundedRectButton:0x71631f0.width == UIRoundedRectButton:0x715fb80.width>",
    "<NSLayoutConstraint:0x7164940 H:[UIRoundedRectButton:0x715fb80]-(0)-[UIRoundedRectButton:0x71631f0]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7164940 H:[UIRoundedRectButton:0x715fb80]-(0)-[UIRoundedRectButton:0x71631f0]>

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

2 に答える 2

34

あなたには3つの問題があります:

まず、両方のボタンサブビューでレイアウトベースの制約にオプトインする必要があります

[button1 setTranslatesAutoresizingMaskIntoConstraints:NO];
[button2 setTranslatesAutoresizingMaskIntoConstraints:NO]; 

これにより、NSAutoresizingMaskLayoutConstraintエラーが解消されます。これで、レイアウトの制約で何が起こっているのかを知ることができます。

次に、addSubview制約を追加する前に行う必要があります。addContraintsbutton1とbutton2がinnerviewのサブビューになる前に、innerViewを呼び出しています。

第3に、レイアウト文字列が垂直か水平かを指定する必要があります(ただし、ドキュメントにはオプションであると記載されています)。@"H:|[button1][button2(==button1)]|"@"V:[button1]|"また、 button1を下部に揃えるような垂直方向の制約がinnerview必要になります。ボタンのベースラインを揃えているため、button2がそれに続きます。

于 2013-03-11T19:05:00.473 に答える
2

念のために言っておきますが、スーパービューの欠落に関する例外はconstraintsWithVisualFormataddConstraints

于 2015-02-08T23:18:30.687 に答える