带有 UIScroller 的自动布局在 3.5" 设备上不起作用
Posted
技术标签:
【中文标题】带有 UIScroller 的自动布局在 3.5" 设备上不起作用【英文标题】:Autolayout with UIScroller doesn't work on 3.5" device 【发布时间】:2014-04-22 21:55:55 【问题描述】:我在使用 Auto Layout ios7 应用程序时遇到问题。它有一个滚动条和一个 UINavigationController。当我在 3.5" 设备上运行它时,UINavigationController 的顶部栏会“窃取”空间,而我的布局底部会从设备底部呈现出来。它不会被导航栏的高度裁剪,我可以显示或隐藏问题仍然存在。
这是 4.0" 版本:
这是破损的 3.5 英寸
这是我的观点的结构:
最外面的视图包含一个 TPKeyboardAvoidingScrollView,这是一个方便的 UIScrollView 子类,可从https://github.com/michaeltyson/TPKeyboardAvoiding 获得,让您轻松管理键盘的显示和隐藏。里面是 UIView 是 TPKeyboardAvoidingScrollView 将滚动的子视图。在里面我有一个 UITableView 和一个固定高度的 UIView,包含一些 UI 小部件,并且应该保持粘在窗口的底部。
约束的设置相当简单,每个外部视图都固定在前、后、顶部和底部边缘。 UITableView 和“灰色”视图不是。灰色视图的固定高度为 194,并固定在底部,常数为零。当然,UITableView 没有固定的高度,但它以 194 的常数固定在底部。它们也固定在前导、尾随和顶部。哦,我也做了Editor>Resolves AutoLayout Issues> Add Missing Constraints。
我在 UIViewController 中执行常用技巧,在 ViewDidLoad 中执行:
self.automaticallyAdjustsScrollViewInsets = NO;
_scrollView.translatesAutoresizingMaskIntoConstraints = NO;
_scrollerSubView.translatesAutoresizingMaskIntoConstraints = YES;
我还填充 UITableView 并进行通常的可重用单元格编码。
我一直在使用 AutoLayout 约束,但除了它们看起来正确之外,它似乎没有做任何事情。当然,我在控制台中有常见的“无法同时满足约束”错误,但坦率地说,这对我没有帮助。
2014-04-22 17:31:34.856 Sample[3695:60b] 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:0xa35cc60 UIView:0x8f446e0.centerY == TPKeyboardAvoidingScrollView:0x8f44070.centerY>",
"<NSLayoutConstraint:0xa35d3b0 V:|-(0)-[TPKeyboardAvoidingScrollView:0x8f44070] (Names: '|':UIView:0xa35d270 )>",
"<NSLayoutConstraint:0xa35d440 V:[TPKeyboardAvoidingScrollView:0x8f44070]-(0)-| (Names: '|':UIView:0xa35d270 )>",
"<NSAutoresizingMaskLayoutConstraint:0xa364a00 h=--& v=--& UIView:0x8f446e0.midY == + 284>",
"<NSAutoresizingMaskLayoutConstraint:0xa365120 h=-&- v=-&- UIView:0xa35d270.height == UIViewControllerWrapperView:0xa35c550.height>",
"<NSAutoresizingMaskLayoutConstraint:0xa365880 h=-&- v=-&- UIViewControllerWrapperView:0xa35c550.height == UINavigationTransitionView:0x8f3a7a0.height>",
"<NSAutoresizingMaskLayoutConstraint:0xa366140 h=-&- v=-&- UINavigationTransitionView:0x8f3a7a0.height == UILayoutContainerView:0x8f353a0.height>",
"<NSAutoresizingMaskLayoutConstraint:0xa366710 h=-&- v=-&- UILayoutContainerView:0x8f353a0.height == UIWindow:0xa12ff50.height>",
"<NSAutoresizingMaskLayoutConstraint:0xa367100 h=--- v=--- V:[UIWindow:0xa12ff50(480)]>"
)
Will attempt to recover by breaking constraint
我现在有点不知所措。这不是一个复杂的情况,但它让我感到困惑。我已经阅读了无数的 SO 问题,我想我已经尝试了一切,但显然我没有。
如何让这个相当简单的用户界面同时适用于 3.5" 和 4" iOS7 设备?
【问题讨论】:
【参考方案1】:知道了!
只需将上面的 3 行从 viewDidLoad 移动到 viewDidAppear 即可完美运行。
我从 Rembrandt Q. Einstein 对 chandan 在My UIScrollView doesn't work with auto-layout in ios6 中的回答的评论中想到了这一点
只是为了澄清它起作用的原因:自动布局在 -layoutSubviews 发生在 viewDidLoad 之后但在 ViewDidAppear 之前 -- Rembrandt Q. Einstein
【讨论】:
以上是关于带有 UIScroller 的自动布局在 3.5" 设备上不起作用的主要内容,如果未能解决你的问题,请参考以下文章