UIScrollView - 将视图移到前面,但在滚动指示器下方

Posted

技术标签:

【中文标题】UIScrollView - 将视图移到前面,但在滚动指示器下方【英文标题】:UIScrollView - Moving view to front, but below scroll indicators 【发布时间】:2013-03-22 21:15:46 【问题描述】:

我正在使用继承自 UIScrollView 的自定义视图。我遇到的问题是添加一个应该显示在“顶部”,在其他视图前面的 UILabel。它可以工作,但不幸的是它也掩盖了滚动指示器。

如您所见,滚动指示器被遮挡了。我不想禁用滚动指示器。

我将视图直接添加到 UIScrollView:

UILabel *subsection = [[UILabel alloc] initWithFrame:CGRectMake(0, y * h, 
    [self totalContentWidth], [tableViewDelegate rowHeight])];
[subsection setText:subsectionName];
[subsection setTextAlignment:NSTextAlignmentCenter];

[subSectionRows setValue:subsection forKey:key];

[self addSubview:subsection];

然后将它们带到最前面,

- (void) bringSubsectionsToFront    
    for (UIView* row in [self.subSectionRows allValues]) 
        [self bringSubviewToFront:row];
    

这种行为让我很困惑。如果我查看所有 UIScrollView 的子视图中的UIView.layer.zPosition,它们都是一样的。

如果我调整 bringSubsectionsToFront 方法以将标签移动到包含网格线的视图前面,则行为是相同的。

查看一些行为有效的内部视图类,看起来好像它们被添加到滚动视图中:[self insertSubview:cell atIndex:0];

我在这里错过了什么?

解决方案: verec 说,如果我真的想的话,我可以找到这些酒吧。所以我在一个合适的点迭代了子视图列表,果然,它们就在那里。对象的顺序如下:

CustomCell
...
UIImageView
UIImageView
CustomBorderView
UILabel
UILabel

假设这是 z 顺序,难怪我的标签总是在最前面。

解决方案变得简单;在 CustomCells 之后添加 UILabel。此解决方案仅有效,因为自定义表在索引 0 处添加了 CustomCells,我相信这会使滚动指示器出现在 CustomCells 之后。如果这个假设成立,我可以相对于 CustomCell 对其他视图重新排序,从而实现我想要的分层效果。

【问题讨论】:

【参考方案1】:

最简单的是使用中间UIView,称之为'contentView',它的子视图就是你要bringToFront的视图。

如果该 contentView 是 scrollView 内部的内容,则无论您将哪个 contentView 子项带到前面,它都会保持在滚动指示器的“下方”。

另一种方法是扫描到 scrollView 以查找滚动指示器(您会找到它们!)但这是一个兼容性风险,因为您永远不知道 Apple 是否/何时可能会根据某些决定删除/重塑/重新定位它们新的(更扁平的……)设计范式……

【讨论】:

以上是关于UIScrollView - 将视图移到前面,但在滚动指示器下方的主要内容,如果未能解决你的问题,请参考以下文章

活动指示器未显示在视图前面

在SpriteKit中模拟UIScrollView:滚动SKScene在SKView高达2000点但在高度为2050时失败时有效

是否可以将滚动事件传递给右侧嵌套的 UIScrollview?

在Scroll View的高度动画后,UIScrollView的子视图不响应触摸

Swift:将视图从堆栈视图带到前面

首次打开 App 时显示 UIScrollView