美文网首页IOS开发fish的iOSiOS开发(OC)
iOS 嵌套在scrollView里面的tableView实现左

iOS 嵌套在scrollView里面的tableView实现左

作者: 长发飘飘陈序员 | 来源:发表于2016-05-22 20:37 被阅读5549次

    首先在tableView里面实现cell的左滑删除功能是挺简单的,相信大家都懂得怎么做。但是,当有多个tableView放在一个scrollView里面的时候,会产生一系列的问题。


    问题1:

          scrollView在滑倒最边上(左或右)的时候,为了提醒用户已经滑到最边上了(左或右),再继续向左(右)滚动的话会有一个反弹的效果,这就造成左滑删除的时候,整个tableView会出现一个我们不想看到的反弹效果。

    解决方法:

        会出现这种效果,是因为苹果为了让用户知道scrollView已经滑到了最边上了,而不是程序卡了或者出现问题了而不能滑动。所以,scrollView对象里面有三个属性,分别是bounces,bounceHorizontally与bounceVertically三个属性,通过 self.scrollView.bounces = NO;这行代码就可以让scrollView滑倒边上的时候不会出现反弹效果。

    关键代码:

    self.scrollView.bounces = NO;

    问题2:

          当你把scrollView滑到最边上(左或右)的时候,当你继续做滑想要让cell接收左滑手势的时候,这时滑动删除的事件被底部的UIScrollview给响应了,cell根本拿不到这个滑动手势。tableView是UIScrollview 的子类,cell里面的ContentView好像在iOS7.0之后也是UIScrollview ,再加底部一个UIScrollview,这滑动手势事件该怎么传递好呢,给谁都不行啊。 给了底部,那么就没法滑动删除,给了cell那么正常的左右滑动又不行了。

    解决方法:

    首先,新建一个MyScrollView类,让其继承于UIScrollView,并且遵循UIGestureRecognizerDelegate协议。

    @interface MyScrollview : UIScrollView <UIGestureRecognizerDelegate>

    iOS的UIGestureRecognizer基类内包含 Tap(点击)、Pinch(捏合)、Rotation(旋转)、Swipe(滑动)、Pan(拖移)、LongPress(长按)这几种常用手势动作,又细分单击、双击、左滑、右滑等操作。

    然后重写下类方法:

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

         if(gestureRecognizer.state != 0) {

         return YES;

    }else {

         return NO;

    }

    重写之后让这个类绑定你界面中的scrollView.这个函数里面的意思是如果一个手势没有被识别的话,那么就让多个gestureRecognizer可以被识别,也就是本文的scrollView与tableView的cell的滑动手势可以同时被识别。

    但是这样之后,又会出现一个新的问题,也就是当scrollView在左右滑动的时候,tableView也能同时的上下滑动。造成这种现象的原因是上面MyScrollView里面重写的函数造成了多个手势同时被响应。解决这种问题的方法是在ViewController类里面处理滚动时候的事件。

    #pragma mark - ScrollView delegate

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {

         if(scrollView == self.myScrollView) {

         self.tableView1.scrollEnabled = NO;

         self.tableView2.scrollEnabled = NO;

       } 

    }

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

        if(scrollView == self.myScrollView) {

          self.tableView1.scrollEnabled = YES;

          self.tableView2.scrollEnabled = YES;

      }

    }

    代码的意思是当你在滑动scrollView的时候,把所有的tableView设置为不可滑动,而当scrollView滑动结束的时候,再把tableView设置为可以滑动,这样就能避免scrollView与tableView同时滑动了。

    好了,到此为止,为嵌套在scrollView里面的tableView实现滑动删除的功能所遇到的问题已经解决了。注意,这里解决的是给右边的tableView增加滑动删除,如果你的需求是给左边的tableView增加滑动删除,那么解决方案是:拿起键盘砸向产品经理。

    下面给出实现滑动删除常用到的方法。

    -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {

       return @"删除";

    }

    该方法返回的是你左滑时候出现的文字提示。

    -(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

      return UITableViewCellEditingStyleDelete;

    }

    该方法是根据indexPath返回tableView里面每一行的编辑类型。包括UITableViewCellEditingStyleDelete,UITableViewCellEditingStyleNone与UITableViewCellEditingStyleInsert.

    -(NSArray*)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {

         UITableViewRowAction* deleteAction = [UITableViewRowAction       rowActionWithStyle:UITableViewRowActionStyleNormal title:@"删除"  handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {

    这里面写点击按钮的所响应的事件。

    }];

     return @[deleteAction];

    }

    这个函数可以创建多个action,并以数组的形势返回,使得左滑时候能够出现多个按钮。

    还有commitEditingStyle等等的函数,这里就不一一例举了。这里附上自己的gitHub地址:github.com/juncheng785245941

    今天就写到这里了,第一次用简书,语言不当或者有错误的地方请多多指教,以后还会经常写一些自己在iOS开发或者说是学习的时候遇到的问题与解决方法。我的目标是能让所有程序猿更少的纠结于奇怪的bug,更少的熬夜,更轻松的编程。

          谢谢各位。

    相关文章

      网友评论

      • 江南一拐湾儿:重写之后让这个类绑定你界面中的scrollView。这个绑定是什么意思?
      • JohnQ:博主 我自己写了一个自定义的segment 我是在ViewController上放了一个ScrollView,这个ScrollView是作为滑动切换页面所用,而在这个ScrollView上放置了多个ViewController页面。我用你写的那个重写ScrollView手势方法给ScrollView。可是很奇怪的是我在最后一个ViewController上的tableView在左滑删除的时候居然也调用到了父类页面ViewController中的ScrollView的scrollViewDidEndDecelerating:(UIScrollView *)scrollView 这个代理方法。我刚刚开始以为是最后一个ViewController中的tableView的scrollEnable没有禁用导致的,可是我禁用了还是会执行父类ViewController中的代理方法
      • 4fb788cc8fd1:楼主 我添加上tabelView 不能滚到底 怎么解决?谢谢
      • 老骚鹅:楼主能给份代码吗?qq1262711517@qq.com,谢谢
      • d079da11e5f9:我scrollview上放了多个tableview 我怎么实现最右边的那个滑动出现删除啊!用你的方法写的话左滑时tableview上都会出现删除的按钮
        dc235eff2e76:你好,怎么可以出现侧滑删除按钮
      • 1b2ae550dc99:你好,我的也是scrollView上放tableview,但是,我点击tableview的cell,没有写点击的方法,但是所有的cell都会消失,怎么回出现这种情况?
        听海_2d6a:你好,我的也出现这个问题,请你你解决了么?能不能告诉解决方法
      • 梦随缘:我也遇到滑动scrollView的时候tableView也跟着侧滑 求demo 627748027@qq.com
        梦随缘:@长发飘飘陈序员 谢谢
        长发飘飘陈序员:@梦随缘 ok,今晚尽量发给你,
      • 翀鹰精灵:非常感谢了,求发demo
      • 翀鹰精灵:github地址错误,可以发个demo吗? 787213643@qq.com
        翀鹰精灵:@刂苹 你应该给楼主要 我也没有哦:joy:
        dc235eff2e76:可以给我发一个吗,1060647109,谢谢
      • FengxinLi:请问一下楼主 在一个UIScrolview里面增加二个uitableview,按照你的方法 但是tableview和uiscrolview同时滑动也可以的 实现你说的那二个代理方法不行。是不是我自己没写对?
        长发飘飘陈序员:@Fengxinliju 已发
        FengxinLi:@长发飘飘陈序员 恩 请问楼主qq多少?可以私信发给我哈不?非常感谢
        长发飘飘陈序员:@Fengxinliju 你是说按照我这样子弄之后,tableview跟scrollview还是会同时滑动是吗?
      • FengxinLi:你这个判断中 if(gestureRecognizer.state != 0) {

        return YES;

        }else {

        return NO;

        }
        这个判断 是当他们三个UIscrolview都不可用 ,都返回可用吗?还是 感觉不是很明白
        长发飘飘陈序员:@Fengxinliju 不好意思,因为下午有事,未能及时回复。这个函数的作用是在scrollview里面有手势没有被识别的时候,也就是gestureRecognizer.state != 0,也就是手势只有一个被识别(此为正常状态)的时候返回YES,这时候通过这个函数就可以让多个手势一起被响应。关于这个方法解释如下:默认情况下,两个gesture recognizers不会同时识别它们的手势,但是你可以实现UIGestureRecognizerDelegate协议中的
        gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:方法对其进行控制。这个方法在这两个gesture recognizers中的任意一个将block另一个的触摸事件时调用,如果返回YES,则两个gesture recognizers可同时识别,如果返回NO,则并不保证两个gesture recognizers必不能同时识别,因为另外一个gesture recognizer的此方法可能返回YES。也就是说两个gesture recognizers的delegate方法只要任意一个返回YES,则这两个就可以同时识别;只有两个都返回NO的时候,才是互斥的。默认情况下是返回NO。 希望对你有帮助 :relaxed: :relaxed:
      • FengxinLi:你给的地址不对
        翀鹰精灵:@Fengxinliju 你的地址不对哦
        FengxinLi:@长发飘飘陈序员 是哪一个 有个juncheng 是空的
        长发飘飘陈序员:@Fengxinliju 没错呀:fearful:

      本文标题:iOS 嵌套在scrollView里面的tableView实现左

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