我正在开发一款iPhone应用程序,它在UITableView中使用UIScrollView做一些奇怪的事情。这是我第一次涉足iPhone开发者,所以我确信这是一件我很遗憾的事情。
在每个UITableViewCell中,我都放入了一个基本的UITableViewCell。因为UITableViewCell是一个Label和一个UIScrollView。
标签和滚动视图已设置并正常工作,但是当它首次显示时,它在y轴上向下偏移约30个像素,或者由XIB / NIB定位。我不是手动移动它。标签显示在正确的位置。在0,0。 UIScrollView应显示在0,22,但显示接近0,40。
当我滑动滚动包含UITableView时,所有UIScrollViews将显示在正确的位置,假设当UITableView滚动UITableViewCell离开屏幕时。
以下是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)];
}
---编辑图像---
App Appads之后:http://img809.imageshack.us/img809/4576/screenshot20110927at427.png
在屏幕外滚动行后:http://img690.imageshack.us/img690/9461/screenshot20110927at428.png
答案 0 :(得分:1)
好吧,因为我之前的反应是一个太低的水平,让我再拍一次。
首先,我刚刚注意到您正在为每个单元使用viewcontroller的核心问题。引用Apple,“”单个视图控制器通常管理与单个屏幕内容相关的视图。“这也将摆脱你的XIB(只是手动配置你的滚动视图),我打赌这将摆脱你的问题。
要继续,您的主要选择是是否按照Scott的建议创建一个ContagionTableViewCell类。
如果是这样,按照Elements示例,创建一个UITableViewCell ContagionTableViewCell的子类,其中包含scrollView,labelview和传染的属性。就像他们为元素使用自定义setter一样,使用一个用于传染,因此无论何时分配它,它还会更新单元格标签(和相关图片)。
将您的imageScroll代码从GalleryRowViewController.viewDidLoad移动到ContagionTableViewCell初始化代码中。将图像代码放入一个新的例程中,该例程将从传染设置器中调用。
如果不是,则将GalleryRowView Controller代码移动到UITableView中。我建议你看看Apple的tableViewSuite中的cellForRowAtIndexPath,它是子视图的第四个例子。特别是,它显示了这种分离单元格创建(当您需要一个全新单元格)与配置单元格(重用时)的模式。由于您在scrollView中有10个imageView,因此您必须决定是删除所有这些(和/或滚动视图),还是只需到达内部并在重复使用单元格时更新其图像。
答案 1 :(得分:0)
你能发布截图吗?有点难以想象你所描述的内容。我不确定你是如何计算起源的22岁。
作为旁注,我相信它更干净,可以通过creatint创建自己的TableViewCell子类,并使用它而不是默认的UITableViewCell。有一个名为Elements的示例,它显示了如何正确执行此操作:http://developer.apple.com/library/ios/#samplecode/TheElements/Introduction/Intro.html
答案 2 :(得分:0)
嗯,我不知道这是你问题的原因,但你肯定遇到了问题。请注意,每次要求您提供单元格时,都会添加galleryRow子视图。当一个单元离开屏幕时,它被放在reusableCell队列上。然后你被问到另一个细胞;你从队列中得到它,它仍然有旧的galleryRow子视图,现在你再添加一个;所以这不好。您应该重复使用或删除旧的。
最后,为什么你使用UITableViewCellStyleSubtitle,然后不使用UITableView中的任何默认字段?