Два UITableView на одном экране - PullRequest
0 голосов
/ 21 марта 2012

Я хочу создать две таблицы на одном экране, чтобы при прокрутке таблицы A отображалась таблица B одновременно с прокруткой вверх. Может кто-нибудь написать это или предоставить мне простой способ сделать это.

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

UITableView является производным от UIScrollView, поэтому вы можете использовать метод делегата одного представления таблицы viewDidScroll для управления позицией прокрутки другого представления таблицы.

2 голосов
/ 21 марта 2012

Как упомянул Wubao, вы должны использовать 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

Вот и все. Он также блокирует неактивное представление прокрутки. Потому что прокрутка обоих приведет к уродливому поведению. Также contentOffset.y += changeLeft; не будет работать, вероятно. Вы должны создать новый CGPoint / CGSize.

...