我知道如何为iOS 6+附带的新应用程序商店应用程序的Share子视图中的视图创建和设置动画(请参阅随附的屏幕截图),但我不知道如何添加那个很好的<此视图上的strong>带透明度的着色效果。
任何人都可以提供代码示例,使UIView
看起来与截图中的完全一致吗?
P.S。仅UIView的alpha
属性不会这样做。
答案 0 :(得分:31)
您可以将此方法添加到UIView类别,并根据需要重复使用。 它将“theColor”中的线性黑色渐变应用于给定视图的透明度。
您的项目中应该有QuartzCore.framework才能使用CAGradientLayer对象。
+ (void)addLinearGradientToView:(UIView *)theView withColor:(UIColor *)theColor transparentToOpaque:(BOOL)transparentToOpaque
{
CAGradientLayer *gradient = [CAGradientLayer layer];
//the gradient layer must be positioned at the origin of the view
CGRect gradientFrame = theView.frame;
gradientFrame.origin.x = 0;
gradientFrame.origin.y = 0;
gradient.frame = gradientFrame;
//build the colors array for the gradient
NSArray *colors = [NSArray arrayWithObjects:
(id)[theColor CGColor],
(id)[[theColor colorWithAlphaComponent:0.9f] CGColor],
(id)[[theColor colorWithAlphaComponent:0.6f] CGColor],
(id)[[theColor colorWithAlphaComponent:0.4f] CGColor],
(id)[[theColor colorWithAlphaComponent:0.3f] CGColor],
(id)[[theColor colorWithAlphaComponent:0.1f] CGColor],
(id)[[UIColor clearColor] CGColor],
nil];
//reverse the color array if needed
if(transparentToOpaque)
{
colors = [[colors reverseObjectEnumerator] allObjects];
}
//apply the colors and the gradient to the view
gradient.colors = colors;
[theView.layer insertSublayer:gradient atIndex:0];
}
请注意,您应该将theView的backgroundColor设置为clearColor,以便它不会干扰渐变。 此外,对于屏幕截图中显示的结果,transparentToOpaque标志应为YES。
答案 1 :(得分:6)
如果有人需要,PedroSilva的解决方案可以转换为Swift(也可以添加垂直选项)
class func addLinearGradientToView(view: UIView, colour: UIColor, transparntToOpaque: Bool, vertical: Bool)
{
let gradient = CAGradientLayer()
let gradientFrame = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height)
gradient.frame = gradientFrame
var colours = [
colour.CGColor,
colour.colorWithAlphaComponent(0.9).CGColor,
colour.colorWithAlphaComponent(0.8).CGColor,
colour.colorWithAlphaComponent(0.7).CGColor,
colour.colorWithAlphaComponent(0.6).CGColor,
colour.colorWithAlphaComponent(0.5).CGColor,
colour.colorWithAlphaComponent(0.4).CGColor,
colour.colorWithAlphaComponent(0.3).CGColor,
colour.colorWithAlphaComponent(0.2).CGColor,
colour.colorWithAlphaComponent(0.1).CGColor,
UIColor.clearColor().CGColor
]
if transparntToOpaque == true
{
colours = colours.reverse()
}
if vertical == true
{
gradient.startPoint = CGPointMake(0, 0.5)
gradient.endPoint = CGPointMake(1, 0.5)
}
gradient.colors = colours
view.layer.insertSublayer(gradient, atIndex: 0)
}
答案 2 :(得分:4)
CAGradientLayer *layer = [CAGradientLayer layer];
layer.frame = yourView.bounds;
UIColor *blackColor = [UIColor colorWithWhite:0.42f alpha:1.0f];
UIColor *clearColor = [UIColor colorWithWhite:0.42f alpha:0.0f];
layer.colors = [NSArray arrayWithObjects:(id)clearColor.CGColor, (id)blackColor.CGColor, nil];
[myView.layer insertSublayer:layer atIndex:0];
layer
是您视图的图层。
答案 3 :(得分:3)
你可以简单地使用半透明png作为背景来获得这样的效果。确保你将UIView的opaque
设置为NO
,你会没事的。
答案 4 :(得分:3)
实现这种效果并不需要魔法。 你应该像Apple那样做。 UIImageViews带有小而拉伸的图像。
此视图(包含图标的下半部分方块)使用拉伸并产生此效果的图像。
你也应该遵循这个方法。您的视图非常轻,只需花费一些Photoshop测试就能获得正确的效果。
正如我所注意到的,Apple从不在iPhone上使用渐变图层。它必须显着更多地消耗GPU,因为它会为它们节省大量图像......
这是一个类似的图像来测试。
希望它有所帮助。
答案 5 :(得分:2)
您只需将视图的背景颜色的Alpha值设置为所需的值。
See attached zip code. Go to AlphaViewController's nib file and see it there
我只将子视图的alpha值设置为70%。你可以根据自己的要求来做。
答案 6 :(得分:1)
如果有人需要 Swift 3.X
func addLinearGradientToView(view: UIView, colour: UIColor, transparntToOpaque: Bool, vertical: Bool)
{
let gradient = CAGradientLayer()
let gradientFrame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height)
gradient.frame = gradientFrame
var colours = [
colour.cgColor,
colour.withAlphaComponent(0.9).cgColor,
colour.withAlphaComponent(0.8).cgColor,
colour.withAlphaComponent(0.7).cgColor,
colour.withAlphaComponent(0.6).cgColor,
colour.withAlphaComponent(0.5).cgColor,
colour.withAlphaComponent(0.4).cgColor,
colour.withAlphaComponent(0.3).cgColor,
colour.withAlphaComponent(0.2).cgColor,
colour.withAlphaComponent(0.1).cgColor,
UIColor.clear.cgColor
]
if transparntToOpaque == true
{
colours = colours.reversed()
}
if vertical == true
{
gradient.startPoint = CGPoint(x: 0, y: 0.5)
gradient.endPoint = CGPoint(x: 0, y: 0.5)
}
gradient.colors = colours
view.layer.insertSublayer(gradient, at: 0)
}
Swift 3.x
中的其他方式let gradient = CAGradientLayer()
gradient.frame = view.bounds
gradient.colors = [UIColor.blue.cgColor, UIColor.white.cgColor]
view.layer.insertSublayer(gradient, at: 0)