美文网首页iOS技巧
UITableView 嵌套 UITableView的处理

UITableView 嵌套 UITableView的处理

作者: fero2004 | 来源:发表于2017-08-26 10:31 被阅读1070次

    需求:当外层tableview滑动到一定位置的时候保持不动,然后里层的tableview滑动.当里层tableview在最顶端的时候保持不动,滑动外层tableview.

    思路:让两个tableview的手势都一起触发.当滑动到零界点其中一个tableview的contentOffset不变,另一个tableview继续滑动.

    定义FirstTableView继承UITableView

    @interface FirstTableView : UITableView
    
    @end
    
    #import "FirstTableView.h"
    
    @implementation FirstTableView
    
    // 是否支持多手势触发,返回YES,则可以多个手势一起触发方法(子tableview也可以滑动),返回NO则为互斥
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        return YES;
    }
    
    @end
    

    定义SecondTableView继承UITableView

    #import <UIKit/UIKit.h>
    
    @interface SecondTableView : UITableView<UITableViewDelegate,UITableViewDataSource>
    {
        UITableViewCell *cells[10];
        BOOL isCanScroll;
    }
    
    @end
    
    #import "SecondTableView.h"
    
    @implementation SecondTableView
    
    - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
    {
        if(self = [super initWithFrame:frame style:style])
        {
            self.dataSource = self;
            self.delegate = self;
            self.tableFooterView = [UIView new];
            isCanScroll = NO;
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(test:)
                                                         name:@"test"
                                                       object:nil];
            for(int i = 0 ; i < 10; i++)
            {
                cells[i] = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
                cells[i].frame = CGRectMake(0, 0, self.frame.size.width, 44.0f);
            }
            [self reloadData];
        }
        return self;
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return cells[indexPath.row].frame.size.height;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return 10;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        cells[indexPath.row].textLabel.text = @"2";
        return cells[indexPath.row];
    }
    
    - (void)test:(NSNotification *)n
    {
        isCanScroll = YES;
    }
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
        if(isCanScroll == NO)
        {
            [scrollView setContentOffset:CGPointZero animated:NO];
        }
        else
        {
            if(scrollView.contentOffset.y <= 0)
            {
                isCanScroll = NO;
                [[NSNotificationCenter defaultCenter] postNotificationName:@"test2" object:nil];
            }
        }
    }
    
    @end
    

    viewcontroller.直接将FristTablview的contentOffset判断逻辑写在这里,没有封装.

    #import <UIKit/UIKit.h>
    #import "FirstTableView.h"
    #import "SecondTableView.h"
    
    @interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
    {
        FirstTableView *aTableView;
        SecondTableView *bTableView;
        UITableViewCell *cells[10];
    }
    @end
    
    #import "ViewController.h"
    
    @interface ViewController ()
    {
        BOOL isCanScrollView;
    }
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        aTableView = [[FirstTableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
        aTableView.delegate = self;
        aTableView.dataSource = self;
        aTableView.tableFooterView = [UIView new];
        [self.view addSubview:aTableView];
        isCanScrollView = YES;
        for(int i = 0 ; i < 10; i++)
        {
            cells[i] = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
            cells[i].frame = CGRectMake(0, 0, self.view.frame.size.width, 44.0f);
        }
        bTableView = [[SecondTableView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
        cells[9].frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
        [cells[9] addSubview:bTableView];
        [aTableView reloadData];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(test2:)
                                                     name:@"test2"
                                                   object:nil];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (void)test2:(NSNotification *)n
    {
        isCanScrollView = YES;
    }
    
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        if(isCanScrollView)
        {
            //大于这个临界值就保持不变
            if(scrollView.contentOffset.y > 300)
            {
                [scrollView setContentOffset:CGPointMake(0, 300) animated:NO];
                [[NSNotificationCenter defaultCenter] postNotificationName:@"test" object:nil];
                isCanScrollView = NO;
            }
        }
        else
        {
            [scrollView setContentOffset:CGPointMake(0, 300) animated:NO];
        }
    }
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return cells[indexPath.row].frame.size.height;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return 10;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        cells[indexPath.row].textLabel.text = @"1";
        return cells[indexPath.row];
    }
    
    @end
    

    源代码:https://github.com/fero2004/UITableViewInUITableView/tree/master/tableviewtest

    相关文章

      网友评论

        本文标题:UITableView 嵌套 UITableView的处理

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