如何在 iOS 8 中更改 NSLayoutConstraint 的“乘数”属性的值

Posted

技术标签:

【中文标题】如何在 iOS 8 中更改 NSLayoutConstraint 的“乘数”属性的值【英文标题】:How to change the value of 'mutiplier' property of NSLayoutConstarint in iOS8 【发布时间】:2015-06-04 03:55:54 【问题描述】:

我使用自适应布局功能来设计应用。我采用“Aspect Ratio”约束的IBOutlet。我想将此纵横比值的值更改为当前值的两倍。问题是“constraint”属性可以从代码中轻松设置,但“multiplier”属性是只读属性。对于纵横比更改,“乘数”值更改是必要的。我该怎么做?

@property (retain, nonatomic) IBOutlet NSLayoutConstraint *leftImageWidthAspectRatio;

在代码中

NSLog(@"cell.leftImageWidthAspectRatio:%@ : %lf  %lf",cell.leftImageWidthAspectRatio, cell.leftImageWidthAspectRatio.constant,cell.leftImageWidthAspectRatio.multiplier);

结果

 cell.leftImageWidthAspectRatio:<NSLayoutConstraint:0x7c9f2ed0 UIView:0x7c9f2030.width == 2*RIFeedThumbImageView:0x7c9f2c90.width> : 0.000000  2.000000

【问题讨论】:

【参考方案1】:

您是对的 - 不支持更改现有约束的乘数。 constant 是例外,而不是规则。来自docs:

与其他属性不同,常量可以在约束创建后修改。在现有约束上设置常量比删除约束并添加一个与旧约束完全相同的新约束要好得多,只是它具有不同的常量。

您需要做的是最后描述的内容:将现有约束替换为相同但具有不同乘数的约束。像这样的东西应该可以工作:

NSLayoutConstraint *oldConstraint = cell.leftImageWidthAspectRatio;
CGFloat newMultiplier = 4; // or whatever
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:oldConstraint.firstItem attribute:oldConstraint.firstAttribute relatedBy:oldConstraint.relation toItem:oldConstraint.secondItem attribute:oldConstraint.secondAttribute multiplier:newMultiplier constant:oldConstraint.constant];
newConstraint.priority = oldConstraint.priority;
[cell removeConstraint:oldConstraint];
[cell addConstraint:newConstraint];

请注意,cell 可能是错误的视图——这取决于 IB 决定将原始约束放在哪里。如果这不起作用,请挖掘受约束视图的超级视图(您可以使用 constraints 属性检查它们有哪些约束),直到找到它的结束位置。

【讨论】:

【参考方案2】:

这个问题的一个简单的解决方案,我觉得是这样的

    为宽度设置另一个约束 更改纵横比的优先级(小于宽度约束优先级); 借助纵横比multipile属性更改宽度约束值

@property (nonatomic,weak) IBOutlet NSLayoutConstraint *leftImagewidthConstaint;

@property (retain, nonatomic) IBOutlet NSLayoutConstraint *leftImageWidthAspectRatio;

在代码中

cell.leftImageWidthAspectRatio.priority=500;
    cell.leftImagewidthConstaint.constant =cell.leftImagewidthConstaint.constant*cell.leftImageWidthAspectRatio.multiplier;

这成功了

【讨论】:

以上是关于如何在 iOS 8 中更改 NSLayoutConstraint 的“乘数”属性的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 8 中更改 NSLayoutConstraint 的“乘数”属性的值

如何在 ios 中安全地更改部署目标

更改全局色调颜色 - iOS 7/iOS 8

ios 8 更改呈现/模态视图控制器的大小

iOS 8 自定义键盘方向更改

iOS 8 今日界面生成器