gpt4 book ai didi

iphone - 以编程方式自动布局不起作用

转载 作者:行者123 更新时间:2023-12-01 19:09:22 24 4
gpt4 key购买 nike

我必须在自定义的 UITableViewCell 中以编程方式添加一些约束,我有一个 mainView(红色),它将是一个容器(cell.contentView 的 subview )、一个图像和 mainView 的其他 2 个 subview 。

这就是我想要的(蓝色和黄色 View 的高度不同,但这是另一个问题):

enter image description here

使用下面的代码(我还没有添加 imageView),我有这个:

enter image description here

如您所见,两个 subview 具有相同的大小,当我滚动时,有时会显示蓝色 View ,有时会显示黄色 View 。

代码 :

self.mainView = [[UIView alloc]init];
[self.mainView setBackgroundColor:[UIColor redColor]];
[self.mainView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.contentView addSubview:self.mainView];

UIView *blueView = [[UIView alloc]init];
[blueView setTranslatesAutoresizingMaskIntoConstraints:NO];
[blueView setBackgroundColor:[UIColor blueColor]];
[self.mainView addSubview:blueView];

UIView *yelloView = [[UIView alloc]init];
[yelloView setBackgroundColor:[UIColor yellowColor]];
[yelloView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.mainView addSubview:yelloView];
NSDictionary *views = NSDictionaryOfVariableBindings(blueView,yelloView,mainView);

NSMutableArray *results = [NSMutableArray array];
NSString *mainContentView_CVF_H = @"H:|-[blueView]-|";
NSString *mainContentView_CVF_V = @"V:|-[blueView]";
NSArray *mainContentViewConstaints_H = [NSLayoutConstraint constraintsWithVisualFormat:mainContentView_CVF_H options:0 metrics:nil views:views];
NSArray *mainContentViewConstaints_V = [NSLayoutConstraint constraintsWithVisualFormat:mainContentView_CVF_V options:0 metrics:nil views:views];
[results addObjectsFromArray:mainContentViewConstaints_H];
[results addObjectsFromArray:mainContentViewConstaints_V];

NSString *delivelyView_CVF_H = @"H:|-[yelloView]-|";
NSString *delivelyView_CVF_V = @"V:[blueView][yelloView]-|";
NSArray *delivelyViewConstaints_H = [NSLayoutConstraint constraintsWithVisualFormat:delivelyView_CVF_H options:0 metrics:nil views:views];
NSArray *delivelyViewConstaints_V = [NSLayoutConstraint constraintsWithVisualFormat:delivelyView_CVF_V options:0 metrics:nil views:views];
[results addObjectsFromArray:delivelyViewConstaints_H];
[results addObjectsFromArray:delivelyViewConstaints_V];

[self.mainView addConstraints:results];


NSString *mainView_CVF_H = @"H:|-[mainView]-|";
NSString *mainView_CVF_V = @"V:|-[mainView]-|";
results = [NSMutableArray array];
NSArray *mainViewConstaints_H = [NSLayoutConstraint constraintsWithVisualFormat:mainView_CVF_H options:0 metrics:nil views:views];
NSArray *mainViewConstaints_V = [NSLayoutConstraint constraintsWithVisualFormat:mainView_CVF_V options:0 metrics:nil views:views];
[results addObjectsFromArray:mainViewConstaints_H];
[results addObjectsFromArray:mainViewConstaints_V];

[self.contentView addConstraints:results];

我用 2 个文本文件替换 subview (蓝色和黄色),没有任何修改,它们按预期显示。

2个问题:
  • 你能帮我吗 :) ?
  • 添加约束的顺序很重要吗?
  • 最佳答案

    几个想法:

  • 不,约束的顺序并不重要。
  • 顺便说一句,您可以将两个垂直约束 VLF 合并为一个:
    @"V:|-[blueView][yellowView]-|"
  • blueView 的奇怪高度的原因和 yellowView是你的约束是模棱两可的。你定义蓝色和黄色一起,应该跨越他们共享的 super View 的高度,但是你让 iOS 来精确地决定每个人的高度。这种歧义可以通过在调试器中运行您的应用程序来确认,一旦应用程序完成呈现这组特定 View 后暂停应用程序,然后在 (lldb)提示可以输入:
    po [[UIWindow keyWindow] _autolayoutTrace]

    您可能会看到类似于以下简化示例的结果:
    $0 = 0x075667b0 
    *<UIWindow:0x718a760>
    | *<UIView:0x718d090>
    | | *<UIView:0x7562490>
    | | | *<UIView:0x75627d0> - AMBIGUOUS LAYOUT
    | | | *<UIView:0x7562880> - AMBIGUOUS LAYOUT

    最重要的是,您必须解决这种歧义。如果您希望它们具有相同的高度(我知道您不需要,但只是一个示例),您可以这样做:
    @"V:|-[blueView][yellowView(==blueView)]-|"

    或者如果你想说blueView应该是 44 px,它应该调整大小 yellowView剩下的就是:
    @"V:|-[blueView(44)][yellowView]-|"

    如果你想说blueView应该是 yellowView 高度的两倍,您也可以这样做,但不能使用 VFL:
    [mainView addConstraint:[NSLayoutConstraint constraintWithItem:blueView
    attribute:NSLayoutAttributeHeight
    relatedBy:NSLayoutRelationEqual
    toItem:yellowView
    attribute:NSLayoutAttributeHeight
    multiplier:2.0
    constant:0.0]];

    但最重要的是,除非您对 iOS 将蓝色和黄色设置为任何旧的随机高度(包括使一个零高度和另一个占用其余空间)感到满意,否则您需要一些约束来指示一些关于它们应该多高的规则每个都是。
  • 将蓝色和黄色 View 替换为 UILabel 的原因控件,是标签具有内在的高度约束,这将使它们的高度非零,这意味着您将同时看到两个 View 。但是用简单的UIView控件,没有内在的最小高度,因此可以自由地将蓝色或黄色设为任何想要满足您的约束的大小,包括将一个或另一个设为零高度。

  • 这里有很多不同的选择。虽然您告诉我们您不希望蓝色和黄色具有相同的高度,但您没有向我们描述什么将决定它们的相对高度。如果没有关于您想要规定相对蓝色和黄色高度的规则的一些信息,我们很难为您提供帮助。

    关于iphone - 以编程方式自动布局不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635837/

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