如何在iPhone上创建一个带有黑色渐变的UIButton?

9

我想在iOS中创建一个带有普通黑色渐变主题的UIButton。我查看了文档,但似乎无法弄清如何实现。当我创建按钮时,我得到一个没有颜色的圆角矩形按钮。

这是我的代码:

UIButton* leagueTeamButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

有什么建议可以让我在按钮上添加标准主题黑色渐变?

不妨看一下我使用的这个技巧来创建按钮图像:http://memention.com/blog/2010/02/22/Make-it-work.html - epatel
5个回答

27

你还可以使用图层轻松实现:

-(void) addGradient:(UIButton *) _button {

    // Add Border
    CALayer *layer = _button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 1.0f;
    layer.borderColor = [UIColor colorWithWhite:0.5f alpha:0.2f].CGColor;

    // Add Shine
    CAGradientLayer *shineLayer = [CAGradientLayer layer];
    shineLayer.frame = layer.bounds;
    shineLayer.colors = [NSArray arrayWithObjects:
                         (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:0.75f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:0.4f alpha:0.2f].CGColor,
                         (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                         nil];
    shineLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.5f],
                            [NSNumber numberWithFloat:0.8f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];
    [layer addSublayer:shineLayer];
}

2
我正在使用Xcode 4.3.2,但是在编译时出现了错误。错误信息为:“Undefined symbols for architecture i386: "OBJC_CLASS$_CAGradientLayer"”。我已经导入了QuartzCore头文件,但不确定还需要做什么。 - curtisdf
3
记录一下:在添加了QuatzCore Framework并且#import <QuartzCore/QuartzCore.h>后,这里可以正常编译。 - brainray
2
@curtisdf, 可能为时已晚,但是你需要在构建阶段中链接 QuartzCore 框架,除了包含头文件之外。在 Xcode 4 中浏览到你的项目,然后选择你的目标,在 Build Phases 中点击展开 Link Binary With Libraries,点击 +,找到你需要的库。 - zem
谢谢@zem。是的,很久以前了。我知道我解决了这个问题,但我不记得我做了什么。无论如何,还是谢谢。 - curtisdf
1
如果您在按钮上有文本并像这样添加子层,那么您将遮挡文本。只需使用:[layer insertSublayer:shineLayer atIndex:0]; - Maurizio

7

这种方法可以创建一个漂亮的自定义按钮。 我结合了渐变图层和高光图层的示例。

 -(void) myButtonChange: (UIButton*) btn
 {
     [btn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];

     CAGradientLayer *btnGradient = [CAGradientLayer layer];
     btnGradient.frame = btn.bounds;
     btnGradient.colors = [NSArray arrayWithObjects:
                      (id)[[UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:.6f] CGColor],
                      (id)[[UIColor colorWithRed:200.0f/255.0f green:200.0f/255.0f blue:200.0f/255.0f alpha:.4f] CGColor],
                      (id)[[UIColor colorWithRed:150.0f/255.0f green:150.0f/255.0f blue:150.0f/255.0f alpha:.4f] CGColor],
                      (id)[[UIColor colorWithRed:100.0f/255.0f green:100.0f/255.0f blue:100.0f/255.0f alpha:.4f] CGColor],
                      (id)[[UIColor colorWithRed:50.0f/255.0f green:50.0f/255.0f blue:50.0f/255.0f alpha:.4f] CGColor],
                      (id)[[UIColor colorWithRed:5.0f/255.0f green:5.0f/255.0f blue:5.0f/255.0f alpha:.4f] CGColor],

                      nil];
    [btn.layer insertSublayer:btnGradient atIndex:0];

    CAGradientLayer *glossLayer = [CAGradientLayer layer];
    glossLayer.frame = btn.bounds;
    glossLayer.colors = [NSArray arrayWithObjects:
                     (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor,
                     (id)[UIColor colorWithWhite:1.0f alpha:0.1f].CGColor,
                     (id)[UIColor colorWithWhite:0.75f alpha:0.0f].CGColor,
                     (id)[UIColor colorWithWhite:1.0f alpha:0.1f].CGColor,
                     nil];
    glossLayer.locations = [NSArray arrayWithObjects:
                        [NSNumber numberWithFloat:0.0f],
                        [NSNumber numberWithFloat:0.5f],
                        [NSNumber numberWithFloat:0.5f],
                        [NSNumber numberWithFloat:1.0f],
                        nil];
     [btn.layer insertSublayer:glossLayer atIndex:0];

     CALayer *btnLayer = [btn layer];
     [btnLayer setMasksToBounds:YES];

     UIColor*mycolor = btn.backgroundColor;
     [btn.layer setBorderColor:[mycolor CGColor]];
     [[btn layer] setBorderWidth:2.0f];
     [[btn layer] setCornerRadius:10.0f];    
 }

将所有按钮附加到IBOutlet集合中...
  @property (strong, nonatomic) IBOutletCollection(UIButton) NSArray *bigbuttongroup;

...然后在需要的时候运行该方法

  for(UIButton *btn in self.bigbuttongroup)
  {
      [self myButtonChange:btn];
  }

1

在Photoshop或任何图像处理软件中制作一个按钮(如果您希望在按下时更改外观,则可以制作两个),并将其放入项目的资源文件夹中,使用以下代码将图像添加为UIButton:

UIButton *yourButton=[UIButton buttonWithType:UIButtonTypeCustom];
[yourButton setFrame:CGRectMake(0,0,10,10)];
[yourButton addTarget:self action:@selector(functionYouWantToCall:) forControlEvents:UIControlEventTouchUpInside];

[yourButton setImage:[UIImage imageNamed:@"imageNormalState.png"] forState:UIControlStateNormal];
[yourButton setImage:[UIImage imageNamed:@"imageWhenPressDown.png"] forState:UIControlStateHighlighted]; // option if you want to display another image (i.e. darker one) when user press the button

谢谢。我会采用你的方法。 - David

0
这里有一个示例可以使用渐变颜色来制作你的视图,同样你也可以用于按钮。
  UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
  CAGradientLayer *gradient = [CAGradientLayer layer];
  gradient.frame = view.bounds;


   static NSMutableArray *colors = nil;
  if (colors == nil) {
    colors = [[NSMutableArray alloc] initWithCapacity:3];
    UIColor *color = nil;
    color = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
    [colors addObject:(id)[color CGColor]];
    color = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
    [colors addObject:(id)[color CGColor]];
    color = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
    [colors addObject:(id)[color CGColor]];
}
//    [(CAGradientLayer *)self.layer setColors:colors];
//    [(CAGradientLayer *)self.layer setLocations:[NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0], [NSNumber numberWithFloat:0.48], [NSNumber numberWithFloat:1.0], nil]];

 gradient.colors = colors;
  [view.layer insertSublayer:gradient atIndex:0];
 [self.view addSubview:view];

0

你可以拥有没有渐变效果的黑色背景按钮,只需要将其背景颜色设置为黑色并将类型设置为"custombutton"即可。如果需要渐变效果,我建议您将图像作为按钮的背景图片,并将其类型设置为"custom button"。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接