10

正如标题所说,我试图给一些 UIImageViews 一个淡出效果,因为它们越来越接近我的 UIScrollView 的四个边缘中的任何一个。由于用户可以拖动 UIImages,如果他将它们拖向边缘,它们就会开始淡出,而不是像 UIScrollView 有边框一样提供那种剪切效果。我试过这个教程:

http://www.cocoanetics.com/2011/08/adding-fading-gradients-to-uitableview/

在另一个堆栈溢出问题中建议,但它只能应用于 UITableViews。我希望图像在距离边界一厘米时开始褪色。

4

3 回答 3

19

与您链接到的 Cocoanetics 帖子中所做的类似,您可以创建一个CAGradientLayer来覆盖您的滚动视图。使用滚动视图的背景颜色(在我的示例中为白色)使其向左、右、上和下边缘淡出:

   CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor;
   CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;

   // first, define a horizontal gradient (left/right edges)
   CAGradientLayer* hMaskLayer = [CAGradientLayer layer];
   hMaskLayer.opacity = .7;
   hMaskLayer.colors = [NSArray arrayWithObjects:(id)outerColor,
                        (id)innerColor, (id)innerColor, (id)outerColor, nil];
   hMaskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],
                           [NSNumber numberWithFloat:0.15],
                           [NSNumber numberWithFloat:0.85],
                           [NSNumber numberWithFloat:1.0], nil];
   hMaskLayer.startPoint = CGPointMake(0, 0.5);
   hMaskLayer.endPoint = CGPointMake(1.0, 0.5);
   hMaskLayer.bounds = self.scrollView.bounds;
   hMaskLayer.anchorPoint = CGPointZero;

   CAGradientLayer* vMaskLayer = [CAGradientLayer layer];
   // without specifying startPoint and endPoint, we get a vertical gradient
   vMaskLayer.opacity = hMaskLayer.opacity;
   vMaskLayer.colors = hMaskLayer.colors;
   vMaskLayer.locations = hMaskLayer.locations;
   vMaskLayer.bounds = self.scrollView.bounds;
   vMaskLayer.anchorPoint = CGPointZero;

   // you must add the masks to the root view, not the scrollView, otherwise
   //  the masks will move as the user scrolls!
   [self.view.layer addSublayer: hMaskLayer];
   [self.view.layer addSublayer: vMaskLayer];

免责声明:这确实使四个角的渐变/淡化加倍。您可以查看结果并确定它们是否适合您。如果没有,您也可以尝试在 Photoshop 中绘制透明图像,并UIImageView在顶部添加一个子视图作为蒙版,使用您绘制的图像。

在此处输入图像描述

Youtube 屏幕截图

于 2013-05-31T22:28:40.127 回答
4

Nate 答案的 Swift 版本,但仅适用于顶部和底部:

        let innerColor = UIColor(white: 1.0, alpha: 0.0).CGColor
        let outerColor = UIColor(white: 1.0, alpha: 1.0).CGColor;

        // define a vertical gradient (up/bottom edges)
        let colors = [outerColor, innerColor,innerColor,outerColor]
        let locations = [0.0, 0.15,0.85,1.0]

        var vMaskLayer : CAGradientLayer = CAGradientLayer()// layer];
        // without specifying startPoint and endPoint, we get a vertical gradient
        vMaskLayer.opacity = 0.7
        vMaskLayer.colors = colors;
        vMaskLayer.locations = locations;
        vMaskLayer.bounds = self.scrollView.bounds;
        vMaskLayer.anchorPoint = CGPointZero;

        // you must add the mask to the root view, not the scrollView, otherwise
        //  the masks will move as the user scrolls!
        self.view.layer.addSublayer(vMaskLayer)
于 2015-11-30T12:08:20.150 回答
2

这里有几个关于这个问题的帖子:

更改 UIScrollView 中的 alpha

为作为 UIScrollVIew 的子视图的 UIView 设置 Alpha 非常慢

和一些示例代码:

https://gist.github.com/MaximKeegan/2478842


如果你想走自己的路,那么首先获取 UIScrollView 的可见部分:

获取 UIScrollView 内容的可见矩形

然后淡化 UIView:

具有淡入淡出或模糊效果的 UIView 边框

于 2013-05-31T21:56:35.697 回答