OC ScrollView里面含有拖动的TableView 如何响应拖动的手势

参考闲鱼的主页面,上半部分的View和下半部分的TableView:

首先拿到设计的UI控件:

@property (weak, nonatomic) IBOutlet UIScrollView *ContentScrollView;//外部的套用ScrollView
@property (weak, nonatomic) IBOutlet UITableView *DocterInfoTable;//这是ScrollView内部的TableView
@property (weak, nonatomic) IBOutlet UIStackView *DoctorTableStack;//这是想要ScrollView停留的点

我们需要给ContentScrollView一个新的Controller来响应多个手势,在.m文件中实现协议UIGestureRecognizerDelegate:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

然后在主界面里面实现<,UITableViewDelegate,UITableViewDataSource,UIScrollViewDelegate>协议:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
//NSLog(@"%@,%f",scrollView.class,CGRectGetMinY(_DoctorTableStack.frame) - _ContentScrollView.contentOffset.y);
    //NSLog(@"%@",NSStringFromCGRect(_DoctorTableStack.frame));

    if (CGRectGetMinY(_DoctorTableStack.frame) <= _ContentScrollView.contentOffset.y) {
        NSLog(@"禁止_ContentScrollView滑动");
        _ContentScrollView.contentOffset = CGPointMake(0, CGRectGetMinY(_DoctorTableStack.frame));

        if (_DocterInfoTable.contentOffset.y > 20) {
            doctorViewPull = true;
        }
        else
            doctorViewPull = false;
    }

    if (CGRectGetMinY(_DoctorTableStack.frame) >_ContentScrollView.contentOffset.y) {
        NSLog(@"不行_DocterInfoTable滑动");
        if (!doctorViewPull) {
            _DocterInfoTable.contentOffset = CGPointZero;
        }
        else
            _ContentScrollView.contentOffset = CGPointMake(0, CGRectGetMinY(_DoctorTableStack.frame));

    }

}

首先contentoffset的值会瞬间大于50都有可能。所以依靠contentoffset可能会导致边界值的误差判断出问题!!!

1._ContentScrollView.contentOffset.y代表的是咱们ScollView的偏移量,当他小于我们设定的位置的顶部的时候,我们不允许TableView进行偏移,也就是将其偏移量设置为CGPointZero。这样视觉上就是ScrollView在移动儿TableView并没有移动。2.当_ContentScrollView.contentOffset.y一旦大于设定值的时候,禁止其再滑动,设置他的值永远停留在该设定值。但是当我们向上突然拉一下的时候ScrollView和TableView都会有contentoffset,于是会有可能进入第二个分支,也就是“不行_DocterInfoTablehu滑动”。于是我们就需要一个Flag来表示我的TableView进入了pan状态,你Scrollview就不要响应,你尽管会进入这个分支但是你的值依然是当前位置,我们的设定值。直到TableView的contentoffset变得足够小,这里我设置20作为参考,代表我开始响应pan状态。(也可以将设置为1更接近完美)

重点就是:当我的ScrollView滑到特定值的时候需要一个状态标志,ScrollView不再变化,TableView响应pan手势。我的TableView放弃响应pan手势的时机就是我的TableView的contentoffset的值至少大于0.1,也就是滑动到顶部。这就是两者的switch button

原文地址:https://www.cnblogs.com/JMarshall/p/11129637.html

时间: 2024-07-31 17:59:42

OC ScrollView里面含有拖动的TableView 如何响应拖动的手势的相关文章

[转载]Android: 如何实现ScrollView中含有ListView?

原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf ListView本身就含有ScrollView,因此把ListView放到ScrollView中会引起混乱(谁来响应滑动事件?)但有时又确有此需求,以实现ListView的内容连同其他内容的滚动. 要想把ListView嵌入ScrollView,有二个方法: 方法1:整体上使用一个ListView, 把不需滚动的部分放入ListView的Header或Footer中.注意: 一定要先添加He

