gpt4 book ai didi

ios - NSLayoutConstraint 以编程方式设置 View 框架

转载 作者:行者123 更新时间:2023-11-29 01:33:36 25 4
gpt4 key购买 nike

我知道有类似的主题,但我不知道如何做简单的事情,例如,使用自动布局约束以编程方式设置 View 框架。使用 Storyboard 很容易做到,但是当我尝试了解 NSLayourConstraint 时,我意识到我不理解主题。

假设我们有 UIView 和 3 个按钮。顶部的第一个按钮有 3 个约束(前导和尾随,以及 View 顶部)。其他 2 个按钮与该按钮水平居中且宽度相等。它的布局非常简单,我上传截图:

enter image description here

我读过有关视觉格式语言的内容,但我无法理解的是 - 如何创建约束,例如,中继到顶部(或尾随领先)?像下面这样: enter image description here

任务看起来非常简单,但我仍然没有找到如何使用 NSLayoutConstraint 以编程方式执行此操作的方法。你能提供一个解决方案吗?谢谢。

最佳答案

这是一个解决方案(应该放在 -viewDidLoad 中)。有几点需要注意:

首先,VFL 不允许您创建所有可能类型的约束。特别是,居中需要使用 NSLayoutConstraint 上的 +constraintWithItem: 类方法来完成。

其次,正如评论中所述,您可以在水平 VFL 字符串中使用硬编码的左右 pad 值来实现居中,但如果您需要支持不同的设备尺寸,这可能会导致问题。

第三,调用 -setTranslatesAutoresizingMaskIntoConstraints: 很关键。如果您忘记了这一点,程序化自动布局将完全无法工作。此外,您还需要确保在设置约束之前将所有 View 添加到其 super View 中,否则引用 super View 的任何约束字符串都会导致崩溃

NSArray *names = @[@"button1",@"button2",@"button3"];
NSMutableDictionary *views = [[NSMutableDictionary alloc]init];

for(NSUInteger i=0;i<3;i++) {
UIButton *b = [[UIButton alloc]init];
NSString *name = names[i];
[b setTitle:name forState:UIControlStateNormal];
views[name] = b;
[b setBackgroundColor:[UIColor redColor]];
[b setTranslatesAutoresizingMaskIntoConstraints:false];
[self.view addSubview:b];
}
//List of values to be used in the constraints
NSDictionary *metrics = @{
@"buttonWidth":@150,
@"bHeight":@50, //button height
@"topPad":@100,
@"vPad":@20 //vertical padding
};

//Horizontal VFL string (repeated for all rows).

for (NSString *buttonName in views.allKeys) {
NSString *horizontalConstraintString = [NSString stringWithFormat:@"|-(>=0)-[%@(buttonWidth)]-(>=0)-|",buttonName];
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:horizontalConstraintString options:0 metrics:metrics views:views];
[self.view addConstraints:horizontalConstraints];
//Can't do centering with VFL - have to use constructor instead. You could also hardcode left and right padding in the VFL string above, but this will make it harder to deal with different screen sizes
NSLayoutConstraint *centerConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:views[buttonName] attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0];

[self.view addConstraint:centerConstraint];
}

//Vertical VFL (vertical spacing of all buttons)

NSString *verticalConstraintString = @"V:|-topPad-[button1(bHeight)]-vPad-[button2(bHeight)]-vPad-[button3(bHeight)]-(>=0)-|";
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:verticalConstraintString options:0 metrics:metrics views:views];

[self.view addConstraints:verticalConstraints];
[self.view layoutIfNeeded];

关于ios - NSLayoutConstraint 以编程方式设置 View 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33203190/

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