在 UITableViewCell 中设置 UIScrollView 内容偏移量在非重复使用的出队单元格中不起作用

Setting UIScrollView content offset in a UITableViewCell doesn't work in non-reused dequeued cells

我在 UITableViewCell 子类中放置了一个 UIScrollView,我想在 UITableView 显示它之前将 UIScrollView 的内容 x 偏移设置为 320。

所以没问题,我在 configureCell:withIndexPath: 方法中的 UIScrollView 上调用 setContentOffset,并在 tableView:cellForRowAtIndexPath: 委托方法中调用后者。这是它的样子:

- (void)viewDidLoad {
  UINib *nib = [UINib nibWithNibName:@"myCellNib" bundle:[NSBundle mainBundle]];
  [_tableView registerNib:nib forCellReuseIdentifier:@"cell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  myCell *cell = [_tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
  [self configureCell:cell atIndexPath:indexPath];
  return cell;
}


- (void)configureCell:(myCell *)cell atIndexPath:(NSIndexPath *)indexPath {
  [cell.scrollView setContentOffset:CGPointMake(320, 0)];
}

到目前为止一切顺利,除了现在第一批加载的单元格没有得到预期的结果(所有子视图及其属性设置正确,内容偏移除外),但是如果我向下滚动 UITableView 新加载(重复使用)的单元格很好,我不确定到底发生了什么。哈普!

注意:当我调用 setContentOffset 时,我检查了我的单元格子视图 (UIScrollView) 是否为零,并且我从 NSLog(@"%@", NSStringFromCGPoint(offset));[=27 得到了正确的结果=]

注意:我为此实施的解决方案是检查 UIScrollView contentSize 属性 并在它等于 CGSizeZero 时手动设置它,这是从已注册的 NIB 初始化非重用单元格时会发生的情况。

if (CGSizeEqualToSize(cell.scrollView.contentSize, CGSizeZero)) {
  [cell.scrollView setContentSize:CGSizeMake(self.view.frame.size.width * 3, 150)];  
}

我认为您正在尝试在视图生命周期中过早地设置内容偏移量。您需要做的是尝试覆盖 -(void)viewDidLayoutSubviews。也许是这样的:

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];

    //write some loop here to cycle through all the index paths and then:
    myCell *cell = (myCell*)[self.tableView cellForRowAtIndexPath:indexPath];
    [self configureCell:cell atIndexPath:indexPath];



}

编写一个循环遍历所有索引并获取单元格。然后调用配置单元格方法。还要确保在 prepareCellForReuse 中保留用于设置偏移量的代码。这将确保在设置视图之前不会完成它,并且它应该可以解决您的问题。这就是为什么您重复使用的单元格很好,因为视图已经设置好了。试试这个。