固定/浮动视图在 UIScrollView 与 AutoLayout

Posted

技术标签:

【中文标题】固定/浮动视图在 UIScrollView 与 AutoLayout【英文标题】:Fixed / Float view in UIScrollView with AutoLayout 【发布时间】:2013-10-09 20:33:12 【问题描述】:

在this technical Note Apple 声明您可以通过向 UISCrollView 的超级视图添加约束来使 UIScrollView 的子视图固定/浮动。我试过了,但我做错了,我不知道是什么问题。

请注意,您可以通过在视图和滚动视图的子树之外的视图(例如滚动视图的超级视图)之间创建约束,使滚动视图的子视图看起来浮动(不滚动)在其他滚动内容之上。

这就是我所做的。我已经设置了 UIScrollView 并尝试将固定视图添加到滚动视图的顶部,如下所示:

_testOverlay = [[UIView alloc] init];
_testOverlay.backgroundColor = [UIColor blueColor];
_testOverlay.translatesAutoresizingMaskIntoConstraints = NO;
[self.scrollView addSubview:_testOverlay];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[_testOverlay]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_testOverlay)]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_testOverlay(64)]-(>=0)-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_testOverlay)]];

但是,这不起作用,添加的视图将与滚动视图一起移动并且不会“浮动”。有什么想法吗?

【问题讨论】:

【参考方案1】:

在视图和滚动视图子树之外的视图之间,例如 滚动视图的超级视图

这部分很关键。 self.scrollView_testOverlay 的超级视图。因此,在@"|[_testOverlay]|" 中,竖线参考self.scrollView。您必须用_testOverlay 和(我想)self.view 之间的约束替换这个约束。我不确定视觉格式语言是否可行,但您当然可以使用constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant。它会是这样的(我不会发布整个代码,因为它很长):

[self.view addConstraint:[NSLayoutConstraint
                          constraintWithItem:self.view
                          attribute:NSLayoutAttributeLeft
                          relatedBy:NSLayoutRelationEqual
                          toItem:_testOverlay
                          attribute:NSLayoutAttributeLeft
                          multiplier:1.0
                          constant:0]];

【讨论】:

成功了!我以为“|”调用的视觉格式语言超级视图是我添加约束的视图。谢谢! 如果我的self.viewUITableView 并且没有超级视图,我该怎么做?【参考方案2】:

将覆盖视图添加到滚动视图的超级视图,而不是滚动视图本身。

[self.view addSubview:_testOverlay];

【讨论】:

以上是关于固定/浮动视图在 UIScrollView 与 AutoLayout的主要内容,如果未能解决你的问题,请参考以下文章

scrollViewDidScroll(_ scrollView: UIScrollView) 到达底部后如何保持 UIButton 浮动?

将 UIScrollView 中的内容视图固定到其底部而不是其顶部边缘

固定 UIScrollView 的子视图,而其他子视图可滚动

如何在 UIScrollView 中将 UIToolbar 固定到屏幕底部

UIScrollView + 在滚动屏幕之前将项目固定到顶部

如何保持 UIscrollview 框架固定但动态范围