【问题标题】:How to create a UIButton with a black gradient for iPhone?如何为 iPhone 创建一个带有黑色渐变的 UIButton?
【发布时间】:2011-10-19 16:44:45
【问题描述】:

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

这是我的代码:

UIButton* leagueTeamButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];

关于如何将标准主题黑色渐变添加到按钮的任何建议?

【问题讨论】:

标签: iphone ios uibutton


【解决方案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

【讨论】:

  • 谢谢。我会用你的方法。
【解决方案2】:

您可以使用没有渐变效果的黑色背景按钮,您必须将其背景颜色设置为黑色并键入自定义按钮。对于渐变效果,我建议您将图像作为按钮的背景图像并将其类型设置为自定义按钮。

【讨论】:

    【解决方案3】:

    您也可以使用图层轻松做到这一点:

    -(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];
    }
    

    【讨论】:

    • 我使用的是 Xcode 4.3.2,但遇到了编译错误。错误:体系结构 i386 的未定义符号:“_OBJC_CLASS_$_CAGradientLayer”我已经导入了 QuartzCore 标头。不知道还能做什么。
    • 仅作记录:添加了 QuatzCore 框架和#import
    • @curtisdf,这可能为时已晚,无法帮助您,但是除了包含标头之外,您还需要在构建阶段链接 QuartzCore 框架。在 Xcode 4 中浏览到你的项目,然后是你的目标,然后点击 Build Phases,展开 Link Binary With Libraries,点击 +,找到你需要的库
    • 谢谢@zem。是的,已经很久了。我知道我解决了这个问题,但我不记得我做了什么。无论如何,谢谢。
    • 仅供参考,如果您在按钮上有文本并且像这样添加子图层,您将遮挡文本。只需使用:[layer insertSublayer:shineLayer atIndex:0];
    【解决方案4】:

    Hear 是使用渐变颜色制作视图的一个示例,您可以使用按钮进行同样的操作。

      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];
    

    【讨论】:

      【解决方案5】:

      这个方法可以制作一个好看的自定义按钮。 我结合了渐变层和光泽层的示例。

       -(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];
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-17
        • 2021-02-17
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多