【问题标题】:iPhone - Objective C - UIScrollView inside UITableView rendering funnyiPhone - 目标 C - UITableView 内的 UIScrollView 渲染有趣
【发布时间】:2011-09-27 20:44:18
【问题描述】:

我目前正在开发一个 iPhone 应用程序,该应用程序在 UITableView 中使用 UIScrollView 做一些奇怪的事情。这是我第一次涉足 iPhone 开发,所以我敢肯定我错过了一些愚蠢的东西。

在每个 UITableViewCell 中,我都放入了一个基本的 UITableViewCell。在那个 UITableViewCell 是一个标签和一个 UIScrollView。

标签和滚动视图已设置并正常工作,但当它第一次显示时,它在 y 轴上比应有的位置向下偏移了大约 30 个像素,或者由 XIB/NIB 定位。我不会手动移动它。标签显示在正确的位置。在 0,0。 UIScrollView 应该显示在 0,22,但显示更接近 0,40。

当我滑动滚动包含 UITableView 时,假设 UITableView 滚动时 UITableViewCell 离开屏幕,所有 UIScrollViews 都会显示在正确的位置。

这是 UITableView.cellForRowAtIndexPath 的代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  static NSString *CellIdentifier = @"GalleryRowCell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
  [cell.layer setMasksToBounds:TRUE];
  [cell.layer setCornerRadius:10.0];


  Contagion *c = (Contagion *)[self.dataSet objectAtIndex:indexPath.row];
  GalleryRowViewController *subView = [[GalleryRowViewController alloc] initWithContagion:c];
  [cell.contentView addSubview:subView.view];
  subView.contagionName.text = c.name;
  subView.contagion = c;
  return cell;
}

这是我的 GalleryRowViewController.viewDidLoad 的代码

- (void)viewDidLoad {

[super viewDidLoad];

self.imageScroll.delegate = self;

[self.imageScroll setBackgroundColor:[UIColor blackColor]];
[self.imageScroll setCanCancelContentTouches:NO];

self.imageScroll.indicatorStyle = UIScrollViewIndicatorStyleWhite;
self.imageScroll.clipsToBounds = NO;
self.imageScroll.scrollEnabled = YES;
self.imageScroll.pagingEnabled = NO;

NSInteger x = 0;
CGFloat xPos = 0;
for (x=0;x<=10;x++) {
  UIImage *image = [UIImage imageNamed:@"57-icon.png"];
  UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
  [imageView setBackgroundColor:[UIColor yellowColor]];

  CGRect rect = imageView.frame;
  rect.size.height = 70;
  rect.size.width = image.size.width;
  rect.origin.x = xPos;
  rect.origin.y = 5;

  imageView.frame = rect;

  [self.imageScroll addSubview:imageView];
  xPos += imageView.frame.size.width+5;
}

[self.imageScroll setContentSize:CGSizeMake(xPos, [self.imageScroll bounds].size.height)];

}

--- 编辑图像---

应用加载后:http://img809.imageshack.us/img809/4576/screenshot20110927at427.png

在屏幕外滚动行后:http://img690.imageshack.us/img690/9461/screenshot20110927at428.png

【问题讨论】:

    标签: iphone objective-c xcode uiscrollview


    【解决方案1】:

    好吧,由于我之前的反应水平太低,让我再试一次。

    首先,我刚刚注意到您为每个单元格使用视图控制器的核心问题。引用 Apple 的话,““单个视图控制器通常管理与单个屏幕的内容相关的视图。”这也将摆脱您的 XIB(只需手动配置您的滚动视图),我敢打赌这将摆脱您的问题。

    要继续,您的主要选择是是否按照 Scott 的建议创建 ContagionTableViewCell 类。

    如果是这样,按照 Elements 示例,创建 UITableViewCell ContagionTableViewCell 的子类,其中包含 scrollView、labelview 和 contagion 的属性。就像他们对元素使用自定义设置器一样,对传染使用自定义设置器,这样每当分配它时,它也会更新单元格标签(和相关图片)。

    将您的 imageScroll 代码从 GalleryRowViewController.viewDidLoad 移动到 ContagionTableViewCell 初始化代码中。将图像代码放入一个新的例程中,该例程将从 contagion setter 中调用。

    如果不是,则将 GalleryRowView 控制器代码移动到您的 UITableView 中。我建议你看一下 Apple 的 tableViewSuite 中的 cellForRowAtIndexPath,这是关于子视图的第四个示例。特别是,它显示了将单元格的创建(当您需要一个全新的单元格时)与配置单元格(重用时)分开的这种模式。由于您的滚动视图中有 10 个图像视图,因此您必须决定是删除所有这些(和/或滚动视图),还是在重复使用单元格时进入内部并更新它们的图像。

    【讨论】:

    • 感谢您的回复。你的建议几乎就是我最终为解决这个问题所做的。这肯定与细胞重复使用有关。
    【解决方案2】:

    你能发个截图吗?很难想象你在描述什么。我不确定你是如何计算 y origin 为 22 的。

    作为旁注,我相信通过创建自己的 TableViewCell 子类并使用它而不是默认的 UITableViewCell 来做到这一点会更干净。有一个名为 Elements 的示例显示了如何正确执行此操作:http://developer.apple.com/library/ios/#samplecode/TheElements/Introduction/Intro.html

    【讨论】:

    • 它实际上还不允许我发布图像,我似乎必须获得 10 个代表点。我可以在某个地方给他们发电子邮件吗?我没有一个好地方公开倾倒它们。
    • @erspies - 您可以在线托管它们 - imageshack 或小图片
    • 查看了图像,但我以前从未见过这种行为。我将从子类化 UITableViewCell 开始,这可能会帮助您诊断问题。它可能与 contentrect 以及您在其中放置视图的方式有关。
    【解决方案3】:

    好吧,我不知道这是您问题的原因,但您肯定遇到了问题。请注意,每次要求您输入单元格时,您都在添加galleryRow 子视图。当一个单元格离开屏幕时,它会被放入 reusableCell 队列中。然后你被要求另一个单元格;你从队列中得到它,它仍然有旧的 galleryRow 子视图,现在你添加另一个;所以这不好。您应该重新使用或删除旧的。

    最后,为什么你使用 UITableViewCellStyleSubtitle,而不使用 UITableView 中的任何默认字段?

    【讨论】:

    • 我使用 UITableViewCellStyleSubtitle 是因为我不知道更好吗?这是我第一次尝试破解一个应用程序,而我只有谷歌。
    猜你喜欢
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 1970-01-01
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多