添加褪色和& UIView的透明度

时间:2013-02-13 13:29:01

标签: iphone ios objective-c uiview quartz-core

我知道如何为iOS 6+附带的新应用程序商店应用程序的Share子视图中的视图创建和设置动画(请参阅随附的屏幕截图),但我不知道如何添加那个很好的<此视图上的strong>带透明度的着色效果。 任何人都可以提供代码示例,使UIView看起来与截图中的完全一致吗?

P.S。仅UIView的alpha属性不会这样做。

enter image description here

7 个答案:

答案 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,因为它会为它们节省大量图像......

这是一个类似的图像来测试。 enter image description here

希望它有所帮助。

答案 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)