在 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 中保留用于设置偏移量的代码。这将确保在设置视图之前不会完成它,并且它应该可以解决您的问题。这就是为什么您重复使用的单元格很好,因为视图已经设置好了。试试这个。
我在 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 中保留用于设置偏移量的代码。这将确保在设置视图之前不会完成它,并且它应该可以解决您的问题。这就是为什么您重复使用的单元格很好,因为视图已经设置好了。试试这个。