2012-10-05 93 views
1

我想要的是一个具有重复平铺图像作为背景的UIScrollView。UIScrollView重复背景

答案很明显,这个问题如下:

myScrollView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"myRepeatingImage.png"]]; 

然而,这种解决方案具有多种问题...

  1. 性能是可怕的。
  2. 它不能“正常”缩放。

我的下一个想法是添加一个UIView(我们称之为backgroundView)myScrollView作为背景颜色,并将所有子视图添加到backgroundView。然而,这会随着不断调整backgroundView的大小而变得非常混乱,以至于当用户缩小(甚至暂时超出最小缩放级别)时,您无法看到backgroundView的“周围”。

有什么建议吗?

这个问题类似,但问题是没有答案 UIScrollView with pattern image as background

+0

这个问题没有答案,但最终的解决方案发布为评论。使用少量图像视图并在滚动时手动调整帧,可以减少仅使用一个图案图像视图的性能问题。我不确定你是否说你想看到背景视图的“周围”,但是这种方法会让你,因为背景将是你使用的无数图像视图的固定大小。如果我是你,我会创建一个自定义控件来管理图像视图的位置和数量,以保持逻辑独立。 – Matt

+0

是的,我看到了评论。但是,不,我不想看到背景,评论非常含糊,并没有提到缩放如何使用该方法,所以我仍然很困惑。 – MikeS

回答

1

我想这是你想要做什么。

把UIImageView的一些数字(z)作为背景。将这些解压缩到单独的控件中,只需添加一个“背景视图”即可。假设你想向上,向下,向左和向右滚动。您还想缩小内容大小。因此,您需要x个图像来覆盖您的滚动视图宽度,以及s图像来缓存缩放的宽度。 (y覆盖高度和t到缓冲区高度,所以z = x + r + y + t)

注意:当我说缓冲宽度时,我的意思是把图像放在一个原点位于内容大小。通过这种方式缩小内容范围时,您将看到这些图像,而不是“背景”的“周围”。

当您向右滚动足够的距离(基于与滚动视图边界相关的图像大小或可见框架的位置),然后将现在没有可见图像视图移动到右侧的右侧,大多数图像视图。做类似的事情滚动左,上,下。当发生缩放时,您可能需要添加/删除图像视图...或者只是使用最大数量的图像视图。

关键是要提高性能,所以理想情况下您的图像视图数量很少。该数字与sizeof(scrollview.bounds)/ sizeof(image)成比例地增加。 sizeof意思框架大小,不是字节,自然。

编辑: 为了帮助说明这个概念,我们可以做出以下类比。滚动视图是在瓷砖地板的一部分看到的镜头,滚动视图的内容背景是瓷砖地板。但是,我们只使用基于镜头的足够数量的瓷砖。随着镜头的移动,我们将不可见的瓷砖移动到镜头移动到的区域。随着镜头缩小,我们添加瓷砖(如果在放大时将其删除)。我希望这有助于清理事情,而不是让事情变得更加混乱。

+0

是的,这很清楚,谢谢。我想我只是希望有一个更简单的方法,但它听起来像不是这样。有一件事我想知道,但是...说一个UIScrollView的最小缩放等级是.25。什么是实际最小变焦,因为用户在技术上可以在其恢复到原位之前进一步缩小尺寸?换句话说,是否有数学方法来确定't',还是仅仅是试验和错误? – MikeS

+0

我敢肯定,行为是由一些数学函数控制的,我相信它可以通过一些深思熟虑的测试进行反向设计,甚至可能在某处记录下来......但我不知道实际的答案。让你的代码按你想要的方式工作的最简单的方法是一些试验和错误测试......也许如果你把这个逻辑放在控件中,添加一个numberOfBufferImages或sizeOfBuffer属性来添加足够的图像来填充缓冲区大小...然后你的试验和错误将测试该财产的各种价值。 – Matt

+0

Gotcha。希望这是一个众所周知的事实,“如果最小变焦量是x,真正的最小缩放拉伸总是x/2”或类似的东西。测试它! – MikeS

0

这为我工作:

scrollView.backgroundColor = UIColor.init(patternImage: UIImage(named: "repeatable paper background")!) 

希望这可以帮助别人谁发现这一点,这些年过去了!