UITableView 中 UIScrollView 中的 ContentOffset 问题
Posted
技术标签:
【中文标题】UITableView 中 UIScrollView 中的 ContentOffset 问题【英文标题】:ContentOffset issue in UIScrollView in UITableView 【发布时间】:2015-03-24 05:47:55 【问题描述】:我在 UITableView 的每个 UITableViewCell 中添加了一个 UIScrollView。
这是我的代码。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString* CellIdentifier = @"Cell";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
UIScrollView *propertyScrollView;
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
propertyScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, tableView.frameWidth, 100)];
[propertyScrollView setContentSize:CGSizeMake(10*tableView.frameWidth, 100)];
[propertyScrollView setPagingEnabled:YES];
propertyScrollView.delegate = self;
propertyScrollView.tag = indexPath.row;
[[cell contentView] addSubview:propertyScrollView];
propertyScrollView.backgroundColor = [UIColor blackColor];
int pagingIndex = [[m_pagingIndexArray objectAtIndex:indexPath.row]intValue];
[propertyScrollView setContentOffset:CGPointMake(pagingIndex*propertyScrollView.frameWidth, 0)];
for(int i=0;i<10;i++)
UIButton *singleImage = [[UIButton alloc]initWithFrame:CGRectMake(i*tableView.frameWidth, 0, propertyScrollView.frameWidth, propertyScrollView.frameHeight)];
[propertyScrollView addSubview:singleImage];
singleImage.titleLabel.text = [NSString stringWithFormat:@"%d",i];
singleImage.titleLabel.textColor = [UIColor blackColor];
singleImage.titleLabel.font = systemFontBoldTypeOfSize(20);
[singleImage setImage:[horizentalImagesArray objectAtIndex:i] forState:UIControlStateNormal];
singleImage.backgroundColor = [UIColor whiteColor];
else
propertyScrollView.tag = indexPath.row;
int pagingIndex = [[m_pagingIndexArray objectAtIndex:indexPath.row]intValue];
[propertyScrollView setContentOffset:CGPointMake(pagingIndex*propertyScrollView.frameWidth, 0)];
return cell;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
int pageIndex = scrollView.contentOffset.x/scrollView.frameWidth;
[m_pagingIndexArray replaceObjectAtIndex:scrollView.tag withObject:[NSString stringWithFormat:@"%d",pageIndex]];
- (void)viewDidLoad
[super viewDidLoad];
m_pagingIndexArray = [[NSMutableArray alloc]init];
for(int i=0;i<10;i++)
[m_pagingIndexArray addObject:@"0"];
我在单个 UIScrollView(启用分页)中添加了 10 个 UIButton。
问题是,如果我滚动 UITableViewCell 的任何一个滚动视图并移动到底部单元格,我可以看到其他一些 UITableViewCell 的滚动视图也滚动到该内容偏移点。
我希望我的所有 UITableview 单元格的 UIScrollView 都能独立滚动。我怎样才能实现它?请帮我解决这个问题。
【问题讨论】:
滚动视图的偏移量就像单元格的任何其他属性一样。由于单元重用,您需要为 cellForRowAtIndexPath 中的每个单元设置它。这意味着您需要将此值存储在模型中。 您正确的 contentSize 将是10*tableView.frameWidth + propertyScrollView.frameWidth
并且关于滚动,我认为单元格被覆盖,您可以在滚动 tableview 后立即重置 contentoffset。这可能会解决您的问题。
@rdelmar,我按照你的建议做了一些改变。结果还是一样。请纠正我在上面的代码中做错了什么。
【参考方案1】:
您将当前页码保存在 m_pagingIndexArray 中,并且所有单元格使用相同的数组,因此假设它包含的页码为 3,那么它将适用于所有单元格。
如果每个单元格被重复使用,您还需要重置每个按钮的文本和图像,正如我在下面添加的那样-
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
UITableViewCell* cell = nil;
UIScrollView *propertyScrollView;
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
propertyScrollView = [[[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, tableView.frameWidth, 100)] autorelease];
[propertyScrollView setContentSize:CGSizeMake(10*tableView.frameWidth, 100)];
[propertyScrollView setPagingEnabled:YES];
propertyScrollView.delegate = self;
propertyScrollView.tag = indexPath.row;
[[cell contentView] addSubview:propertyScrollView];
propertyScrollView.backgroundColor = [UIColor blackColor];
int pagingIndex = [[m_pagingIndexArray objectAtIndex:indexPath.row]intValue];
[propertyScrollView setContentOffset:CGPointMake(pagingIndex*propertyScrollView.frameWidth, 0)];
for(int i=0;i<10;i++)
UIButton *singleImage = [[[UIButton alloc]initWithFrame:CGRectMake(i*tableView.frameWidth, 0, propertyScrollView.frameWidth, propertyScrollView.frameHeight)] autorelease];
[propertyScrollView addSubview:singleImage];
singleImage.titleLabel.text = [NSString stringWithFormat:@"%d",i];
singleImage.titleLabel.textColor = [UIColor blackColor];
singleImage.titleLabel.font = systemFontBoldTypeOfSize(20);
[singleImage setImage:[horizentalImagesArray objectAtIndex:i] forState:UIControlStateNormal];
singleImage.backgroundColor = [UIColor whiteColor];
return cell;
【讨论】:
对于迟到的回复,我深表歉意。它仍然不适合我。你能提出除上述以外的任何其他想法吗? 所有滚动视图都使用 m_pagingIndexArray 吗? 谢谢朋友。我刚刚从超级视图中删除了单元格,并为每一行新创建了单元格。它工作得很好。我已经编辑了答案。如果您认为答案不是解决问题的正确方法,您可以恢复编辑。我有一个疑问。会造成内存问题吗? 是的,ARC 不允许自动发布。如果您使用的是 ARC,则不仅仅是从上述代码中删除自动释放消息。【参考方案2】:如果单元格未被重用,您的代码是正确的,但由于单元格被重用,您需要为每个单元格的滚动视图设置内容偏移量(如果它们被重用)。
你需要写一个else案例-
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if(cell == nil)
// your code
else
// reset the content offset of the scroll view as per your needs for the reused cells
return cell;
【讨论】:
请查看我编辑的问题,它仍然无法正常工作。还有其他建议吗?以上是关于UITableView 中 UIScrollView 中的 ContentOffset 问题的主要内容,如果未能解决你的问题,请参考以下文章