gpt4 book ai didi

ios6 - 为什么 NSLayoutAttributeCenterX 是带有 NSLayoutAttributeWidth 的 'Invalid pairing'

转载 作者:行者123 更新时间:2023-12-04 04:06:25 25 4
gpt4 key购买 nike

我试图让自动布局管理器根据 super View 的宽度调整 View 的中心点。我不明白为什么这是属性的“无效配对”(如崩溃和 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];

有人可以解释为什么这是“无效配对”以及我应该如何解决这个问题?
谢谢

最佳答案

如果您将 ac 的 AttributeCenterX 与其 super View 的 AttributeCenterX、AttributeLeading 或 AttributeTrailing 相关联,您应该能够使用乘数和约束来表达所需的约束。请记住,仅在创建约束时才计算常量,并且您的示例的常量不会随着 ac.superview 的宽度变化而更新。

如果您可以用文字表达您希望 ac 相对于其父 View 的位置,我们可以建议一个约束。

编辑

这是一个包含 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 ] ] ;

关于ios6 - 为什么 NSLayoutAttributeCenterX 是带有 NSLayoutAttributeWidth 的 'Invalid pairing',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com