以编程方式在 iOS 中自动布局
Posted
技术标签:
【中文标题】以编程方式在 iOS 中自动布局【英文标题】:Autolayout in iOS Programmatically 【发布时间】:2017-04-18 10:05:01 【问题描述】:我在 ios 的一个视图中有一个标签、分段控件、文本框和 2 个按钮。 有2段。在段 1 上,视图应该看起来像 image1,在选择段 2 时,视图应该看起来像 image2。
每次点击相应的段时,它都会改变布局。
图像一是我最初得到的输出,但在下一次选择期间,它不会改变布局。我要做什么才能达到预期的效果。
下面是我的代码
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.textview.hidden = true;
self.btnSMSOut.translatesAutoresizingMaskIntoConstraints = NO;
self.btnCallOut.translatesAutoresizingMaskIntoConstraints = NO;
- (IBAction)segementA:(id)sender
if (self.segmentOutput.selectedSegmentIndex == 0)
[self.btnSMSOut removeConstraints: [self.btnSMSOut constraints]];
[self.btnCallOut removeConstraints: [self.btnCallOut constraints]];
self.textview.hidden = true;
self.btnCallOut.hidden = false;
[self view1];
else
[self.btnSMSOut removeConstraints: [self.btnSMSOut constraints]];
[self.btnCallOut removeConstraints: [self.btnCallOut constraints]];
self.textview.hidden = false;
self.btnCallOut.hidden = true;
[self view2];
- (void)view2
NSLog(@"function view 1");
NSDictionary *viewsDictionary = @@"btnSMS":self.btnSMSOut;
NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnSMS(30)]" options:0 metrics:nil views:viewsDictionary];
NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[btnSMS(288)]" options:0 metrics:nil views:viewsDictionary];
[self.btnSMSOut addConstraints:constraint_H];
[self.btnSMSOut addConstraints:constraint_V];
NSArray *constraint_VPOS = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-343-[btnSMS]" options:0 metrics:nil views:viewsDictionary];
NSArray *constraint_HPOS = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-15-[btnSMS]" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:constraint_HPOS];
[self.view addConstraints:constraint_VPOS];
- (void)view1
NSLog(@"function view 2");
NSDictionary *viewsDictionary2 = @@"btnCall":self.btnCallOut, @"btnSMS":self.btnSMSOut;
NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnCall(30)]" options:0 metrics:nil views:viewsDictionary2];
NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[btnCall(115)]" options:0 metrics:nil views:viewsDictionary2];
[self.btnCallOut addConstraints:constraint_H];
[self.btnCallOut addConstraints:constraint_V];
NSArray *constraint_VPOS = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-380-[btnSMS]" options:0 metrics:nil views:viewsDictionary2];
NSArray *constraint_HPOS = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-145-[btnSMS]" options:0 metrics:nil views:viewsDictionary2];
[self.view addConstraints:constraint_HPOS];
[self.view addConstraints:constraint_VPOS];
NSArray *constraint_H1 = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[btnSMS(30)]" options:0 metrics:nil views:viewsDictionary2];
NSArray *constraint_V1 = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[btnSMS(115)]" options:0 metrics:nil views:viewsDictionary2];
[self.btnSMSOut addConstraints:constraint_H1];
[self.btnSMSOut addConstraints:constraint_V1];
NSArray *constraint_VPOSC = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-380-[btnCall]" options:0 metrics:nil views:viewsDictionary2];
NSArray *constraint_HPOSC = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-145-[btnCall]" options:0 metrics:nil views:viewsDictionary2];
[self.view addConstraints:constraint_HPOSC];
[self.view addConstraints:constraint_VPOSC];
【问题讨论】:
[self.view layoutIfNeeded];在分段操作中调用它并检查 这只是一个建议,不要以编程方式使用自动布局。 PhaniRaghu 除了以编程方式使用自动布局之外,还有哪些替代解决方案 创建两个高度和宽度相同的容器视图,并在UISegmentedControl
下方添加。并将子视图放在容器视图中。在UISegmentedControl
上更改容器视图高度约束。
【参考方案1】:
您已在 xib 中添加元素并尝试使用在这种情况下可能不起作用的约束。最好尝试执行以下操作。
通过编程创建所有元素,如段控件、按钮、文本字段,然后添加约束。
在片段之间翻转时,删除前一个片段并添加新的片段内容。
如果您有任何问题,请告诉我。
【讨论】:
以上是关于以编程方式在 iOS 中自动布局的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ios swift 中以编程方式创建自动布局等宽约束?
如何使用自动布局在 ios 中以编程方式在 UIview 上添加 UIbutton
iOS - 以编程方式在具有自动布局的 UITextField 内定位 UIImageView