10

スーパー ビューの幅に基づいて、自動レイアウト マネージャーにビューの中心点を調整させようとしています。それが属性の「無効なペアリング」である理由がわかりません(クラッシュと NSInvalidArgumentException によって通知されます)

UIView *ac;
NSLayoutConstraint *cXloc = [NSLayoutConstraint constraintWithItem:ac 
                                                         attribute:NSLayoutAttributeCenterX 
                                                         relatedBy:NSLayoutRelationEqual 
                                                            toItem:ac.superview 
                                                         attribute:NSLayoutAttributeWidth 
                                                        multiplier:.1 
                                                          constant:x*ac.superview.frame.size.width*.2];
[ac.superview addConstraint:cXloc];

これが「無効なペアリング」である理由と、これにどのようにアプローチすべきかを誰かが説明できますか? ありがとう

4

4 に答える 4

4

これは、 の現在の実装の制限ですAuto LayoutNSLayoutAttributeただし、すべての制約が線形であり、相関しているため、簡単に回避できます。たとえば、必要な制約は次のとおりです。

subview.centerX = m * superview.width + c;

tow 間の関係として表現できますcenterX

// Since width == 2 * centerX
subview.centerX = m * 2 * superview.centerX + c;
于 2013-04-19T23:32:49.667 に答える
3

acのAttributeCenterXをそのスーパービューのAttributeCenterX、AttributeLeading、またはAttributeTrailingに関連付ける場合は、乗数と制約を使用して目的の制約を表現できるはずです。定数は制約が作成されたときにのみ評価され、例の定数はac.superviewの幅が変更されても更新されないことに注意してください。

そのスーパービューに対してACをどのように配置したいかを言葉で表現できる場合は、制約を提案できます。

編集

これは5つのNSButtonの例です。それら自体とそれらの間のスペースは、スペースがボタンの30%の幅になり、すべてのボタンの幅が同じになり、すべてのスペースの幅が同じになるように拡張されます。間隔を空けるためだけに4つの非表示のNSViewを作成することは、特に自動レイアウトの外部で機能していることを考えると、かなり面倒です。しかし、興味がある場合は:

// Assuming these NSViews and NSButtons exist,
//NSView* superview ;
//NSButton *buttonOne, *buttonTwo, *buttonThree, *buttonFour, *buttonFive ;


[superView removeConstraints:superView.constraints] ;

// Create empty NSViews to fill the space between the 5 buttons.
NSView* spaceOne = [NSView new] ;
NSView* spaceTwo = [NSView new] ;
NSView* spaceThree = [NSView new] ;
NSView* spaceFour = [NSView new] ;
spaceOne.translatesAutoresizingMaskIntoConstraints = NO ;
spaceTwo.translatesAutoresizingMaskIntoConstraints = NO ;
spaceThree.translatesAutoresizingMaskIntoConstraints = NO ;
spaceFour.translatesAutoresizingMaskIntoConstraints = NO ;
[superView addSubview:spaceOne] ;
[superView addSubview:spaceTwo] ;
[superView addSubview:spaceThree] ;
[superView addSubview:spaceFour] ;

NSDictionary* views = NSDictionaryOfVariableBindings(superView,buttonOne,buttonTwo,buttonThree,buttonFour,buttonFive,spaceOne,spaceTwo,spaceThree,spaceFour) ;

// Vertically align buttonOne to its superview however you like.
[superView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonOne]"  options:0  metrics:nil  views:views ] ] ;

// Make the "space" NSViews' widths equal and >= 10. Make the buttons' widths equal.
[superView addConstraints: [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[buttonOne][spaceOne(>=10)][buttonTwo(==buttonOne)][spaceTwo(==spaceOne)][buttonThree(==buttonOne)][spaceThree(==spaceOne)][buttonFour(==buttonOne)][spaceFour(==spaceOne)][buttonFive(==buttonOne)]|"  options: NSLayoutFormatAlignAllCenterY  metrics:nil  views:views ] ] ;
// Make the "space" NSViews' widths 30% of the NSButtons' widths.
[superView addConstraint: [NSLayoutConstraint constraintWithItem: spaceOne
                                                       attribute: NSLayoutAttributeWidth
                                                       relatedBy: NSLayoutRelationEqual
                                                          toItem: buttonOne
                                                       attribute: NSLayoutAttributeWidth
                                                      multiplier: 0.3
                                                        constant: 0 ] ] ;
于 2012-12-14T14:49:46.157 に答える