vue+mousemove实现拖动,鼠标移动过快拖动就失效

今天用vue+原生js的mousemove事件,写了个拖动,发现只能慢慢拖动才行,鼠标只要移动快了,就失效,不能拖动了: 搞了半天在,总算解决了,但是问题的深层原理还没搞清楚,知道的大侠可以留言分享,下面直接上代码: 只能慢速拖动的代码: <!DOCTYPE html> <html> <head> <title>vue结合原生js实现拖动</title> <script src="https://cdn.bootcss.com/v

*C#(WPF)--矩阵拖动和矩阵动画(拖动展开,不足动画效果)

最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行的,这个工具条主要功能是:一个工具条,可进行拖拉.可进行拖拉展开,可在拖动之后不足展开并反向继续展开剩下的部分: 一.[拖动]   拖动的核心代码是通过矩阵进行定位和拖动的,定位是以父容器为模板的.以下是核心代码(及效果图): 1 /// <summary> 2 /// 这里TitleBar代指最

IIViewDeckController拖动事件与百度地图拖动事件冲突

在使用第三方(IIViewDeckController)的侧边栏和百度地图同时使用时.发现百度地图的拖动事件被侧边栏截取了,导致拖动地图时地图移动缓慢,几乎无法滑动.在网上苦苦搜寻了解决方案,最终搜索到比较靠谱的http://www.cocoachina.com/bbs/read.php?tid-252890-page-2.html链接里面11楼的评论.但是我按照他的办法添加代码,在我这边还是没有效果.于是我就在IIViewDeckController第三类里面去找- (BOOL)gesture

UITouch和TableView如何响应点击事件

实现代码: 生命一个集成UITableView的类 #import <UIKit/UIKit.h> @protocol CHTouchTableViewDelegate <NSObject> @optional - (void)tableView:(UITableView *)tableView touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)tableView:(UITableView *)tab

python selenium5 模拟点击+拖动+按照指定相对坐标拖动 58同城验证码

#!/usr/bin/python # -*- coding: UTF-8 -*- # @Time : 2019年12月9日11:41:08 # @Author : shenghao/[email protected] '''test with selenium's move by x,y''' from builtins import print from selenium import webdriver from selenium.webdriver.support.ui import W

ios 两个 TableView 之间的联动, TableView 与 CollectionView 之间的联动

两个 TableView 之间的联动, TableView 与 CollectionView 之间的联动 这是一个创建于 359 天前的主题,其中的信息可能已经有所发展或是发生改变. [联动] :两个 TableView 之间的联动, TableView 与 CollectionView 之间的联动 前言 现在市面上有很多 app 都有联动功能,有的是两个 TableView 之间的联动,比如美团外卖,百度外卖,饿了么等等.有的是 TableView 与 CollectionView 之间的联动

tableView用法----博客状态案例

小烨子这两天课比较紧,晚上回来网又打不开网页,苦逼啊,趁现在可以用赶紧写 好了不瞎扯了 自定义微博步骤:1.观察应用,分析功能,了解答题流程2.加载plist取出数据,同时建立模型储存到数组中,因为这是个自定义cell,每个cell的高度都是由cell里面内容确定的,但是要设置cell的高度就要的hi用代理的的这个方法:-  (CGFloat)tableVIew:(UITableView *) heightForRowAtIndexPath:(NSIndexPath *)IndexPath问题来

一个控制器(UIViewController)中需要管理多个tableView,addChildViewController注意事项

有时候,一个控制器(UIViewController)中需要管理多个tableView,我们需要将多个控制器加入到主控制器中去.使用UIViewController的addChildViewController方法即可.但是这时可能会在tableView的位置上出现问题: 1.UIViewController的automaticallyAdjustsScrollViewInsets属性是会根据所在界面的status bar,navigationbar,tabbar的高度,自动调整scrollVi