美文网首页
在基类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