UIScrollView 的正确使用方法是什么?
What is the correct way to use UIScrollView?
我试图设置一个简单的视图来显示一篇带有标题的 text-only 文章。以下是我完成的步骤:
- 使用 .xib 文件创建视图控制器,
- 创建
UIScrollView
并直接放置一个 UIView
作为内容包装器,
- 在顶部、底部、前导和尾部设置约束
[scrollview]-0-[superview]
。
- 在顶部、底部、前导和尾部设置约束
[content wrapper]-0-[scroll view]
。
- 将宽度和高度设置为内容包装器作为占位符。
- 添加
Label
和 UITextView
作为内容包装器的子视图。
- 向子视图添加约束。
- 在 this tutorial 之后,我以编程方式设置内容包装器的前导 = 左侧滚动视图的超级视图,
- ... content wrapper 的 trailing = scrollview 的 superview right.
当我运行代码时,它完美地显示了一切; UIScrollView 滚动、边距设置正确等
然而,Xcode 抛出异常:
2015-02-05 18:06:58.230 ScrollViewApp[5353:180401] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7ff9fa49a3f0 H:[UIView:0x7ff9fa571560(600)]>",
"<NSLayoutConstraint:0x7ff9fa49b1a0 H:|-(0)-[UIView:0x7ff9fa571560] (Names: '|':UIScrollView:0x7ff9fa49a910 )>",
"<NSLayoutConstraint:0x7ff9fa49ce00 H:|-(0)-[UIScrollView:0x7ff9fa49a910] (Names: '|':UIView:0x7ff9fa49a840 )>",
"<NSLayoutConstraint:0x7ff9fa61c050 UIView:0x7ff9fa571560.right == UIView:0x7ff9fa49a840.trailing>",
"<NSLayoutConstraint:0x7ff9fa580970 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7ff9fa49a840(375)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7ff9fa49a3f0 H:[UIView:0x7ff9fa571560(600)]>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
进一步谷歌搜索后,我发现我可以通过将内容包装器的宽度(参见上面的第 5 步)优先级设置为低来消除警告;但是它破坏了界面生成器中的布局。看一看:
与设置为高优先级时相比:
我知道最后它没有什么区别,因为它都按预期工作。但我有点好奇为什么会发生这些事情。
我想了解 UIScrollView 是如何工作的,但也许我误解了什么;那么,设置 UIScrollView 以按预期工作的正确方法是什么?
尝试将内容包装器的中心水平约束添加到滚动视图。
老实说,我真的不知道为什么会这样,我通过试错弄明白了这一点。如果您希望您的视图兼容不同的屏幕尺寸,请删除内容包装器的宽度限制。
希望对你有帮助。
你可以像这样使用滚动视图。在设计中添加滚动视图。在设计中给它的左、上、右、下约束。在滚动视图中添加您的子视图。为它们添加适当的约束。无需在代码中添加约束。在 viewDidLayoutSubviews 中设置滚动视图的内容大小。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
CGRect boundsOfSelf = self.view.bounds;
scrollView.frame = boundsOfSelf;
[scrollView setContentSize: boundsOfSelf.size];
}
我试图设置一个简单的视图来显示一篇带有标题的 text-only 文章。以下是我完成的步骤:
- 使用 .xib 文件创建视图控制器,
- 创建
UIScrollView
并直接放置一个UIView
作为内容包装器, - 在顶部、底部、前导和尾部设置约束
[scrollview]-0-[superview]
。 - 在顶部、底部、前导和尾部设置约束
[content wrapper]-0-[scroll view]
。 - 将宽度和高度设置为内容包装器作为占位符。
- 添加
Label
和UITextView
作为内容包装器的子视图。 - 向子视图添加约束。
- 在 this tutorial 之后,我以编程方式设置内容包装器的前导 = 左侧滚动视图的超级视图,
- ... content wrapper 的 trailing = scrollview 的 superview right.
当我运行代码时,它完美地显示了一切; UIScrollView 滚动、边距设置正确等
然而,Xcode 抛出异常:
2015-02-05 18:06:58.230 ScrollViewApp[5353:180401] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7ff9fa49a3f0 H:[UIView:0x7ff9fa571560(600)]>",
"<NSLayoutConstraint:0x7ff9fa49b1a0 H:|-(0)-[UIView:0x7ff9fa571560] (Names: '|':UIScrollView:0x7ff9fa49a910 )>",
"<NSLayoutConstraint:0x7ff9fa49ce00 H:|-(0)-[UIScrollView:0x7ff9fa49a910] (Names: '|':UIView:0x7ff9fa49a840 )>",
"<NSLayoutConstraint:0x7ff9fa61c050 UIView:0x7ff9fa571560.right == UIView:0x7ff9fa49a840.trailing>",
"<NSLayoutConstraint:0x7ff9fa580970 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7ff9fa49a840(375)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7ff9fa49a3f0 H:[UIView:0x7ff9fa571560(600)]>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
进一步谷歌搜索后,我发现我可以通过将内容包装器的宽度(参见上面的第 5 步)优先级设置为低来消除警告;但是它破坏了界面生成器中的布局。看一看:
与设置为高优先级时相比:
我知道最后它没有什么区别,因为它都按预期工作。但我有点好奇为什么会发生这些事情。
我想了解 UIScrollView 是如何工作的,但也许我误解了什么;那么,设置 UIScrollView 以按预期工作的正确方法是什么?
尝试将内容包装器的中心水平约束添加到滚动视图。 老实说,我真的不知道为什么会这样,我通过试错弄明白了这一点。如果您希望您的视图兼容不同的屏幕尺寸,请删除内容包装器的宽度限制。 希望对你有帮助。
你可以像这样使用滚动视图。在设计中添加滚动视图。在设计中给它的左、上、右、下约束。在滚动视图中添加您的子视图。为它们添加适当的约束。无需在代码中添加约束。在 viewDidLayoutSubviews 中设置滚动视图的内容大小。 - (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
CGRect boundsOfSelf = self.view.bounds;
scrollView.frame = boundsOfSelf;
[scrollView setContentSize: boundsOfSelf.size];
}