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

Views resetting to original interface builder height and constraints after scrolling in a UIScrollView

我有两个视图,一个 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];

我猜我漏掉了一步。

您遇到的问题是您试图同时使用静态框架和约束。这是行不通的,这就是 tableView 和 webView 的框架返回到其初始值的原因。

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

祝你好运!

我设法找出问题所在。 setTranslatesAutoresizingMaskIntoConstraints 在 ScrollView 中需要设置为 YES。默认情况下是 NO,因此删除该行不起作用,必须明确将其设置为 YES