2013-12-11 2 views
0

Я создал tableView с пользовательскими ячейками, которые содержат изображение и scrollView. Все виды прокрутки содержат метки более широкие, чем границы экрана, поэтому, когда я просматриваю влево/вправо, я хочу, чтобы все scrollViews прокручивались в том же направлении. Проблема в том, что я не знаю, как получить ссылку на каждый scrollView в методе scrollViewDidScroll.scrollViewDidScroll метод, не ссылающийся на все scrollviews из вида таблицы

мой ViewController класс:

#import "EPGViewController.h" 

@interface EPGViewController(){ 
    NSArray *EPGList; 
    int scrollPositionX; 
} 

@end 

@implementation EPGViewController 


- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.navigationController.navigationBarHidden = false; 

    EPGList = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10",@"11",@"12", nil]; 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return EPGList.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *hlCellID = @"EPGCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:hlCellID]; 
    if(cell == nil) { 
     cell = [[UITableViewCell alloc] 
       initWithStyle:UITableViewCellStyleDefault reuseIdentifier:hlCellID]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 
    UILabel *label = (UILabel *)[cell viewWithTag:15]; 
    label.text = EPGList[indexPath.row]; 

    UIScrollView *scrolView = (UIScrollView *)[cell viewWithTag:16]; 
    scrolView.backgroundColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0]; 
    scrolView.delegate = self; 
    scrolView.tag = indexPath.row+101; 
    scrolView.scrollEnabled = YES; 
    scrolView.contentSize = CGSizeMake(scrolView.frame.size.width,scrolView.frame.size.height); 
    [scrolView setShowsHorizontalScrollIndicator:NO]; 
    [scrolView setShowsVerticalScrollIndicator:NO]; 

    int i=0; 
    for(i=0;i<15;i++){ 
     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0+i*100, 0, 100, 100)]; 
     label.text = @"HELLO"; 
     label.textColor = [UIColor blackColor]; 
     label.backgroundColor = [UIColor clearColor]; 
     label.textAlignment = NSTextAlignmentCenter; 
     label.font = [UIFont fontWithName:@"ArialMT" size:18]; 
     [scrolView addSubview:label]; 
     scrolView.contentSize = CGSizeMake(scrolView.frame.size.width+i*label.frame.size.width,scrolView.frame.size.height); 
    } 
    [cell addSubview:scrolView]; 
    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return 80.0; 
} 

- (void)scrollViewDidScroll:(UIScrollView *)callerScrollView { 
    scrollPositionX = callerScrollView.contentOffset.x; 

    //if this is called with table view exit 
    if (callerScrollView == self.tableView) return; 

    int indexPath = callerScrollView.tag-101; 
    NSLog(@"TAG: %d",indexPath); 

    for (UITableViewCell *cell in self.tableView.visibleCells) { 
     //TODO: Don’t use tags. 
     UIScrollView *cellScrollView = (UIScrollView *)[cell viewWithTag:16]; 
     if (callerScrollView == cellScrollView) continue; 

     cellScrollView.contentOffset = CGPointMake(scrollPositionX, 0); 
    } 
} 


@end 

EDIT:

мне удалось решить мою проблему, удалив строку, в которой я добавить различные теги к scrollviews в виде таблицы. теперь я просто устанавливаю смещение на scrollview с тегом 16.

+0

В каком классе вы указываете scrollViewDidScroll? –

+0

В viewController, который контролирует представление таблицы. UIScrollViewDelegate включен в файл .h. – lugonja

ответ

1

Есть несколько неправильных вещей в вашем коде. Здесь лучше реализация:

- (void)scrollViewDidScroll:(UIScrollView *)callerScrollView { 
    scrollPositionX = callerScrollView.contentOffset.x; 

    if (callerScrollView == self.tableView) return; 

    for (UITableViewCell *cell in self.tableView.visibleCells) { 

     //TODO: Don’t use tags. 
     UIScrollView *cellScrollView = (UIScrollView *)[cell viewWithTag:16]; 
     if (callerScrollView == cellScrollView) continue; 

     cellScrollView.contentOffset = CGPointMake(scrollPositionX, 0); 
    } 
} 

Некоторые примечания: вывода дополнительных

  • Этот метод будет вызываться табличном, так что вы должны проверить это.
  • Не используйте индексы, просто итерации.
  • Я использовал проверку scrollViews, но в принципе там было бы без него.
  • Использование тегов для идентификации подпунктов - не очень хорошая идея.
  • Не звоните reloadData каждый раз!
+0

Я, например, могу сказать 10 элементов в массиве табличных представлений, поэтому я добавил 10 различных тегов для scrollViews в ячейке таблицы. Как я могу получить доступ к этим 10 ячейкам без тега? Я должен обновить contentOffset только по ячейкам, которые я не перетаскиваю (9 из них). Как я могу распознать их без тега? – lugonja

+0

Итак, у вас есть 10 ячеек, каждый с одним scrollView? Вы можете обновить contentOffset на всех 10 scrollViews, это не влияет на та, которую вы перетаскиваете. Вы установили 'x' в' x'. Тогда, как правило, вы подклассифицируете 'UITableViewCell' и создаете свойства для доступа к внутренним представлениям. Или даже лучше, вы создаете только методы '-updateXOffsetTo:' например. – Tricertops

+0

Я нашел свою ошибку! Мне не нужно добавлять еще один тег для каждого прокрутки, достаточно просто установить тег 16, и теперь все работает! – lugonja

0

Вы должны использовать [tableView visibleCells]; чтобы получить все ячейки, которые видны в этот момент.

+0

Я пробовал это, но массив visibleCells возвращает мне ноль. См. Мое редактирование. – lugonja

+0

[self.tableView visibleCells]; возвращается nil? вы можете загрузить свой код на git. Мне немного любопытно об этом. – D33pN16h7

+0

Я добавил весь файл .m с предложениями, которые дал мне iMartin. – lugonja

0

Вы можете использовать visibleCells метод UITableView «s, чтобы получить все видимые ячейки и получить scrollviews оттуда (вы можете использовать viewwithTag как вы это делаете, но и на всех клетках).

Тогда вам нужно будет запомнить настройку положения прокрутки, поскольку ячейки повторно используются/воссозданы - вероятно, сохранить прокручиваемое смещение как свойство вашего контроллера просмотра.

+0

Я отредактировал свое сообщение с вашим предложением, но все же я не получаю движение на другие ячейки. Я снова делаю что-то неправильно? – lugonja

0

Проблема в том, что вы используете dequeueReusableCellWithIdentifier вместо того, чтобы просто перебирать ячейки, которые уже были показаны.

ли что-то вроде:

for (NSInteger j = 0; j < [tableView numberOfSections]; ++j) 
{ 
    for (NSInteger i = 0; i < [tableView numberOfRowsInSection:j]; ++i) 
    { 
     if (!(indexPath.section == j && indexPath.row == i)) 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]]; 
    UIScrollView *scrollView = (UIScrollView *)[cell viewWithTag:16]; 
    scrollView.contentOffset = CGPointMake(position_x, scrollView.frame.size.height); 
} 
    } 
} 
+0

Или зациклируйте массив, полученный из [tableView visibleCells], как это предложено в других ответах. Что бы вы ни делали, не выходите из очереди! –

+0

Я пробовал это, но другие ячейки не обновляются. После этого кода вы предположили, что я просто добавил '[self.tableView reloadData];' – lugonja

Смежные вопросы