在 iOS 中设置 CAGradient UIButton 的选定状态

Posted

技术标签:

【中文标题】在 iOS 中设置 CAGradient UIButton 的选定状态【英文标题】:Set Selected State of CAGradient UIButton in iOS 【发布时间】:2013-01-29 17:21:53 【问题描述】:

您好,我在代码中使用圆角半径 CAGradientLayer 和边框颜色在我的一个视图控制器中创建了一个自定义按钮,如下所示:

phoneButton = [CustomButton buttonWithType:UIButtonTypeCustom];
phoneButton.frame = CGRectMake(6, 363, 99, 48);
phoneButton.titleLabel.font = [UIFont fontWithName:@"Futura-Medium" size:14];
phoneButton.titleLabel.shadowColor = [UIColor colorWithWhite:0.0 alpha:1.0];
phoneButton.titleLabel.shadowOffset = CGSizeMake(0, 1);
[phoneButton setTitle:@"Phone" forState:UIControlStateNormal];
[phoneButton addTarget:self action:@selector(phone) forControlEvents:UIControlEventTouchUpInside];

gradient = [CAGradientLayer layer];
gradient.frame = phoneButton.bounds;
gradient.cornerRadius = 8;
gradient.borderColor = [[UIColor whiteColor]CGColor];
gradient.borderWidth = 2.0;
gradient.colors = [NSArray arrayWithObjects:(id)[[sharedManager cellGradientEnd] CGColor], (id)[[sharedManager cellGradientStart] CGColor], nil];
[phoneButton.layer insertSublayer:gradient atIndex:0];
[self.view addSubview:phoneButton];

现在我想在选择时设置按钮的选定/突出显示颜色。我该怎么做呢。我读过制作一个 UIbutton 子类并覆盖 setSelected 但我不知道该怎么做。这是customButton subclass.m

#import "CustomButton.h"

@implementation CustomButton
@synthesize sharedManager;

- (id)initWithFrame:(CGRect)frame

self = [super initWithFrame:frame];
if (self) 
    // Initialization code
    sharedManager = [[MySingleton alloc]init];

    
return self;



-(void) setHighlighted:(BOOL)highlighted 

if(highlighted) 
    NSLog(@"Highlighted");


 else 
    NSLog(@"Not Highlighted");



[super setHighlighted:highlighted];


-(void) setSelected:(BOOL)selected 

if(selected) 
    NSLog(@"Selected");

 else 
    NSLog(@"Not Selected");

[super setSelected:selected];




@end

或者只是调暗选择按钮会很好?我应该补充一点,该按钮不在 Xib 中。

【问题讨论】:

你的意思是改变渐变颜色,不是吗? @sergio 是的,或者只是在选择时调暗按钮。谢谢 【参考方案1】:

我只是通过在 subclass.m 中创建按钮的选定渐变和未选定渐变状态来解决这个问题,现在一切都很好!

- (CustomButton *)buttonWithType:(UIButtonType)type

  return [self buttonWithType:UIButtonTypeCustom];



- (id)initWithFrame:(CGRect)frame

self = [super initWithFrame:frame];
if (self) 
    // Initialization code


return self;


- (id)initWithCoder:(NSCoder *)coder

//Call the parent implementation of initWithCoder
self = [super initWithCoder:coder];

//Custom drawing methods
if (self)


    [self drawBackgroundLayer];
    [self drawHighlightBackgroundLayer];

    highlightBackgroundLayer.hidden = YES;




return self;
 

-(void)loadSingleton

sharedManager = [[MySingleton alloc]init];



- (void)layoutSubviews


// Set gradient frame (fill the whole button))
backgroundLayer.frame = self.bounds;

// Set inverted gradient frame
highlightBackgroundLayer.frame = self.bounds;

[super layoutSubviews];




- (void)drawBackgroundLayer

[self loadSingleton];
// Check if the property has been set already
if (!backgroundLayer)

    backgroundLayer = [CAGradientLayer layer];
    backgroundLayer.cornerRadius = 8;
    backgroundLayer.borderWidth = 1.5;
    backgroundLayer.borderColor = [UIColor whiteColor].CGColor;
    backgroundLayer.colors = [NSArray arrayWithObjects:(id)[[sharedManager  cellGradientEnd] CGColor], (id)[[sharedManager cellGradientStart] CGColor], nil];

    // Add the gradient to the layer hierarchy
    [self.layer insertSublayer:backgroundLayer atIndex:0];
   


