我必须在自定义的UITableViewCell中以编程方式添加一些约束,我有一个mainView(红色),它将是一个容器(cell.contentView的子视图),图像和mainView的其他2个子视图。
这就是我想要的(蓝色和黄色视图的高度不同,但这是另一个问题):
使用下面的代码(我还没有添加imageView),我有这个:
如您所见,两个子视图具有相同的大小,当我滚动时,有时会显示蓝色视图,有时会是黄色视图。
代码:
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个文本,未做任何修改,并且按预期显示。
2个问题:
最佳答案
一些想法:
@"V:|-[blueView][yellowView]-|"
blueView
和yellowView
的高度异常的原因是您的约束不明确。您可以定义蓝色和黄色一起跨越其共享 super 视图的高度,但是您可以将其留给iOS来精确确定每个单独的高度。可以通过在调试器中运行您的应用程序来确认这种歧义,一旦应用程序完成了这组特定视图的显示后暂停该应用程序,然后在(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像素,并且应该调整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可以将蓝色和黄色设置为任何旧的随机高度(包括将一个零高度设置为另一个,而另一个高度占据其余空间)没问题,否则您需要一些约束条件来表明有关其高度的规则每个都是。
UILabel
控件替换蓝色和黄色视图时,它起作用的原因是标签具有固有的高度限制,这将使它们变为非零高度,这意味着您将同时看到两个视图。但是通过简单的UIView
控件,没有固有的最小高度,因此可以自由地将蓝色或黄色设置为想要满足您的约束的任何大小,包括将一个或另一个设置为零高度。 这里有很多不同的选择。虽然您告诉我们您不希望蓝色和黄色具有相同的高度,但是您没有向我们描述什么将决定它们的相对高度。如果没有一些您想要指示相对蓝色和黄色高度的规则的信息,我们很难为您提供帮助。
关于iphone - 自动布局以编程方式不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17635837/