UITableViewCell中的水平UIScrollView

我试图创build完全相同的效果,在AppStore应用程序中查看屏幕截图:在UITableView中,我有自定义的UITableViewCell的子类。 其中一个是为了展示一些产品的预览,比如说4张图片。 我希望它们能够像AppStore一样展示应用程序的屏幕截图:在带有UIPageControl的水平UIScrollView中。

所以我添加我的UIScrollView和我的UIPageControl到我的UITableViewCell,就像这样:

@implementation phVolumePreviewCell - (id)init { if (self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kVolumePreviewCellIdentifier]) { [self setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; [self setSelectionStyle:UITableViewCellSeparatorStyleNone]; previews = [[NSMutableArray alloc] initWithCapacity:4]; for (int i = 0; i < 4; i++) { [previews addObject:@"dummy"]; } scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero]; [scrollView setPagingEnabled:YES]; [scrollView setBackgroundColor:[UIColor grayColor]]; [scrollView setIndicatorStyle:UIScrollViewIndicatorStyleBlack]; [scrollView setShowsHorizontalScrollIndicator:YES]; [scrollView setBounces:YES]; [scrollView setScrollEnabled:YES]; [scrollView setDelegate:self]; [self.contentView addSubview:scrollView]; [scrollView release]; pageControl = [[UIPageControl alloc] initWithFrame:CGRectZero]; [pageControl setNumberOfPages:[previews count]]; [pageControl setBackgroundColor:[UIColor grayColor]]; [self.contentView addSubview:pageControl]; [pageControl release]; } return self; } 

(注意:我在这里用虚拟数据填充“预览”,只是为了使[预览计数]有效;我想查看scrollView的滚动指示器仅用于testing目的,稍后将隐藏它们)。

我的问题是,我可以滚动整个UITableView包含这个phVolumePreviewCell(UITableViewCell的子类),但我不能滚动UIScrollView。 我怎样才能做到这一点?

我发现的唯一信息是: http : //theexciter.com/articles/touches-and-uiscrollview-inside-a-uitableview.html但它谈到了旧的SDK(即2.2),我敢肯定还有更多“最近”的做法。

一些精确度:

  • 我可以用两个手指滚动UIScrollView。 这不是我想要的,我希望它只能用一个手指滚动。
  • 当我用两根手指滚动时,TableView仍然拦截触摸并向上或向下滚动一点。 当我触摸ScrollView的时候,我想让TableView粘在它的位置上。

我相信我必须弄清楚如何拦截在我的TableView的触摸,如果触摸是在phVolumePreviewCell(自定义的UITableViewCell子类),传递给单元格,而不是在TableView上处理它。

为了logging,我的TableView是在UITableViewController子类中以编程方式创build的:

 @interface phVolumeController : UITableViewController <UITableViewDelegate> { LocalLibrary *lib; NSString *volumeID; LLVolume *volume; } - (id)initWithLibrary:(LocalLibrary *)newLib andVolumeID:(NSString *)newVolumeID; @end 

 @implementation phVolumeController #pragma mark - #pragma mark Initialization - (id)initWithLibrary:(LocalLibrary *)newLib andVolumeID:(NSString *)newVolumeID { if (self = [super initWithStyle:UITableViewStylePlain]) { lib = [newLib retain]; volumeID = newVolumeID; volume = [(LLVolume *)[LLVolume alloc] initFromLibrary:lib forID:volumeID]; [[self navigationItem] setTitle:[volume title]]; } return self; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kVolumePreviewCellIdentifier]; if (cell == nil) { cell = [[[phVolumePreviewCell alloc] init] autorelease]; } [(phVolumePreviewCell *)cell setVolume:volume]; return (UITableViewCell *)cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return kVolumePreviewCellHeight; } 

谢谢你的帮助!

我find了一个解决方法。

从头重新创build一个非常简单的UITableView(8行),并在第二行插入一个UIScrollView,完美地工作。 嵌套的滚动视图(TableView和ScrollView)按预期独立滚动。 所有这些都是在AppDelegate中的单个文件testing项目中完成的。

所以…首先我想“这可能是一个委托问题”,所以我告诉scrollView它的委托是TableView,而不是我自定义的TableViewCell子类。 无济于事。

然后,而不是诉诸自定义,干净的TableViewCell子类,只是添加ScrollView和PageControl,我诉诸在TableView的cellForRowAtIndexPath:方法中创build一个普通的TableViewCell。 然后,我创build一个UIScrollView刚刚初始化TableViewCell,然后将其添加到TableViewCell,并shazam …它的工作原理!

之前:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kVolumePreviewCellIdentifier]; if (cell == nil) { cell = [[[phVolumePreviewCell alloc] init] autorelease]; } [(phVolumePreviewCell *)cell setVolume:volume]; // That does the job of creating the cell's scrollView and pageControl return (UITableViewCell *)cell 

后:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kvcPreviewRowIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kvcPreviewRowIdentifier] autorelease]; previewScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, kvcPreviewScrollViewHeight)]; [previewScrollView setContentSize:CGSizeMake(1000, kvcPreviewScrollViewHeight)]; [[cell contentView] addSubview:previewScrollView]; previewPageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, kvcPreviewScrollViewHeight, tableView.frame.size.width, kvcPreviewPageControlHeight)]; [previewPageControl setNumberOfPages:4]; [[cell contentView] addSubview:previewPageControl]; } return (UITableViewCell *)cell; 

当我从TVCell子类创build我的scrollView的时候,怎么会这样呢? 但是当我创build一个“古典”的TVCell后,从TableView创build的scrollView,它的作品?

我可能find了一个解决scheme,但是我仍然为此感到困惑。