在 UIScrollView 中滚动后,视图重置为原始界面构建器高度和约束

Posted

技术标签:

【中文标题】在 UIScrollView 中滚动后,视图重置为原始界面构建器高度和约束【英文标题】:Views resetting to original interface builder height and constraints after scrolling in a UIScrollView 【发布时间】:2015-02-05 19:42:24 【问题描述】:

我有两个视图,一个 UIWebView 和一个 UITableView,我正在以编程方式扩展它们的高度。这两个视图都位于 UIScrollView 内。 WebView 和 TableView 都禁用了滚动,并且 ScrollView 及其父视图关闭了 Autoresize Subviews。我要做的是将两个项目的高度扩展到适当的大小,然后将 ScrollView 的内容大小扩展到两个项目的总和。现在这行得通。但是,一旦我滚动 TableView 和 WebView 重置到它们的原始高度,但 ScrollView 保持其新的内容大小。

我正在使用以下代码更改 webViewDidFinishLoad 中的高度。

// Set the webview height //
webView.frame = CGRectMake(
                           webView.frame.origin.x
                           , webView.frame.origin.y
                           , webView.frame.size.width
                           , webView.scrollView.contentSize.height);

[webView setTranslatesAutoresizingMaskIntoConstraints:NO];
[webView addConstraint:[NSLayoutConstraint
                        constraintWithItem:webView
                        attribute:NSLayoutAttributeHeight
                        relatedBy:NSLayoutRelationEqual
                        toItem:nil
                        attribute:NSLayoutAttributeNotAnAttribute
                        multiplier:1.0
                        constant:webView.scrollView.contentSize.height]];

webView.scrollView.scrollEnabled = NO;
webView.scrollView.bounces = NO;

// Set the table height and location //
self.myTableView.frame = CGRectMake(self.myTableView.frame.origin.x
                                      , webView.frame.origin.y + webView.scrollView.contentSize.height + 8
                                      , webView.frame.size.width
                                      , [tableRows count] * 40);

[self.myTableView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.myTableView addConstraint:[NSLayoutConstraint
                                   constraintWithItem:self.myTableView
                                   attribute:NSLayoutAttributeHeight
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:nil
                                   attribute:NSLayoutAttributeNotAnAttribute
                                   multiplier:1
                                   constant:[tableRows count] * 40]];

// Update the scrollview //
CGSize newSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, webView.frame.size.height + self.myTableView.frame.size.height);
[super updateViewConstraints];
[self.myScrollView setContentSize:newSize];

我猜我在某处遗漏了一步。

【问题讨论】:

【参考方案1】:

我设法弄清楚出了什么问题。在 ScrollView 中时,setTranslatesAutoresizingMaskIntoConstraints 需要设置为 YES。默认情况下这是NO,因此删除该行不起作用,必须将其显式设置为YES

【讨论】:

【参考方案2】:

您遇到的问题是您试图同时使用静态框架和约束。这是行不通的,这也是为什么 tableView 和 webView 的框架会回到它们的初始值的原因。

使用约束进行这项工作会稍微复杂一些,但如果您只使用静态框架并删除您通过代码添加的约束,那么一切都应该可以正常工作。

祝你好运!

【讨论】:

以上是关于在 UIScrollView 中滚动后,视图重置为原始界面构建器高度和约束的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 的内容偏移被重置

编辑 UITextField 时正在重置 UIScrollView

在 UIScrollView 中调整视图大小后,滚动视图不知道它改变了

滚动条滚动但 UIScrollView 不滚动

在父视图中添加 ImageView 后 UIScrollView 停止滚动?

在触摸期间停止 UIScrollView 滚动