1. ホーム
  2. ios

[解決済み] オートレイアウトでサブビューのXをセンタリングすると、"not prepared for the constraint "と表示される。

2023-07-02 18:28:34

質問

カスタムUIViewのサブクラスがあり、nibを介して初期化されています。

-awakeFromNib で、サブビューを作成し、それをそのスーパービューでセンタリングしようとしています。

[self setInteralView: [[UIView alloc] init]];
[[self internalView] addConstraint: [NSLayoutConstraint constraintWithItem: [self internalView]
                                                                 attribute: NSLayoutAttributeCenterX
                                                                 relatedBy: NSLayoutRelationEqual
                                                                    toItem: self
                                                                 attribute: NSLayoutAttributeCenterX
                                                                multiplier: 1
                                                                  constant: 0]];

これが破綻して、以下のような出力になります。

2013-08-11 17:58:29.628 MyApp[32414:a0b] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
    When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2013-08-11 17:58:29.630 MyApp[32414:a0b] View hierarchy unprepared for constraint.
    Constraint: <NSLayoutConstraint:0xc1dcc80 UIView:0xc132a40.centerX == MyView:0xc1315a0.centerX>
    Container hierarchy: 
<UIView: 0xc132a40; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0xc132bc0>>
    View not found in container hierarchy: <MyView: 0xc1315a0; frame = (-128 -118; 576 804); layer = <CALayer: 0xc131710>>
    That view's superview: <UIView: 0xc131a70; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0xc131b50>>

どのように解決するのですか?

エラーにあるように、制約に関係するビューが、制約を追加するビューまたはそのビューのサブビューであるようなビューに制約を追加する必要があります。 上記のコードの場合、その制約を self ではなく [self internalView] . このように動作しない理由は、制約に含まれるビューの1つ ( self )だけを考慮した場合、ビュー階層にない [self internalView] 以下)にある。

詳細については の議論セクションを参照してください。 にある addConstraint: メソッドについて説明します。

以下は、私が提案したように修正されたあなたのコードの行です。

UIView* internalView = [[UIView alloc] initWithFrame:CGRectZero];
internalView.translatesAutoresizingMaskIntoConstraints = NO;
[self setInternalView:internalView];

[self addConstraint: [NSLayoutConstraint constraintWithItem: [self internalMapView]
                                         attribute: NSLayoutAttributeCenterX
                                         relatedBy: NSLayoutRelationEqual
                                         toItem: self
                                         attribute: NSLayoutAttributeCenterX
                                         multiplier: 1
                                         constant: 0]];