UIStackView可以受到限制吗?

时间:2016-11-24 11:27:49

标签: ios cocoa-touch autolayout uistackview

我有一个UIScrollView填充所有窗口,其中包含一个垂直UIStackView,我想添加填充所有可用宽度的UILabels

UIStackView固定在UIScrollView的所有边缘,我希望它能填满所有UIScrollView。但它似乎完全忽略了所有的瑕疵,它的大小只适合它的孩子。为什么这种行为?

说明如果我以这种方式添加标签:

    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
    scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))

    for _ in 1 ... 20 {
        let textLabel = UILabel()
        textLabel.backgroundColor = UIColor.yellow
        textLabel.text  = "Hi World xxxx"
        stackView.addArrangedSubview(textLabel)
        textLabel.widthAnchor.constraint(equalTo: stackView.widthAnchor).isActive = true //Doesn't work as expected

    }

我得到的是:(青色背景是UIScrollView,您可以看到由于UIStackView约束不适用,标签不占用所有宽度

Result with stackview contraints

只有当我更改标签约束以使用scrollView时,它才能按预期工作:

textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

然后结果如预期: enter image description here

为什么这样做?有人可以解释为什么UIStackView上的约束不能像我预期的那样起作用吗?

完整的源代码avaiable at that gist

1 个答案:

答案 0 :(得分:1)

一切都是正确的。它只是你没有指定内容视图的宽度(堆栈视图)。 添加这一行,就可以完美地运行。

//NSMutableArray *numbers = [[NSMutableArray alloc] initWithArray:@[@3,@2,@1,@7,@1,@2,@3,@6,@5,@4,@4,@5,@6,@7]];
//int solution = [self maxDistanceBetweenPairs:numbers];
//NSLog(@"%d", solution);

- (int)maxDistanceBetweenPairs:(NSMutableArray *)A {
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    __block int max = 0;

    int i = 0;
    for (NSNumber *num in A) { 
        if ([dictionary objectForKey:num]) {
            int first = [[dictionary objectForKey:num] intValue];
            if (i - first > max) {
                max = i - first;
            }
        } else {
            [dictionary setObject:[NSNumber numberWithInt:i] forKey:num];
        }
        i++;
    }

    return max;
}

注意:使用内容视图固定滚动视图的前导跟踪不会为内容视图提供宽度。需要单独的宽度约束,否则内容视图的宽度将等于其固有宽度。 链接:https://stackoverflow.com/a/18341997/1790683