我有一个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
约束不适用,标签不占用所有宽度
只有当我更改标签约束以使用scrollView时,它才能按预期工作:
textLabel.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
为什么这样做?有人可以解释为什么UIStackView
上的约束不能像我预期的那样起作用吗?
完整的源代码avaiable at that gist
答案 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