我在IB中设置了多组约束,我想根据某些状态以编程方式在它们之间切换.有一个constraintsA出口集合,所有出口集合都标记为从IB安装,constraintsB出口集合全部在IB中卸载.
我可以编程方式在两个集之间切换,如下所示:
NSLayoutConstraint.deactivateConstraints(constraintsA)
NSLayoutConstraint.activateConstraints(constraintsB)
Run Code Online (Sandbox Code Playgroud)
但是......我无法弄清楚何时这样做.看起来我应该能够做到这一点viewDidLoad,但我不能让它工作.我已经尝试过调用view.updateConstraints()并view.layoutSubviews()在设置约束后,但无济于事.
我确实发现,如果我设置约束,viewDidLayoutSubviews一切都按预期工作.我想我想知道两件事......
我已经为我的视图控制器使用了自动布局.我已经在约束中设置了V和H位置,但我想知道当它变为5s,6和6 Plus时如何增加我的按钮大小.这是我为登录按钮添加约束的方式:
NSArray *btncon_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnLogin(40)]" options:0 metrics:nil views:viewsDictionary];
[btnLogin addConstraints:btncon_V];
NSArray *btncon_POS_H=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-100-[btnLogin]-100-|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_H];
NSArray *btncon_POS_V=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-70-[Title]-130-[lblFirst]-0-[lblSecond]-20-[textusername]-10-[txtpassword]-10-[btnLogin]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:btncon_POS_V];
Run Code Online (Sandbox Code Playgroud)
但我的问题是,虽然它管理左侧和右侧间隙,但由于高度固定,它在iPhone 6和6 Plus中得到了拉伸.如何根据屏幕尺寸增加尺寸?我认为这可能是宽高比,但我如何在代码中设置宽高比约束?
如何使用Swift更改约束的乘数.
someConstraint.multiplier = 0.6 // error: 'multiplier' is get-only property
Run Code Online (Sandbox Code Playgroud)
我想知道如何更改代码中的乘数(Swift).
我有这个简单的观点:
- (void)viewDidLoad
{
[super viewDidLoad];
redBox = [[UIView alloc] init];
[redBox setBackgroundColor:[UIColor redColor]];
[redBox setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:redBox];
//H:
widthConstraint = [NSLayoutConstraint constraintWithItem:redBox
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:0.5
constant:0.0];
[self.view addConstraint:widthConstraint];
//More constraints...
}
Run Code Online (Sandbox Code Playgroud)
我想动画一下redBox宽度的增加.
我试过这个:
widthConstraint.constant = 100;
[UIView animateWithDuration:1
animations:^{
[self.view layoutIfNeeded];
}
];
Run Code Online (Sandbox Code Playgroud)
这会将视图的宽度增加100并对其进行动画处理,但我需要将其增加一个与其超视图宽度成比例的量.换句话说,我想设置widthConstraintS" multiplier来0.8.
但是NSLayoutConstraint的multiplier是只读的!这是否意味着我widthConstraint每次想要对其进行动画修改时都必须删除,修改和重新添加,multiplier还是有更好的方法?
我试图以编程方式设置swift中乘数的约束,当我设置值时,它只是给我错误,"不能分配给这个表达式的结果"......
我用一个IBOutlet声明了NSLayoutConstraint,然后设置乘数,就像我对另一个常量一样,这很好,但是这个不会接受它......
@IBOutlet weak var clockWidthConstraint: NSLayoutConstraint!
override func updateViewConstraints() {
super.updateViewConstraints()
confirmTopConstraint.constant = 40.0
clockWidthConstraint.multiplier = 0.1 // Gives me the error!
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我正在开发一个目标为iOS7的应用程序,当我将应用程序部署到iPhone 4时出现以下错误.
[NSLayoutConstraint setActive:]: unrecognized selector sent to instance
Run Code Online (Sandbox Code Playgroud)
我调查了这个,结果setActive是在iOS8中引入的.问题是,setActive约束的替代方法是什么,大约是iOS7?我需要以编程方式操纵约束,似乎无法在任何地方找到答案.
如何以编程方式修改约束的乘数?我设置了以下内容:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:0.5 constant:0.0]];
Run Code Online (Sandbox Code Playgroud)
我需要将其修改为:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:_button attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]];
Run Code Online (Sandbox Code Playgroud) 我注意到,当我以编程方式更新自动布局约束时,在旋转屏幕时会恢复所有更改.
重现问题:
带有UIView的基本Storyboard界面和2个约束:
使用IBOutlet创建并链接这两个约束
对我来说似乎是一个错误.
你怎么看 ?
截图:
约束#1:
约束#2:
ios ×9
autolayout ×6
constraints ×4
swift ×4
objective-c ×2
ios7 ×1
iphone ×1
uikit ×1
uiview ×1