带有 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" 设备上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

准备一个应用程序在没有自动布局的情况下在 3.5'' 和 4'' 上运行

iOS - 自动布局不适用于 3.5" 屏幕

只想使用自动布局调整中间视图的大小

自动布局粘在底部

使用自动布局更改约束

在 UIImage 或 UIScroller 中查看转换为 BLOB 图像的 PDF 文件