单个屏幕上有两个UITableView

时间:2012-03-21 12:46:02

标签: iphone ios uitableview delegates uiscrollview

我想在单个屏幕上制作两个表格,这样如果表格A向下滚动,表格B同时向上滚动。有人可以编码或为我提供任何简单的方法。

2 个答案:

答案 0 :(得分:3)

UITableView派生自UIScrollView,因此您可以使用一个表格视图的viewDidScroll委托方法来控制其他表格视图滚动位置。

答案 1 :(得分:2)

正如吴宝所说,你必须使用UIScrollViewDelegate。但你必须检查,此刻scrollView正在拖动/活动。因为否则你会遇到这样的问题:你将从两个滚动视图中获得委托回调,并且它们会同时给予彼此更改,从而导致无限循环/无限滚动。

详细说明,您必须检查:- (void)scrollViewDidScroll:(UIScrollView *)scrollView

但是你必须记住以前的偏移,所以你知道值的变化。 (或者您的视图具有相同的高度。然后您可以使用contentSize.height-offset作为其他视图的偏移量。

我会尝试将其写下来(未经测试):

@interface ViewController () <UITableViewDelegate,UIScrollViewDelegate>

// instances of your tableviews
@property (nonatomic, strong) UITableView *tableLeft;
@property (nonatomic, strong) UITableView *tableRight;

// track active table
@property (nonatomic, strong) UIScrollView* activeScrollView;

// helpers for contentoffset tracking
@property (nonatomic, assign) CGFloat lastOffsetLeft;
@property (nonatomic, assign) CGFloat lastOffsetRight;

@end


@implementation ViewController

- (void) viewDidLoad
{
  [super viewDidLoad];
  self.tableLeft.delegate  = self;
  self.tableRight.delegate = self;
}

– (void) scrollViewWillBeginDragging: (UIScrollView*) scrollView
{
   self.activeScrollView = scrollView;
   self.tableViewRight.userInterActionEnabled = (self.tableViewRight == scrollView);
   self.tableViewLeft.userInterActionEnabled  = (self.tableViewLeft  == scrollView);
}

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
   if(!decelerate) {
     self.activeScrollView = nil;
     self.tableViewRight.userInterActionEnabled = YES;
     self.tableViewLeft.userInterActionEnabled  = YES;
   }
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
     self.activeScrollView = nil;
     self.tableViewRight.userInterActionEnabled = YES;
     self.tableViewLeft.userInterActionEnabled  = YES;
}

- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
  if(self.activeScrollView == self.tableViewLeft)
  {
    CGFloat changeLeft  = self.tableViewLeft.contentOffset.y  - self.lastOffsetLeft;
    self.tableViewRight.contentOffset.y += changeLeft;
  }
  else if (self.activeScrollView == self.tableViewRight)
  {
    CGFloat changeRight = self.tableViewRight.contentOffset.y - self.lastOffsetRight;
    self.tableViewLeft.contentOffset.y += changeRight;
  }

  self.lastOffsetLeft  = self.tableViewLeft.contentOffset.y;
  self.lastOffsetRight = self.tableViewRight.contentOffset.y;
}

@end

基本上就是这样。它还会锁定不活动的scrollview。因为滚动两者都会导致丑陋的行为。 contentOffset.y += changeLeft;也许不会工作。您必须创建一个新的CGPoint / CGSize。