UIScrollView上的掩码覆盖

时间:2011-04-18 22:16:07

标签: iphone objective-c

你会如何在UIScrollView上覆盖各种掩码图像?

例如,我左边和右边有一个黑色的图像,中间是白色。我想使用它,以便滚动视图中的项目逐渐淡出到两侧,中心项目完全不透明。

此外,放置滚动视图的视图背景是一个动态且可以更改的图像(不是纯色)。

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

你的问题最终成为我在基本问题上找到的最佳来源,所以我决定在这里发布我的解决方案。

如果您将蒙版直接添加到滚动视图,最终会出于某种原因将蒙版应用于内容本身 - i。即滚动时透明度不会改变。根据其他帖子的建议,我将渐变放在滚动视图的视图中(或者更确切地说,包含)。因此,scrollContainer是一个UIViewObject,其唯一的子视图是相关的滚动视图。

此蒙版配置为从左向右滚动。您可以通过操纵渐变的起点和终点属性将其更改为从上到下。

一个缺点是它还会剪辑滚动视图的滚动位置条指示器。由于我的情景不需要,这是可以接受的,但你的里程可能会有所不同。

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = scrollView.bounds;
gradient.colors = [NSArray arrayWithObjects:
                   (id)[[UIColor colorWithWhite:0 alpha:0] CGColor],
                   (id)[[UIColor colorWithWhite:0 alpha:1] CGColor],
                   (id)[[UIColor colorWithWhite:0 alpha:1] CGColor],
                   (id)[[UIColor colorWithWhite:0 alpha:0] CGColor], nil];
gradient.locations=[NSArray arrayWithObjects:
                    [NSNumber numberWithFloat:0],
                    [NSNumber numberWithFloat:.1],
                    [NSNumber numberWithFloat:.9],
                    [NSNumber numberWithFloat:1], nil];
gradient.startPoint=CGPointMake(0, .5);
gradient.endPoint=CGPointMake(1, .5);
[scrollContainer.layer setMask:gradient];

答案 1 :(得分:0)

如果您在滚动视图后面有纯色背景,只需将图像叠加在滚动视图的顶部而不是尝试在其中执行蒙版,就可以获得更好的性能。

答案 2 :(得分:0)

尝试以下几点:

// I assume you are in a UIViewController and self.view is set to some kind of view

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 420)];
scrollView.backgroundColor = [UIColor redColor];
[self.view addSubview: scrollView];
[scrollView release];

// add img with gradient
UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"my-gradient.png"];
imgView.frame = CGRectMake(0, 0, 160, 420);
[self.view addSubview: imgView];
[imgView release];

这会给你一个从左边开始的渐变,一直到整个高度的中心,假设“my-gradient.png”是一个实际上包含渐变的图像。

答案 3 :(得分:0)

这些操纵是消费者的大资源。最好的方法是(如果你的情况允许的话)在UIScrollView上放置一个掩码图像。这个图像的背景应该是透明的(例如png32),图像应该是alpha梯度。

答案 4 :(得分:0)

使用insertView:yourView atIndex:0