在 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 中滚动后,视图重置为原始界面构建器高度和约束的主要内容,如果未能解决你的问题,请参考以下文章
编辑 UITextField 时正在重置 UIScrollView
在 UIScrollView 中调整视图大小后,滚动视图不知道它改变了