gpt4 book ai didi

iphone - UITableViewCell 内的水平 UIScrollView

转载 作者:行者123 更新时间:2023-12-03 18:14:15 25 4
gpt4 key购买 nike

我正在尝试创建与 AppStore 应用程序中查看屏幕截图完全相同的效果:在 UITableView 内,我有 UITableViewCell 的自定义子类。其中之一旨在显示某些产品的预览,例如 4 张图像。我希望它们以与 AppStore 呈现应用程序屏幕截图相同的方式显示:在水平 UIScrollView 及其附加的 UIPageControl 内。

所以我将 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的滚动指示器仅用于测试目的,稍后我将隐藏它们上)。

我的问题是我可以滚动包含此 phVolumePreviewCell (UITableViewCell 的子类)的整个 UITableView,但我无法滚动 UIScrollView。我怎样才能实现这个目标?

我找到的唯一信息是:http://theexciter.com/articles/touches-and-uiscrollview-inside-a-uitableview.html但它谈到了旧的 SDK(即 2.2),并且我确信有一种更"new"的方法可以做到这一点。

一些精度:

  • 我可以用两根手指滚动 UIScrollView。这不是我想要的,我希望它只能用一根手指滚动。
  • 当我用两根手指滚动时,TableView 仍然会拦截触摸并稍微滚动到顶部或底部。我希望当我触摸 ScrollView 时 TableView 保持在其位置。

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

郑重声明,我的 TableView 是在 UITableViewController 子类中以编程方式创建的:

@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;
}

感谢您的帮助!

最佳答案

我找到了解决方法。

从头开始重新创建一个非常简单的 UITableView(8 行),并在第二行中插入 UIScrollView,效果非常好。嵌套 ScrollView (TableView 和 ScrollView)按预期独立滚动。所有这些都是在 AppDelegate 的单文件测试项目中完成的。

所以...首先我认为“这可能是一个委托(delegate)问题”,所以我告诉scrollView它的委托(delegate)是TableView,而不是我自定义的TableViewCell子类。没有效果。

然后,我没有采用仅添加 ScrollView 和 PageControl 的自定义、干净的 TableViewCell 子类,而是在 TableView 的 cellForRowAtIndexPath: 方法中创建一个普通的 TableViewCell。然后,我在初始化 TableViewCell 后立即创建一个 UIScrollView,然后将其添加到 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 子类创建 ScrollView 时,到底是怎么回事,它表现得不太好?但是当我在创建“经典”TVCell后立即从TableView创建scrollView时,它可以工作吗?

我可能已经找到了解决方案,但我仍然对其原因感到困惑。

关于iphone - UITableViewCell 内的水平 UIScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4324514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com