0

I have a subclass of UIButton where I overwrite drawRect for a custom looking button.

But now the cell doesn't highlight.

How can I fix this?

I have the code ready for another custom drawRect for when the cell is pressed.

- (void)drawRect:(CGRect)rect
{
    //// General Declarations
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = UIGraphicsGetCurrentContext();

    //// Color Declarations
    UIColor* red = [UIColor colorWithRed: 1 green: 0 blue: 0 alpha: 1];
    CGFloat redRGBA[4];
    [red getRed: &redRGBA[0] green: &redRGBA[1] blue: &redRGBA[2] alpha: &redRGBA[3]];

    UIColor* darkRed = [UIColor colorWithRed: (redRGBA[0] * 0.8) green: (redRGBA[1] * 0.8) blue: (redRGBA[2] * 0.8) alpha: (redRGBA[3] * 0.8 + 0.2)];
    UIColor* lightRed = [UIColor colorWithRed: (redRGBA[0] * 0.8 + 0.2) green: (redRGBA[1] * 0.8 + 0.2) blue: (redRGBA[2] * 0.8 + 0.2) alpha: (redRGBA[3] * 0.8 + 0.2)];

    //// Gradient Declarations
    NSArray* redGradientColors = [NSArray arrayWithObjects: 
                                  (id)darkRed.CGColor, 
                                  (id)lightRed.CGColor, nil];
    CGFloat redGradientLocations[] = {0, 1};
    CGGradientRef redGradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)redGradientColors, redGradientLocations);

    //// Shadow Declarations
    CGColorRef shadow = [UIColor lightGrayColor].CGColor;
    CGSize shadowOffset = CGSizeMake(0, -0);
    CGFloat shadowBlurRadius = 1;
    CGColorRef shadow2 = [UIColor blackColor].CGColor;
    CGSize shadow2Offset = CGSizeMake(0, -0);
    CGFloat shadow2BlurRadius = 2;


    //// Rounded Rectangle Drawing
    UIBezierPath* roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect: CGRectMake(35, 5, 250, 50) cornerRadius: 6];
    CGContextSaveGState(context);
    CGContextSetShadowWithColor(context, shadow2Offset, shadow2BlurRadius, shadow2);
    CGContextSetFillColorWithColor(context, shadow2);
    [roundedRectanglePath fill];
    [roundedRectanglePath addClip];
    CGContextDrawLinearGradient(context, redGradient, CGPointMake(160, 55), CGPointMake(160, 5), 0);

    ////// Rounded Rectangle Inner Shadow
    CGRect roundedRectangleBorderRect = CGRectInset([roundedRectanglePath bounds], -shadowBlurRadius, -shadowBlurRadius);
    roundedRectangleBorderRect = CGRectOffset(roundedRectangleBorderRect, -shadowOffset.width, -shadowOffset.height);
    roundedRectangleBorderRect = CGRectInset(CGRectUnion(roundedRectangleBorderRect, [roundedRectanglePath bounds]), -1, -1);

    UIBezierPath* roundedRectangleNegativePath = [UIBezierPath bezierPathWithRect: roundedRectangleBorderRect];
    [roundedRectangleNegativePath appendPath: roundedRectanglePath];
    roundedRectangleNegativePath.usesEvenOddFillRule = YES;

    CGContextSaveGState(context);
    {
        CGFloat xOffset = shadowOffset.width + round(roundedRectangleBorderRect.size.width);
        CGFloat yOffset = shadowOffset.height;
        CGContextSetShadowWithColor(context,
                                    CGSizeMake(xOffset + copysign(0.1, xOffset), yOffset + copysign(0.1, yOffset)),
                                    shadowBlurRadius,
                                    shadow);

        [roundedRectanglePath addClip];
        CGAffineTransform transform = CGAffineTransformMakeTranslation(-round(roundedRectangleBorderRect.size.width), 0);
        [roundedRectangleNegativePath applyTransform: transform];
        [[UIColor grayColor] setFill];
        [roundedRectangleNegativePath fill];
    }
    CGContextRestoreGState(context);

    CGContextRestoreGState(context);

    [[UIColor blackColor] setStroke];
    roundedRectanglePath.lineWidth = 1;
    [roundedRectanglePath stroke];

    //// Cleanup
    CGGradientRelease(redGradient);
    CGColorSpaceRelease(colorSpace);
}
Jon
  • 4,732
  • 6
  • 44
  • 67

2 Answers2

0

subclassing UIButton does not make sense because it's a kind of assembly/cluster class.

I had best experience creating own buttons when subclassing UIControl and add some custom behavior.

Check also this (you should not subclass UIButton).

Then also check how you highlight UIControl subclass.

Community
  • 1
  • 1
Jonas Schnelli
  • 9,965
  • 3
  • 48
  • 60
  • Oh ok. So how do I encorporate the code I posted without making a subclass? – Jon Apr 10 '12 at 07:24
  • Why not placing the drawRect in a UIControl subclass. Then add a custom control event like this: `[self addTarget:self action:@selector(myMethode) forControlEvents:UIControlEventTouchUpInside]`; – Jonas Schnelli Apr 10 '12 at 07:25
  • Can you please expand on this? Right now i just have an empty UIControl subclas with just the drawRect method I posted above. – Jon Apr 10 '12 at 07:55
  • Did you call initWithFrame with a appropriate frame when creating your Class (UIControl subclass)? After you see you drawRect drawings, then you might read on here: http://stackoverflow.com/questions/4428437/highlighting-a-uicontrol-subclass – Jonas Schnelli Apr 10 '12 at 08:21
  • See http://stackoverflow.com/questions/5045672/create-uibutton-subclass#comment7668681_5045778 – Dan Rosenstark Jul 26 '12 at 12:54
  • You can subclass UIButton. It is a concrete class, not a class cluster. I've subclassed UIButton. Apple has an example talking about subclassing UIButton. – Feloneous Cat Dec 12 '12 at 19:43
  • @FeloneousCat your right. Subclassing `UIButton` makes perfect sense, under certain circumstances. One might be you wanting custom views in a `IB_Designable` button. – Julian F. Weinert Aug 25 '15 at 15:45
0

i think you can deal with the highlight problem with these methods below

- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)cancelTrackingWithEvent:(UIEvent *)event;

you can change the color or the image in these method

cloosen
  • 993
  • 7
  • 17