ios UIScrollView 和 多个UITableView混用的性能问题

1、问题描述

  • 在UIScrollView上放置多个UITableView,可以横向滑动。在数据量较多的情况下导致视图加载缓慢,界面卡死,而且无法返回上一界面。

  • 底部是UIScrollView实现,可以左右滑动。每一个展示视图是UITableView实现,每一UITableView视图个数不确定,可以上下滑动。而且要求每一个UITableViewCell可以单独拖动到其他UITableView中去。

2、相关代码实现

pragma mark 请求看板数据

    - (void)loadData {
        
        [APPUtil showActivityIndicatorInView:self.view tag:121212];
        
        apiPB = [GetProjectBoardApi new];
        apiPB.tid = @(_project_id.integerValue);
        
        
        [apiPB startWithCompletionBlockWithSuccess:^(__kindof YTKBaseRequest *request) {
            
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                // 处理耗时操作的代码块...
                    _model = [ProjectBoardModel mj_objectWithKeyValues:request.responseJSONObject];
                
                resultDict = [NSDictionary dictionaryWithDictionary:request.responseJSONObject];
                
                
                //通知主线程刷新
               dispatch_async(dispatch_get_main_queue(), ^{
        
                    [self setUpDateWithModel:_model];
                   
                });
            
            });
            
            
        } failure:^(__kindof YTKBaseRequest *request) {
            
            [APPUtil hideActivityIndicatorInView:self.view mtag:121212];
            
        }];
}

pragma mark 设置数据源

- (void)setModel:(ProjectBoardModel *)model {
    
    _model = model;
    
    [self removeAllSubviews];
   
    [self.listTableViewArray removeAllObjects];
    
    //设置移动范围
    self.contentSize = CGSizeMake((_model.teamtask.count + 1) * (ScreenWidth - 45.0f), self.yyHeight);
    
   #pragma mark 循环创建list
    
    [_model.teamtask enumerateObjectsUsingBlock:^(TaskListModelPro * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        //list便宜量
        static CGFloat nextX = 0.0f;
        
        //tableView背景视图
        UIView *listView = ({
            UIView *listView = UIView.new;
            listView.backgroundColor = Global_BackgroundColor;
            [self addSubview:listView];
            //通过Masonry设置autolayout,设置前一定要钱添加在父视图上
            [listView makeConstraints:^(MASConstraintMaker *make) {
                make.left.equalTo(nextX);
                make.top.equalTo(20);
                make.width.equalTo(ScreenWidth-60);
                make.height.equalTo(kListViewMaxHeight);
            }];
           
            
            //初始化tableView
            UIView *listTableView = ({
                BoardViewListTableView *listTableView = [BoardViewListTableView new];
                //设置tableView的contentInset(也可以通过设置tableView的autolayout来做,可以避免长按header时识别成cell的情况,长按头部应该是移动整个list)
                listTableView.contentInset = UIEdgeInsetsMake(46, 0, 44, 0);
                listTableView.backgroundColor = Global_ClearColor;
                listTableView.delegate = self;
                listTableView.dataSource = self;
                //估算rowHeight,必须设置,否则会引起卡顿
                listTableView.estimatedRowHeight = 90;
               
                [listTableView registerClass:[BoardViewListCell class] forCellReuseIdentifier:NSStringFromClass([BoardViewListCell class])];
                
                //每一个tableView保存自己的数据源指针
                listTableView.model = obj;
                
                listTableView.tableFooterView = UIView.new;
                //显示每一列的滚动条(现在有Bug不显示)
                listTableView.showsVerticalScrollIndicator = YES;
                listTableView.showsHorizontalScrollIndicator = YES;
                [listView addSubview:listTableView];
                [listTableView makeConstraints:^(MASConstraintMaker *make) {
                    make.left.equalTo(0);
                    make.top.equalTo(0);
                    make.right.equalTo(0);
                    make.bottom.equalTo(0);
                }];
                
                [listTableView reloadSectionIndexTitles];
                
                //保存listTableView指针
                [self.listTableViewArray addObject:listTableView];
                
                //设置偏移量
                nextX = (idx+1)*(ScreenWidth-60+15);
                
    
                listTableView;
            });
            listView;
        });
        //nextX置空
        if (idx+1 == _model.teamtask.count) {
            nextX = 0;
        }
        
    }];
    
    
}

3、截图

图片描述

阅读 3.4k
1 个回答

应该怎么改进?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题