为什么界面生成器不能为约束设置负数倍,即使[NSLayoutConstraint constraintWithItem:]可以?

时间:2017-01-08 05:22:41

标签: ios objective-c xcode

我有一个iOS 9&amp; 10个应用程序,有一个小托盘&#34; UIView沿着窗口底部滑入和滑出以显示(或隐藏)某些控件。默认情况下,托盘已完全显示(&#34;滑出&#34;),以便用户可以看到所有内容。最右边有一个按钮,他们可以点按这个按钮使托盘滑入&#34;向左,使托盘大部分隐藏,因为它现在离屏幕左侧。 (最右边的20个点是&#34;拇指&#34;用户可以点击滑入/滑出,因此当托盘滑入时,拇指是托盘中唯一可见的部分。)< / p>

我想这样做的方法是通过Interface Builder定义两个不同的约束,我只需切换它们,这样一次只有一个是活动的。例如,两个约束可能是:

trayOutConstraint:

  

trayView.leading =(superview.leading * 1)+ 0 // result == 0

trayInConstraint:

  

trayView.leading =(superview.trailing * -1)+ 20 // result == -300(例如)

事实证明,我可以通过编程方式为trayInConstraint创建约束(编辑:展开以显示我如何禁用故事板的默认约束并添加新约束 ):

// Disable the default constraint (in the storyboard)
[[self trayTripOutLeadingConstraint] setActive:NO];

// Create the new constraint (add to an array by itself)
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:(id)trayView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:(id)[trayView superview] attribute:NSLayoutAttributeTrailing multiplier:-1 constant:20];
NSArray *newTrayConstraintsArray = [[NSArray alloc] initWithObjects:newConstraint, nil];

// Remove any existing constraints array and use the new one    
[[self view] removeConstraints:[self tripTrayConstraints]];
[self setTripTrayConstraints:newTrayConstraintsArray];
[[self view] addConstraints:newTrayConstraintsArray];

但是如果我尝试在Interface Builder中创建它,我就不能将乘数设置为1.0以外的任何值。 (键入任何其他值只会强制它重置为&#34; 1&#34;。)

我在Apple文档https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/AnatomyofaConstraint.html中看到:

  

您不能使用非同一性乘数(1.0以外的值)   位置属性。

但为什么我可以在代码中创建它而不是IB?

(不相关可能对其他人有用:我也想创建一个约束,其中倍数为0但不能以编程方式或在IB中执行。我发现我可以解决无法使用的问题&#34; 0.0&#34;作为乘数而是使用非常小的东西,例如0.000001。)

2 个答案:

答案 0 :(得分:3)

选择"Reverse First And Second Item"并重新输入乘数的绝对值=&gt;这种方式(通过切换第一项和第二项)乘数的行为就像是负数。

Reverse First And Second Item

第一项:View.Leading
第二项:Superview.Trailing

normal

第一项:Superview.Trailing
第二项:View.Leading

reversed

答案 1 :(得分:0)

您可以为leading, trailing, top and bottom constraints simply指定负值。但是,无法从代码或“接口”构建器中为任何乘数分配负值。如果您在代码中添加任何负值作为乘数,编译器将其视为+1,您可能会得到意外结果。 (在您的情况下,您可能会意外得到预期的结果)