判断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;
}
}
}
网友评论