美文网首页
在基类baseviewcontroller添加的悬浮框实现上滑下

在基类baseviewcontroller添加的悬浮框实现上滑下

作者: qqqqnnnndddd | 来源:发表于2019-01-25 14:08 被阅读0次

    判断tableview上滑还是下滑   为APP各个页面添加悬浮框

        最近有个需求要让现有的APP内tabbar控制的四个页面添加悬浮框,作为音频播放的入口,并实现上滑显现下滑隐藏,接到改版需求第一反应是现在APP内所有viewcontroller都是继承于baseviewcontroller,直接在base里.m文件添加悬框控件即可。

        但在添加后捕捉各个页面的上下滑动时出现了意外,因为在网上搜的监测页面列表滑动的方法仅有scrollviewdidscroll等滚动页的几个代理方法,所以在base里筛选各个界面的tableview并实例化到该控制器里,使其delegate = self并实现监测contentoffset的代理方法。但在各个继承base的界面已经使tableview.delegate = self了,如果在base里也使delegate = self,就会使tableview的方法只能在一个控制器里起作用,所以用scrollviewdidscroll等方法监测页面滑动行不通。

        下面说一个监测页面上下滚动的另一个方法,利用kvo观察页面的contentoffset和scrollview的滚动状态,代码:

    //  baseviewcontroller.m

    @property (nonatomic ,assign) float newOffsetY;

    @property (nonatomic ,assign) float  oldOffset;

    @property (nonatomic ,assign) float  contentOffset;

    @property (nonatomic ,copy)  NSString *stated;        // 记录滚动状态(开始滚动,正在和结束)

    // viewwillappear

     for (id view in self.view.subviews)
        {
            if ([view isKindOfClass:[UITableView class]])
            {
                UITableView *tableviews = (UITableView*)view;
                [tableviews addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
             [tableviews addObserver:self forKeyPath:@"panGestureRecognizer.state" options:NSKeyValueObservingOptionNew context:nil];
            }
        }

    // 实现kvo方法

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context

    {

        if ([keyPath isEqualToString:@"panGestureRecognizer.state"])

        {

            UITableView *imagescrollView = (UITableView *)object;

            if (imagescrollView.panGestureRecognizer.state == UIGestureRecognizerStateBegan)

            {

                //            NSLog(@"开始");

                self.stated = @"开始";

            }

            if (imagescrollView.panGestureRecognizer.state == UIGestureRecognizerStateChanged)

            {

                //            NSLog(@"改变");

                self.stated = @"改变";

            }

            if (imagescrollView.panGestureRecognizer.state == UIGestureRecognizerStateEnded) {

                //            NSLog(@"结束");

                self.stated = @"结束";

            }

        }

        if ([keyPath isEqualToString:@"contentOffset"])  // contentOffset

        {

            UITableView *allTableview = (UITableView *)object;

            CGFloat offset = allTableview.contentOffset.y;

            NSLog(@"===============%f",offset/64.f);

            if ([self.stated isEqualToString:@"开始"])

            {

                self.contentOffset = offset;

            }

            else if ([self.stated isEqualToString:@"结束"])

            {

                self.oldOffset = offset;

            }

            else

            {

                CGFloat newOffsetY = offset;

                if (newOffsetY > self.oldOffset && self.oldOffset > self.contentOffset){//上滑

                    //写上滑代码

                    self.windowView.hidden = NO;

                }else if(newOffsetY < self.oldOffset && self.oldOffset < self.contentOffset){//下滑

                    //写下滑代码

                    self.windowView.hidden = YES;

                }

                self.oldOffset = offset;

            }

        }

    }

    相关文章

      网友评论

          本文标题:在基类baseviewcontroller添加的悬浮框实现上滑下

          本文链接:https://www.haomeiwen.com/subject/nppmjqtx.html