以编程方式在 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

使用自动布局iOS以编程方式滚动到特定页面/位置

iOS - 以编程方式使用自动布局将 UIView 定位在超级视图的中心

以编程方式自动布局垂直ios时出错