UIPageController禁用bounces效果及其最右侧表格实现左滑删除

最近项目中接到一个需求,需要在如下图所示情况下为最右侧viewController中的tableView添加左滑删除效果

effect

解决思路如下

  • 禁用UIPageController的Bounces效果
  • 处理手势冲突

禁用bounces效果

  1. 禁用UIPageControllerbounces效果,首先要遍历到UIScrollView或其子类的子视图,并设置代理。代码如下:
for (UIView *view in self.pageViewController.view.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
        UIScrollView *scrollView = (UIScrollView *)view;
        scrollView.allowSolveGestureConflict = YES;
        scrollView.delegate = self;
        break;
    }
}

其内部滚动视图的类为UIQueuingScrollView

  1. 实现UIScrollViewDelegate部分协议,如下:

以下代码是解决拖拽时无回弹效果,但如果点击tab调用setViewControllersdirection:animated:completion:触发滚动会发生位置错位的效果,故声明_isDrag属性来判断是否为拖拽出发的滚动

static BOOL _isDrag;
#pragma mark - UIScrollViewDelegate
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    _isDrag = YES;
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    _isDrag = NO;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (!_isDrag) return;
    
    CGFloat lastPosition = scrollView.contentOffset.x;
    //这里是对第一页和最后一页做一个判断,
    if (self.currentIndex == self.pages.count-1 && (lastPosition > scrollView.getWidth)) {
        [scrollView setContentOffset:CGPointMake(scrollView.getWidth, 0)];
    } else if (self.currentIndex == 0 && lastPosition < scrollView.getWidth) {
        [scrollView setContentOffset:CGPointMake(scrollView.getWidth, 0)];
    }
}

解决手势冲突实现左滑删除

由于无法像解决UIScrollViewUITableView嵌套那样,写一个继承UIScrollView的子类实现手势的代理方法即可。
所以需要为UIScrollView添加category,并实现如下方法:

//让scrollview可以与其子视图同时响应手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if (gestureRecognizer.state != 0) {
        return YES;
    }
    return NO;
}

继而引发的问题

刚才为UIScrollView添加了扩展,所以导致所有UIScrollView子类都会处理手势冲突,所以需要在扩展中添加一个属性,如下:

//.h
@property (nonatomic, assign) BOOL allowSolveGestureConflict;

//.m
static char allowSolveGestureConflictKey;
- (void)setAllowSolveGestureConflict:(BOOL)allowSolveGestureConflict
{
    objc_setAssociatedObject(self, &allowSolveGestureConflictKey, @(allowSolveGestureConflict), OBJC_ASSOCIATION_COPY_NONATOMIC);
}

- (BOOL)allowSolveGestureConflict
{
    return [objc_getAssociatedObject(self, &allowSolveGestureConflictKey) boolValue];
}

//修改该方法如下
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    if (self.allowSolveGestureConflict && gestureRecognizer.state != 0) {
        return YES;
    }
    return NO;
}

我们在需要处理手势冲突的地方对该值设置为YES即可

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,777评论 4 61
  • 最近在考虑持续交付(Continuous Delivery)的一系列最佳实践,持续集成工具的选择影响到未来的投入,...
    michael_jia阅读 3,576评论 0 2
  • 0.前言 儘管前一陣子,有發語音檔與筆記在網路上,但持續了2週我又斷掉了,自己開始疑惑自己朗讀的意義與朗讀的重要性...
    小慷阅读 1,787评论 0 2
  • 昨天接到小A电话,大谈男友对其漠不关心。小A的男友是一个大她5岁的工作狂,两人吵吵闹闹过了好几年,故事摞在一起都可...
    一直穿高跟鞋的猪阅读 3,526评论 0 0

友情链接更多精彩内容