iOS Autolayout with UIScrollview: Why does content view of scroll view not fill the scroll view?(iOS Autolayout with UIScrollview:为什么滚动视图的内容视图不填充滚动视图?)
问题描述
以下代码(在 viewDidLoad 中调用)会导致屏幕全红.我希望它是一个完全绿色的屏幕.为什么是红色的?我怎样才能让它全部变成绿色?
The following code (called in viewDidLoad) results in a fully red screen. I would expect it to be a fully green screen. Why is it red? And how can I make it all green?
UIScrollView* scrollView = [UIScrollView new];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
scrollView.backgroundColor = [UIColor redColor];
[self.view addSubview:scrollView];
UIView* contentView = [UIView new];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
contentView.backgroundColor = [UIColor greenColor];
[scrollView addSubview:contentView];
NSDictionary* viewDict = NSDictionaryOfVariableBindings(scrollView,contentView);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:viewDict]];
推荐答案
滚动视图的约束与其他视图的约束略有不同.contentView
和它的 superview
(scrollView
)之间的约束是对 scrollView
的 contentSize
,而不是它的 frame
.这可能看起来令人困惑,但实际上非常有用,这意味着您不必调整 contentSize
,而是 contentSize
会自动调整以适应您的内容.技术说明 TN2154 中描述了这种行为.
Constraints with scroll views work slightly differently than it does with other views. The constraints between of contentView
and its superview
(the scrollView
) are to the scrollView
's contentSize
, not to its frame
. This might seem confusing, but it is actually quite useful, meaning that you never have to adjust the contentSize
, but rather the contentSize
will automatically adjust to fit your content. This behavior is described in Technical Note TN2154.
如果你想在屏幕上定义 contentView
大小或类似的东西,你必须在 contentView
和主视图之间添加一个约束,例如例子.诚然,这与将内容放入滚动视图是对立的,所以我可能不建议这样做,但可以这样做.
If you want to define the contentView
size to the screen or something like that, you'd have to add a constraint between the contentView
and the main view, for example. That's, admittedly, antithetical to putting content into the scrollview, so I probably wouldn't advise that, but it can be done.
为了说明这个概念,contentView
的大小将由其内容驱动,而不是由 scrollView
的 bounds
驱动,添加contentView
的标签:
To illustrate this concept, that the size of contentView
will be driven by its content, not by the bounds
of the scrollView
, add a label to your contentView
:
UIScrollView* scrollView = [UIScrollView new];
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
scrollView.backgroundColor = [UIColor redColor];
[self.view addSubview:scrollView];
UIView* contentView = [UIView new];
contentView.translatesAutoresizingMaskIntoConstraints = NO;
contentView.backgroundColor = [UIColor greenColor];
[scrollView addSubview:contentView];
UILabel *randomLabel = [[UILabel alloc] init];
randomLabel.text = @"this is a test";
randomLabel.translatesAutoresizingMaskIntoConstraints = NO;
randomLabel.backgroundColor = [UIColor clearColor];
[contentView addSubview:randomLabel];
NSDictionary* viewDict = NSDictionaryOfVariableBindings(scrollView, contentView, randomLabel);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:0 views:viewDict]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:viewDict]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[randomLabel]-|" options:0 metrics:0 views:viewDict]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[randomLabel]-|" options:0 metrics:0 views:viewDict]];
现在您会看到 contentView
(因此,scrollView
的 contentSize
)已调整为适合标签标准边距.而且因为我没有指定标签的宽度/高度,它会根据您放入该标签的文本进行调整.
Now you'll see that the contentView
(and, therefore, the contentSize
of the scrollView
) are adjusted to fit the label with standard margins. And because I didn't specify the width/height of the label, that will adjust based upon the text you put into that label.
如果您希望 contentView
也调整到主视图的宽度,您可以像这样重新定义您的 viewDict
,然后添加这些额外的约束(在除了以上所有其他内容):
If you want the contentView
to also adjust to the width of the main view, you could do redefine your viewDict
like so, and then add these additional constraints (in addition to all the others, above):
UIView *mainView = self.view;
NSDictionary* viewDict = NSDictionaryOfVariableBindings(scrollView, contentView, randomLabel, mainView);
[mainView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[contentView(==mainView)]" options:0 metrics:0 views:viewDict]];
<小时>
有一个已知问题(错误?) 在滚动视图中带有多行标签,如果你希望它根据文本量调整大小,你必须做一些花招,例如:
There is a known issue (bug?) with multiline labels in scrollviews, that if you want it to resize according to the amount of text, you have to do some sleight of hand, such as:
dispatch_async(dispatch_get_main_queue(), ^{
randomLabel.preferredMaxLayoutWidth = self.view.bounds.size.width;
});
这篇关于iOS Autolayout with UIScrollview:为什么滚动视图的内容视图不填充滚动视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:iOS Autolayout with UIScrollview:为什么滚动视图的内容
基础教程推荐
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01