に問題がありNSLayoutConstraint
ます。
constant
メソッドを使用して変更しようとすると、NSLayoutConstraintで例外が発生しますsetConstant:
。この問題が発生するのは、コードを介して高さ制約を追加した場合のみです。
まず、次のような高さの制約があります。
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];
return filteredArray[0];
それは私に正しい制約を与えます。これが完全に機能するNSTextFieldサブクラスがあります。制約はInterfaceBuilderで設定され、定数を設定および変更できます。
これで、実行時にさまざまなサブビューを追加するビューができました。これらのサブビューは独自のNIBに配置されているため、幅と高さを固定できません。そのため、ビューがスーパービューに追加されたらすぐに制約を追加すると思いました。これはで実行されていviewDidMoveToSuperview
ます。
// Pin Width & Height
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.width]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.height]];
制約が追加されました。これはNSLogで確認できます。
"<NSLayoutConstraint:0x100605cc0 H:[ITControlPanelChildView:0x100616eb0(269)]>",
"<NSLayoutConstraint:0x100614410 V:[ITControlPanelChildView:0x100616eb0(317)]>"
最後に、を使用して制約を変更しようとすると[constraint setConstant:somethingDifferent];
、次の例外が発生します。
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>",
"<NSAutoresizingMaskLayoutConstraint:0x10053ff10 h=--& v=&-- V:[ITControlPanelChildView:0x10192e4f0(317)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>
これはまさに私が変更しようとしている制約です。なぜこれが起こっているのか誰かが私に説明できますか?
編集
が自動的に追加されることを読みました。NSAutoresizingMaskLayoutConstraint
これを設定すると無効にできます[self setTranslatesAutoresizingMaskIntoConstraints:NO];
。
無効にすると動作します。
NSAutoresizingMaskLayoutConstraint
作成されたものにアクセスできればさらに良いでしょう。誰かがこれがどのように機能するか知っていますか?