将一个视图滑过另一个视图

Posted

技术标签:

【中文标题】将一个视图滑过另一个视图【英文标题】:Slide one view over another 【发布时间】:2018-03-06 13:34:28 【问题描述】:

我有一个视图控制器,顶部是页面视图控制器,底部是表格视图。当我向上滚动表格视图时,我希望表格视图框架在我向下滚动时向上滑动到屏幕顶部并返回到页面控制器视图的底部。

表格视图向上滑动到屏幕顶部,但表格视图单元格也会滚动。请参阅第一个视频链接。

我只想改变框架并滚动表格视图单元格直到它到达屏幕顶部。

video for what I achieved

video similar to what I want to achieve

在我的示例中,我尝试更改附加到 scrollViewDidScroll 中表格视图顶部的 NSLayoutConstraint。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    //the height of the pageview controller
    //the height and width of the pageview controller is the screen width.
    CGFloat yPos = self.pageViewHolder.frame.size.height;
    //content offset as I scroll
    CGFloat offset = self.tableView.contentOffset.y;
    //to place the tableview exactly below pageview controller view
    if (offset < 0) 
        offset = screenSize.height - screenSize.width;
    
    //to place the tableview frame fixed on top of the screen
    else if (offset > yPos) 
        offset = screenSize.width;
    

    //to slide the table view above page view by changing the NSLayoutConstraint anchored to the top of the table view and the super view.
    CGFloat difference = yPos - offset;
    self.tableViewTopGap.constant = difference;
    [self.view layoutIfNeeded];

【问题讨论】:

你为什么不把tableView作为一个子视图放在后台,然后添加PanGesture呢? 【参考方案1】:

您需要在表格视图上启用和禁用滚动,直到它位于屏幕顶部。

因此,在您在上面发布的代码中,您正在检查 if else 语句中表视图的位置,您应该在其中启用和禁用滚动。

当您不希望表格视图滚动时:[tableView scrollEnabled: NO];,然后当它到达屏幕顶部时,只需将其设置为 YES

【讨论】:

内容偏移量不会改变我猜如果我将启用滚动设置为 NO.. 对不起,我看错了你的代码。是的,内容与在表格视图中滚动有关。因此,随着表格视图本身上下移动,您需要检查其框架的位置以确定它在窗口中的位置。当它的 y 位置大于 0 时,您知道它不在顶部,因此 table view 应该禁用其滚动。然后当它的 y 位置为 0(或者我猜滚动弹跳时更小)时,您可以在表格视图中启用滚动

以上是关于将一个视图滑过另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 拖放碰撞检测如何检测您选择的项目何时拖过另一个子视图?

两个视图之间的 Swift CATransition - 滑过效果上一个屏幕变白

滑过和拆分视图未启用

如何使视图出现在按钮上?目标-c

我的 Django 视图和 URL 不匹配某处给我一个空白屏幕

如何使用 iOS 7 自定义转换在顶部呈现半模态视图控制器