为啥我在 ScrollView 中的 UIView 不遵守它的高度限制?

Posted

技术标签:

【中文标题】为啥我在 ScrollView 中的 UIView 不遵守它的高度限制?【英文标题】:Why my UIView inside UIScrollView doesn't respect its height contraint?为什么我在 ScrollView 中的 UIView 不遵守它的高度限制? 【发布时间】:2015-11-03 16:27:44 【问题描述】:

我想做一个简单的UIScrollView。 为此,我在其中放了一个UIView,并将我的所有组件都放入了这个UIView

我的问题是我以编程方式设置了我的 UIScrollView 的 contentSize(并且它工作得很好),但我的 UIView 不尊重这个新高度......所以我底部的组件不在我的 @ 987654330@ 但在我的UIScrollView 中!

这是一个问题,因为我的 UISegmentedControl(“Consommation/Emission”)没有响应,这与有效的测试 UISegmentedControl(“First/Second”)相反。

我在UIScrollViewUIView 之间设置了相等的高度限制,但它不起作用...

【问题讨论】:

【参考方案1】:

等高约束将使框架大小相同,但不会导致视图高度等于内容大小。我会为视图创建一个实际的高度约束,然后使该约束的 IBOutlet 并在您设置滚动视图的 contentSize.height 时更新它的常量

self.viewHeightConstraint.constant = self.scrollView.contentSize.height;

无论您在哪里更新滚动视图的内容大小。我想说,在使用自动布局时,设置或更新约束通常比设置框架更好。设置框架往往会与布局引擎发生冲突。

通过选中“等高”框找到​​您设置的约束。选中“高度”框,为其创建一个 IBOutlet。

【讨论】:

完美运行,我不知道我们可以制作带有约束的 IBOutlet !谢谢。 编辑:不幸的是,我遇到了一个我不太了解的约束问题:&lt;NSLayoutConstraint:0x7f95f8d290d0 UIView:0x7f95f8dcae60.centerY == UIScrollView:0x7f95f9830000.centerY&gt;", "&lt;NSLayoutConstraint:0x7f95f8dcae10 UIView:0x7f95f8dcae60.height == UIScrollView:0x7f95f9830000.height + 808&gt;", "&lt;NSLayoutConstraint:0x7f95f8dc4140 V:|-(0)-[UIView:0x7f95f8dcae60] (Names: '|':UIScrollView:0x7f95f9830000 )&gt; 当您为视图添加显式高度约束时,您是否删除了滚动视图的相等高度? “<0x7f95f8dcae10 uiview:0x7f95f8dcae60. uiscrollview:0x7f95f9830000.height> 【参考方案2】:

有办法解决这个问题。 听听UIScrollViewcontentSize 的变化。 当 contentsize 发生变化时,您会抓住它并更改子视图的框架(高度,宽度..)

像这样:

[scrollView addObserver:self
             forKeyPath:@"contentSize"
                options:NSKeyValueObservingOptionNew
                context:NULL];

你在这里抓住它:

- (void) observeValueForKeyPath:(NSString*)keyPath
                       ofObject:(id)object
                         change:(NSDictionary*)change
                        context:(void *)context 
    //change subview frame accordingly

【讨论】:

以上是关于为啥我在 ScrollView 中的 UIView 不遵守它的高度限制?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 scrollView.frame = CGRectMake() 不起作用

在uiscrollview中的多个uiview之间传递数据

UIView 和 ScrollView 之间的 UIView 过渡翻转

为啥我在 UITableCellView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元重用有关)?

除非我添加另一个 UIView,否则 ScrollView 中的 TableView 为空?

在 ScrollView 中动态填充 UIView