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