在其他两个视图之间插入视图

Inserting view between two other views

我已经为 IOS objective c 编程了很长时间了,但在这样的情况下,每次我执行一个简单的程序时就开始计算距离对我来说感觉很疯狂UI 如此操作:

假设我有一个带有几个标签的页面:

NAME : MATAN
MUSIC : TECHNO
AGE : 26

现在在一些特定的情况下,我想在"MUSIC"和"AGE"之间再插入一个标签。

通常我会检查新标签的高度,然后将 "AGE" 标签按代码向下移动。

太疯狂了,我还没有找到比这更好的方法,因为在处理更复杂的视图时,这变得很难!

有什么建议吗?

我建议您将它们全部放在 UITableView 中,它专为此类内容而设计,并且具有 insert/remove 个单元格的机制..

您始终可以使用 tableView 来简化操作。

如果没有,请阅读有关约束的内容。也许你已经知道了。但如果你能正确地做到这一点,他们会提供很大的帮助。

Read more about constraints here

有人提到使用约束。这应该让你为那种事情指明正确的方向

self.automaticallyAdjustsScrollViewInsets = NO;

UILabel *label1 = [[UILabel alloc] init];
UILabel *label2 = [[UILabel alloc] init];

label1.text = @"NAME : MATAN";
label2.text = @"AGE : 26";

[self.view addSubview:label1];
[self.view addSubview:label2];

[label1 setTranslatesAutoresizingMaskIntoConstraints: NO];
[label2 setTranslatesAutoresizingMaskIntoConstraints: NO];

NSDictionary * viewsDictionary = NSDictionaryOfVariableBindings(label1, label2);

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[label1]-20-|" options:0 metrics: 0 views:viewsDictionary]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[label2]-20-|" options:0 metrics: 0 views:viewsDictionary]];
NSArray * vertConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[label1]-10-[label2]" options:0 metrics: 0 views:viewsDictionary];

[self.view addConstraints:vertConstraint];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

    UILabel *label3 = [[UILabel alloc] init];
    label3.text = @"MUSIC : TECHNO";
    [label3 setTranslatesAutoresizingMaskIntoConstraints: NO];

    [self.view addSubview:label3];

    NSDictionary * viewsDictionary = NSDictionaryOfVariableBindings(label1, label2, label3);

   [self.view removeConstraints:vertConstraint];

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[label3]|" options:0 metrics: 0 views:viewsDictionary]];

    NSArray * newVertConstraint = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[label1]-10-[label3]-10-[label2]" options:0 metrics: 0 views:viewsDictionary];

    [self.view addConstraints:newVertConstraint];

});

鉴于您必须添加的样板代码数量,用于此用途的 UITableView 有点矫枉过正。更好的解决方案是使用两个重叠的容器视图控制器,每个都包含所需标签的正确固定布局。您可以通过编程方式分别启用和禁用这两个容器。有关示例,请参阅下面的 Apple 指南:

https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html