0

こんにちは、次のようなビュー コントローラーの 1 つで角の半径 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にないことを付け加えておきます。

4

3 に答える 3

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];
}
于 2013-01-30T11:21:17.310 に答える
0

あなたがやろうとしていることを正しく理解していれば、次のアプローチをお勧めします。

  1. CAGradientLayer実装の内部を移動しますCustomButton(したがって、 になりますCustomGradientButton);

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

このアプローチは私にとってはうまくいきますが、ケースに合わせて彩度と明るさの選択を微調整する必要があります。

于 2013-01-29T18:39:16.060 に答える
0

super呼び出してから、自分自身を呼び出してみsetNeedsDisplayましたか?

表示機能が適切なタイミングで呼び出されるようにする必要があります。そのコードでは、選択/強調表示をチェックする必要があります。

于 2013-01-29T18:08:50.257 に答える