在iPhone上的UIView和UILabels上的梯度[重复]。

问题描述 投票:219回答:7

可能是重复的。 在iPhone应用程序中手动绘制渐变?

我的应用程序需要以 UIViewUILabel 但背景必须是渐变的,而不是真正的。UIColor. 使用图形程序来创建所需的外观是不好的,因为文本可能会根据服务器返回的数据而变化。

有谁知道解决这个问题的最快捷的方法吗?您的想法非常感激。

iphone ios cocoa-touch gradient
7个回答
44
投票

你也可以使用一个像素宽的图形图像作为渐变,并设置视图属性来展开图形以填充视图(假设你想的是一个简单的线性渐变而不是某种径向图形)。


780
投票

我意识到这是一个较老的帖子,但为了将来的参考。

从iPhone SDK 3.0开始,自定义渐变可以很容易地实现,无需子类或图像,通过使用新的 CAGradientLayer:

 UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
 CAGradientLayer *gradient = [CAGradientLayer layer];
 gradient.frame = view.bounds;
 gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
 [view.layer insertSublayer:gradient atIndex:0];

看看CAGradientLayer文档。你可以有选择地指定起点和终点(如果你不想要一个从上到下的线性渐变),甚至可以指定映射到每种颜色的具体位置。


121
投票

你可以使用Core Graphics来绘制渐变,正如Mike的回答中所指出的那样。 作为一个更详细的例子,你可以创建一个 UIView 子类来作为你的 UILabel. 在这方面 UIView 子类,覆盖 drawRect: 方法,并插入类似下面的代码。

- (void)drawRect:(CGRect)rect 
{
    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    CGGradientRef glossGradient;
    CGColorSpaceRef rgbColorspace;
    size_t num_locations = 2;
    CGFloat locations[2] = { 0.0, 1.0 };
    CGFloat components[8] = { 1.0, 1.0, 1.0, 0.35,  // Start color
         1.0, 1.0, 1.0, 0.06 }; // End color

    rgbColorspace = CGColorSpaceCreateDeviceRGB();
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);

    CGRect currentBounds = self.bounds;
    CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
    CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds));
    CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0);

    CGGradientRelease(glossGradient);
    CGColorSpaceRelease(rgbColorspace); 
}

这个特殊的例子创建了一个白色的,光亮风格的渐变,它是由顶部绘制的。UIView 到其垂直中心。 您可以设置 UIView's backgroundColor 到任何你喜欢的颜色,这个光泽度就会被绘制在该颜色之上。 你也可以使用 CGContextDrawRadialGradient 函数。

你只需要将这个 UIView 适当地加上你 UILabel 作为它的一个子视图,以获得你想要的效果。

EDIT (4232009): 根据St3fan的建议,我在代码中把视图的框架替换成了它的边界。 这纠正了视图的原点不是(0,0)的情况。


73
投票

注意:下面的结果适用于旧版本。 下面的结果适用于旧版本的iOS,但在iOS 13上测试时,踩踏不会发生。我不知道在哪个版本的iOS上删除了踩踏。


当使用 CAGradientLayer而不是 CGGradient梯度不平滑,但有明显的阶梯性。请看 this example:

为了获得更有吸引力的结果,最好使用 CGGradient.


24
投票

Mirko Froehlich的答案对我来说很有用,除了当我想使用自定义颜色时。诀窍是用色相、饱和度和亮度来指定UI颜色,而不是RGB。

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = myView.bounds;
UIColor *startColour = [UIColor colorWithHue:.580555 saturation:0.31 brightness:0.90 alpha:1.0];
UIColor *endColour = [UIColor colorWithHue:.58333 saturation:0.50 brightness:0.62 alpha:1.0];
gradient.colors = [NSArray arrayWithObjects:(id)[startColour CGColor], (id)[endColour CGColor], nil];
[myView.layer insertSublayer:gradient atIndex:0];

要获得颜色的色调、饱和度和亮度,使用内置的xcode颜色选择器,然后进入HSB标签。在这个视图中,色相是以度数来衡量的,所以用360除以数值就可以得到你想输入代码的数值。


15
投票

这就是我的工作原理--在xCode的IB中设置UIButton为transparentclear,没有bg图像。

UIColor *pinkDarkOp = [UIColor colorWithRed:0.9f green:0.53f blue:0.69f alpha:1.0];
UIColor *pinkLightOp = [UIColor colorWithRed:0.79f green:0.45f blue:0.57f alpha:1.0];

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = [[shareWordButton layer] bounds];
gradient.cornerRadius = 7;
gradient.colors = [NSArray arrayWithObjects:
                   (id)pinkDarkOp.CGColor,
                   (id)pinkLightOp.CGColor,
                   nil];
gradient.locations = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:0.0f],
                      [NSNumber numberWithFloat:0.7],
                      nil];

[[recordButton layer] insertSublayer:gradient atIndex:0];

3
投票

我是在一个视图中实现的,这个视图的子视图是一个UIImageView。 ImageView指向的图像是一个渐变。 然后我在UIView中设置一个背景色,就有了一个彩色的渐变视图。 接下来我根据需要使用这个视图,我画的所有东西都会在这个渐变视图下。 通过在ImageView上面添加第二个视图,你可以有一些选择,你的绘图是在渐变下面还是在渐变上面......。

© www.soinside.com 2019 - 2024. All rights reserved.