在子视图上具有最大 y 位置的垂直 UIScrollView

Posted

技术标签:

【中文标题】在子视图上具有最大 y 位置的垂直 UIScrollView【英文标题】:Vertical UIScrollView with maximum y position on subviews 【发布时间】:2016-03-08 13:41:33 【问题描述】:

我有一个带有 2 个按钮的垂直 UIScrollView。我需要这样做,当您滚动时,按钮会碰到 iPhone 屏幕的顶部,然后在滚动视图返回之前不再使用 UIScrollView 滚动。

页面如下所示:

“我的投票”和“关注”按钮在向上滚动时需要停留在标有“我”的蓝色条下方。实现这一目标的最佳方法是什么?谢谢! (我使用的是 Objective-C)

【问题讨论】:

为什么不在您的 ScrollView 上方的 Interface Builder 中将此按钮固定到顶部? @schmidt9 因为我需要它在滚动时随滚动视图一起移动。很难解释为什么在这种情况下这是必不可少的。此外,我以编程方式完成大部分工作。 【参考方案1】:

好吧,我终于想通了。这是我的代码:

-(void) scrollViewDidScroll:(UIScrollView *)scrollView 
    CGPoint menuBarPointRelevantToScreen = [self.view convertPoint:self.menuBarView.frame.origin fromView:self.menuBarView];
    int yOfMenuBarWhenScrolling = menuBarPointRelevantToScreen.y-scrollView.contentOffset.y;
    int bottomOfTopBarView = self.topBarView.frame.origin.y+self.topBarView.frame.size.height;
    if(yOfMenuBarWhenScrolling < bottomOfTopBarView && self.menuBarView.superview == self.parentScrollView)
        [self.menuBarView removeFromSuperview];
        [POUIConstraintManager spaceTopOf:self.menuBarView fromBottomOf:self.topBarView space:0];
        [self.view addSubview:self.menuBarView];
    
    else if(scrollView.contentOffset.y<=constantMenuBarY && self.menuBarView.superview == self.view)
        [self.menuBarView removeFromSuperview];
        [self setupMenuBarPosition];
        [self.parentScrollView addSubview:self.menuBarView];
    

这很难解释,但希望上面的代码对某人有所帮助。基本上我这样做如下: 首先,我需要弄清楚菜单项(“我的投票,关注”)离顶部栏(“我”)有多远。为了实现这一点,我将菜单项的 y 坐标与包含所有内容的视图相关联(相同的视图顶部栏(“我”)打开)。然后我只是从中减去滚动视图的 y 偏移量,这给了我两者之间的距离。 从那里我只使用一个 if 语句来确定菜单栏是否已触及顶部栏,这样我就可以将其从滚动视图中移除并将其添加到顶部栏所在的同一视图中,并将其保持在顶部栏的正下方,直到滚动视图已恢复。

(注意:constantMenuBarY 只是一个常量整数,菜单栏在滚动视图上时应该处于该位置,而 POUIConstraintManager 只是我为更容易定位视图而制作的一个类)

我希望这至少是有道理的。任何想弄清楚这一点的人可能最好只看一下代码。

更新: 我不得不通过一些重要的更改来改进它,以使其在各种情况下都能正常工作。如果有人需要帮助,请发表评论,我可以更好地解释它。

【讨论】:

以上是关于在子视图上具有最大 y 位置的垂直 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 在从不同的视图控制器 segu 时具有不同的 y 位置

垂直于屏幕时,视图在 Y 轴上的旋转动画上剪辑

Masonry使用注意事项

与 css 垂直对齐时,何时使用绝对位置与相对位置

具有水平缩放的 UIScrollView - 在子视图中绘制的贝塞尔路径模糊

如果视图超出屏幕上可见的当前高度,则拖动视图并滚动