可能是重复问题:
如何在iPhone应用中手动绘制渐变?
我的应用程序需要在UIView
或UILabel
中显示文本,但背景必须是渐变色而不是单一的UIColor
。使用图形程序创建所需外观是不可取的,因为文本可能根据从服务器返回的数据而异。
有没有人知道快速解决这个问题的方法? 非常感谢您的想法。
可能是重复问题:
如何在iPhone应用中手动绘制渐变?
我的应用程序需要在UIView
或UILabel
中显示文本,但背景必须是渐变色而不是单一的UIColor
。使用图形程序创建所需外观是不可取的,因为文本可能根据从服务器返回的数据而异。
有没有人知道快速解决这个问题的方法? 非常感谢您的想法。
我知道这是一个较旧的讨论串,但为了以后的参考:
从 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文档。你可以选择性地指定起点和终点(如果你不想要从顶部到底部直接的线性渐变),甚至还可以指定映射到每个颜色的特定位置。
你可以像Mike的回答中所指出的那样使用Core Graphics来绘制渐变。作为更详细的示例,你可以创建一个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
的backgroundColor
设置为任何你喜欢的颜色,并且该高光效果将绘制在该颜色上方。您还可以使用CGContextDrawRadialGradient
函数绘制径向渐变。
您只需适当地调整此UIView
的大小并将UILabel
作为其子视图添加即可获得所需的效果。
编辑(4/23/2009):根据St3fan的建议,我已经在代码中用bounds替换了视图的frame。这纠正了当视图的原点不是(0,0)时的情况。
注意:以下结果适用于旧版本的iOS,在iOS 13上测试时,步进不会发生。我不知道步进是在哪个版本的iOS中被移除的。
您还可以使用一个像素宽的图形图像作为渐变,并将视图属性设置为扩展该图形以填充视图(假设您考虑的是简单的线性渐变而不是某种径向图形)。
CAGradientLayer
上的颜色数组,他可能会不喜欢这个答案......也确实不应该。对于单人商店来说可能无关紧要,但对于团队而言很重要。 - NateMirko 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以获得您想要在代码中输入的值。
for (CALayer *currentLayer in [self.view.layer sublayers]) {
if([currentLayer isKindOfClass: [CAGradientLayer class]] ) {
[currentLayer removeFromSuperlayer];
}
}
- Robert WagstaffUIColor *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];
我使用一个UIImageView作为子视图来实现这个功能。这个UIImageView指向的图片是一个渐变色。然后我在UIView中设置了一个背景颜色,这样就得到了一个带有颜色渐变的视图。接下来,我可以按照需要使用这个视图,而且所有绘制的内容都会在这个渐变色视图下面。通过在UIImageView上添加第二个视图,您可以选择您的绘制是在渐变色视图之下还是之上...
#import <QuartzCore/QuartzCore.h>
)。 - Justin Searlsview.layer.masksToBounds = YES;
。 - iwatCAGradientLayer
来给一个UILabel
添加渐变色,那么我就需要将backgroundColor
设置为[UIColor clearColor]
(或等价的值)。 - Thomas Müller