Mar*_*lme 22 xcode interface-builder ios autolayout
在Interface Builder中进行了一些可视化布局后,我创建了一些我想在运行时访问的约束.有没有办法在Interface Builder中标记或识别约束,以便以后查找它们?
我想要这样做的原因是我需要根据视觉指定的约束执行一些计算.我知道Apple提供了可视格式语言,我可以在控制器中以编程方式指定约束.我宁愿不使用这种方法,所以我不会失去IB的设计时反馈.
建立引用插座确实有效,但问题仍然存在.
vac*_*ama 33
更新:
正如所解释的巴特洛梅耶Semańczyk 他的回答,现在有一个标识符字段中可见属性检查器为NSLayoutConstraint使其不必暴露自己这一领域.只需在" 文档大纲"视图或"故事板"视图中选择约束,然后在右侧的" 属性"检查器中添加标识符.
早期答案:
是的,这可以做到. NSLayoutConstraint有一个名为identifierthan 的属性可以在Interface Builder中公开并分配.为了演示这个,我创建了一个单视图应用程序,它有一个红色框的子视图.此子视图有4个约束:宽度,高度,在容器中水平居中,在容器中垂直居中.我redBoxWidth通过执行以下操作给宽度约束标识符:
单击" 文档布局视图"中的宽度约束.然后在身份检查下用户自定义属性运行,点击+下的关键路径.将keyPath更改为identifier,将Type Boolean更改为String,并将Value设置为redBoxWidth.
然后在ViewDidLoad其中可以按名称查找约束并更改其值:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
for subview in view.subviews as [UIView] {
for constraint in subview.constraints() as [NSLayoutConstraint] {
if constraint.identifier == "redBoxWidth" {
constraint.constant = 300
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)Bar*_*zyk 13
但是,如果在代码中设置约束,请执行以下操作:
let constraint = NSLayoutConstraint()
constraint.identifier = "identifier"
Run Code Online (Sandbox Code Playgroud)对于您在故事板中设置的这些约束,但您必须在代码中设置标识符:
for subview in view.subviews {
for constraint in subview.constraints() {
constraint.identifier = "identifier"
}
}
Run Code Online (Sandbox Code Playgroud)小智 9
您也可以像对任何其他组件一样将约束链接到控制器的属性.只需按住Ctrl键将其拖入您的代码:
然后它将在您的控制器的代码中作为属性访问:
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *myConstraint;
Run Code Online (Sandbox Code Playgroud)
你可以改变它的价值,例如:
self.myConstraint.constant=100.;
Run Code Online (Sandbox Code Playgroud)
只需添加@ vacawama的答案.您可以UIView使用简单函数编写类别并拉出约束,而不是在需要查找约束的任何位置复制/粘贴循环:
.h文件:
#import <UIKit/UIKit.h>
@interface UIView (EasyAutolayout)
-(NSLayoutConstraint *)constraintForIdentifier:(NSString *)identifier;
@end
Run Code Online (Sandbox Code Playgroud)
.m文件:
#import "UIView+EasyAutolayout.h"
@implementation UIView (EasyAutolayout)
-(NSLayoutConstraint *)constraintForIdentifier:(NSString *)identifier {
for (NSLayoutConstraint *constraint in self.constraints) {
if ([constraint.identifier isEqualToString:identifier]) {
return constraint;
}
}
return nil;
}
@end
Run Code Online (Sandbox Code Playgroud)
小智 5
获取自动布局约束的IBOutlet.
在NSLayoutConstraint类中有一个名为constant的属性.
例如,您已经从IB的任何视图中获取了IBOutlet的高度约束,并且您想要以编程方式更改它的高度,您需要做的就是:
constraint.constant = isMoreHeight ? height1 : height2;
Run Code Online (Sandbox Code Playgroud)
执行此操作后,您需要更新superview的视图层次结构中的所有其他视图.为此,您需要在下面写一行:
[self setLayoutIfNeeded];
Run Code Online (Sandbox Code Playgroud)
为了获得更好的用户体验,您可以将此行放在动画块中,以获得更平滑的过渡效果,
[UIView animateWithDuration:0.3f animations:^{
[self.view layoutIfNeeded];
}];
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助..
| 归档时间: |
|
| 查看次数: |
15394 次 |
| 最近记录: |