我在 iPhone 上有一个高度约为 1,5 屏幕的图像。我想让它作为 UITableView 的连续背景。它必须随着表格滚动。有什么办法吗?
6 回答
您可以将此图像转换为一种图案,然后可以无限期地重复该图案作为表格视图的背景。首先,这样做:
UIColor *backgroundPatternColor = [UIColor colorWithPatternImage:myImage];
然后将表格视图或任何其他视图的背景颜色设置为backgroundPatternColor
.
有简单的解决方案。
使用此代码为表格视图设置背景图案图像(图案图像可能是小图像,您想平铺):
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"back"]];
}
平铺图像将无限上下平铺,并使用 tableView 滚动。
然后做下一个重要的技巧 - 为单元格设置透明背景颜色,因为设置 tableView backgroundColor 也会为单元格设置平铺背景:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
cell.backgroundColor = [UIColor clearColor];
}
将此方法用于简单的 tableView 单元格,否则复杂单元格的透明背景会导致性能不足。
表格视图滚动很大程度上是一种错觉,因为表格单元在不使用时会排队,而当用户滑动/滚动时再次需要新的单元格时会出列。我们经常将此称为跑步机效果,您在屏幕上看到的内容就像跑步机的皮带。它仅存在于视口中,实际上并不会滚动得更远,尽管它以其他方式出现。这意味着您的表格视图的背景图像将固定在适当的位置,而不是随着您的单元格滚动。
我认为在图像与单元格一起滚动的地方做你想要的唯一方法是将图像分解成单元格大小的片段,并将每个单元格的背景设置为该索引路径的图像。
所以说你有一个像这样的表格视图:
CELLS INDEX PATH
|----------------------|
| | | 0, 0
|----------------------|
| / \ | 0, 1
|----------------------|
| YOUR IMAGE | 0, 2
|----------------------|
| HERE | 0, 3
|----------------------|
| \ / | 0, 4
|----------------------|
将您的图像预先切成大小相等的部分,这些部分适合您的单元格的正确高度。然后,您可以只抓取索引路径的行cellForRowAtIndexPath
并根据它设置单元格的背景图像。如果您的单元格数量超过图像高度,您最终可能会用完图像,但是,这很容易检查。
如果您将图像命名为 background_0.png、background_1.png 等,您可以像这样获取您需要的图像:
UIImage *imageForCell = [UIImage imageNamed:[NSString stringWithFormat:@"background_%d", [indexPath row]]];
[[cell backgroundImageView] setImage:imageForCell];
backgroundImageView
您添加到自定义单元格的图像视图在哪里。
您要求为您的表格提供平铺的滚动背景。通常用于在图块中滚动的 UI 是表格。所以用一张桌子作为你的背景:)
您需要两个表:一个 backgroundTableView 和一个 contentTableView。contentTableView 是您需要的任何内容,但请确保将单元格和表格的背景颜色和视图设置为 clear/nil。
backgroundTableView 包含您的平铺图像:也就是说,每个单元格都应该是平铺图像的高度,并且应该包含您的平铺图像。
然后当您滚动 contentTableView 时,更新 backgroundTableView 的 contentOffset 以匹配:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView == self.contentTableView) {
self.backgroundTableView.contentOffset = self.contentTableView.contentOffset;
}
}
确保将控制器设置为两个表的数据源和委托。此外,请确保 backgroundTableView 中有足够的“内容”(行数 * 高度),它可以继续滚动到至少 contentTableView 的末尾。
啊啊啊完成了!
UITableView 继承自 UIScrollView。我建议您将图像添加为 UITableView 层次结构的自定义子视图。
UIImageView *imageView = [UIImageView alloc] initWithImage:myImage];
[self.tableView insertSubview:imageView atIndex:0];
现在,您可能需要继承 UITableView 并提供您自己的实现
- (void)layoutSubviews
{
[super layoutSubviews];
[self sendSubviewToBack:myImageView];
}
我刚刚把这段代码从我的脑海中拉出来,所以你可能需要摆弄它。
您可以将图像设置为表格的背景视图。
self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"YOUR_BACKGROUND_IMAGE"]];