- (void)drawHighlightBackgroundLayer

[self loadSingleton];
if (!highlightBackgroundLayer)

    highlightBackgroundLayer = [CAGradientLayer layer];
    highlightBackgroundLayer.cornerRadius = 8;
    highlightBackgroundLayer.borderWidth = 1.5;
    highlightBackgroundLayer.borderColor = [UIColor whiteColor].CGColor;
    highlightBackgroundLayer.colors = [NSArray arrayWithObjects:(id)[[sharedManager cellSelectedGradientEnd] CGColor], (id)[[sharedManager cellSelectedGradientStart] CGColor], nil];

    [self.layer insertSublayer:highlightBackgroundLayer atIndex:1];
  

并设置选中状态打开或关闭

- (void)setHighlighted:(BOOL)highlighted

NSLog(@"Selected");

// Disable implicit animation
[CATransaction begin];
[CATransaction setDisableActions:YES];

// Hide/show inverted gradient
highlightBackgroundLayer.hidden = !highlighted;
[CATransaction commit];

[super setHighlighted:highlighted];

【讨论】:

【参考方案2】:

您是否尝试过调用super,然后对自己调用setNeedsDisplay

它应该会导致您的显示功能在适当的时间被调用,并且在该代码中您应该检查选择/突出显示。

【讨论】:

不确定我是否理解我只需要知道如何将其他类中按钮的选定状态设置为从自定义按钮类变暗或更改颜色.. 任何人都知道我不使用笔尖并且按钮添加了子视图? UIControlUIButton 的超类具有 selectedhighlighted 的值。 UIControl 将设置 highlightedYES,当它内部有触摸时,当触摸被抬起或移到它外面时,设置为 NO。 selected 属性对UIButtonUIControl 本身没有任何意义,也不会被任何一方修改。如果你想让它有意义,欢迎你的子类这样做。如果是这样,它触发的操作应将其设置为selected,然后您的绘图可以做出反应。【参考方案3】:

如果我正确理解您要做什么,我会建议以下方法:

    CAGradientLayer 移动到您的CustomButton 实现中(这样它就会变成CustomGradientButton);

    当您想为自定义按钮设置selected 状态时,通过更改其饱和度和亮度来更改CAGradientLayer gradientColors

通过这样做,您的按钮将更改其在选定状态下的外观。

修改饱和度和亮度的方法是通过我的UIColor 类别:

@interface UIColor (LighterDarkerColor)

- (UIColor*)colorWithSaturation:(float)saturationFactor
                 brightness:(float)brightnessFactor;

@end

@implementation UIColor (LighterDarkerColor)

- (UIColor*)colorWithSaturation:(float)saturationFactor
                 brightness:(float)brightnessFactor 

  float hue = 0.0;
  float saturation = 0.0;
  float brightness = 0.0;
  float alpha = 0.0;

  if ([self getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha])
    return [UIColor colorWithHue:hue saturation:saturation*saturationFactor
                      brightness:brightness*brightnessFactor alpha:alpha];

  return self;


@end

你可以这样做,例如:

UIColor* selectedColorStart = [[sharedManager cellGradientStart] colorWithSaturation:0.65 brightness:1.2];

以获得更不饱和、更亮的 cellGradientStart 颜色版本。然后在您的setSelected 方法中,您将修改您的CAGradientLayer

gradient.colors = [NSArray arrayWithObjects:(id)[selectedColorEnd CGColor], (id)[selectedColorStart CGColor], nil];

这种方法对我有用,但您需要根据自己的情况微调饱和度和亮度的选择。

【讨论】:

以上是关于在 iOS 中设置 CAGradient UIButton 的选定状态的主要内容,如果未能解决你的问题,请参考以下文章

应用于 UITextView 的 CAGradient 颜色错误

如何在 iOS 中设置闹钟?

如何在ios中设置tableView单元格标题?

在 iOS 7 中设置导航栏图像

无法在 iOS 中设置启动图像

在 iOS 7 中设置方向