固定/浮动视图在 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.view
是UITableView
并且没有超级视图,我该怎么做?【参考方案2】:
将覆盖视图添加到滚动视图的超级视图,而不是滚动视图本身。
[self.view addSubview:_testOverlay];
【讨论】:
以上是关于固定/浮动视图在 UIScrollView 与 AutoLayout的主要内容,如果未能解决你的问题,请参考以下文章
scrollViewDidScroll(_ scrollView: UIScrollView) 到达底部后如何保持 UIButton 浮动?
将 UIScrollView 中的内容视图固定到其底部而不是其顶部边缘
固定 UIScrollView 的子视图,而其他子视图可滚动
如何在 UIScrollView 中将 UIToolbar 固定到屏幕底部