正如标题所说,我试图给一些UIImageViews一个淡出效果,因为它们越来越接近我的UIScrollView的四个边缘中的任何一个。由于用户可以拖动UIImages,如果他将它们拖向边缘,它们会开始淡出,而不是像UIScrollView的边框那样给出剪切效果。我试过这个教程:
http://www.cocoanetics.com/2011/08/adding-fading-gradients-to-uitableview/
建议在另一个堆栈溢出问题,但它只能应用于UITableViews。我希望图像在离边界一厘米处时开始褪色。
答案 0 :(得分: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
子视图作为蒙版。
答案 1 :(得分:3)
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)
答案 2 :(得分:2)
这里有关于这个问题的几个帖子:
Changing the alpha inside UIScrollView
setting Alpha for UIView that is a subview of UIScrollVIew very slow
以及一些示例代码:
https://gist.github.com/MaximKeegan/2478842
如果你想按自己的方式去,那么首先得到UIScrollView的可见部分:
Getting the visible rect of an UIScrollView's content
然后淡化UIView: