AutoLayout - 基于更高视图的等高

AutoLayout - equal heights based on taller view

这在概念上类似于 Autolayout height equal to MAX(multiple view heights) 除了问题是调整容器视图的大小,但我希望两个按钮的大小都调整为最大高度按钮的高度。


我有两个按钮 side-by-side 在视图的页脚部分。我希望按钮具有相同的宽度,所以我应用了一个约束使它们具有相同的宽度并且效果很好。我还希望它们具有相同的高度,以防其中一个按钮的标题超过一行。我尝试将两个按钮的高度设置为相同,但是当我这样做时,在确定两个按钮的高度时总是使用较短的按钮。例如,如果第一个按钮只有一行文本而第二个按钮是三行文本,那么两个按钮的大小都将只适合一行文本。如果交换文本以便第一个按钮应该更高,也会发生同样的事情。

我也为两个按钮设置了内容压缩优先级和压缩阻力优先级,但这似乎仍然没有帮助,或者我设置错误。

[self->_firstButton setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
[self->_firstButton setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
        
[self->_firstButton setContentHuggingPriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal];
[self->_firstButton setContentHuggingPriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisVertical];

并且为第二个按钮设置相同的优先级。

这是使两个按钮大小相同的约束条件,这些约束条件确实有效,因为按钮的宽度和高度相同,但同样的问题是高度是较短按钮的高度 (标题文本较短的按钮)。

[self.firstButton.heightAnchor constraintEqualToAnchor:self.secondButton.heightAnchor],
[self.firstButton.widthAnchor constraintEqualToAnchor:self.secondButton.widthAnchor]

有人看到我可能做错了什么吗?或者有谁知道如何解决这个问题,使两个按钮的高度都是较高按钮(标题较长的按钮)的高度,而不是标题较短的按钮的高度?

我的评论不太正确...

IF 您已经在您的自定义视图/控件中正确设置了约束,或者如果您正确设置了它的固有大小,您可以在很少的约束下获得所需的结果......即使视图不包含在堆栈视图或其他“容器”视图中。

例如,这段代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UILabel *v1 = [UILabel new];
    v1.backgroundColor = [UIColor cyanColor];
    v1.textAlignment = NSTextAlignmentCenter;
    v1.numberOfLines = 0;
    v1.text = @"One Line";
    
    UILabel *v2 = [UILabel new];
    v2.backgroundColor = [UIColor greenColor];
    v2.textAlignment = NSTextAlignmentCenter;
    v2.numberOfLines = 0;
    v2.text = @"Lots of text to force the label to wrap onto multiple lines.";

    for (UIView *v in @[v1, v2]) {
        v.translatesAutoresizingMaskIntoConstraints = NO;
        [self.view addSubview:v];
    }
    
    UILayoutGuide *g = [self.view safeAreaLayoutGuide];

    [NSLayoutConstraint activateConstraints:@[
        
        [v1.leadingAnchor constraintEqualToAnchor:g.leadingAnchor constant:20.0],
        [v2.trailingAnchor constraintEqualToAnchor:g.trailingAnchor constant:-20.0],
        
        [v1.bottomAnchor constraintEqualToAnchor:g.bottomAnchor constant:-20.0],
        [v2.bottomAnchor constraintEqualToAnchor:g.bottomAnchor constant:-20.0],

        [v1.widthAnchor constraintEqualToAnchor:v2.widthAnchor],
        [v2.leadingAnchor constraintEqualToAnchor:v1.trailingAnchor constant:20.0],
        
        [v1.heightAnchor constraintEqualToAnchor:v2.heightAnchor],
        
    ]];
    
    // not striclty needed, but to make sure they don't compress
    [v1 setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
    [v2 setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisVertical];
}

产生这个结果:

并且,通过仅更改两个标签中的文本