Search code examples
iosiphoneuibuttonibdesignableibinspectable

Trying to create a rounded corner UIButton class


I am trying to create a rounded corner UIButton class but it is not working. This is what I have so far:

interface

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface BotaoCantosArredondados : UIButton

@property (nonatomic, assign) IBInspectable CGFloat radius;
@property (nonatomic, assign) IBInspectable CGSize shadowOffset;
@property (nonatomic, assign) IBInspectable CGFloat shadowRadius;
@property (nonatomic, assign) IBInspectable CGFloat shadowOpacity;
@property (nonatomic, strong) IBInspectable UIColor *shadowColor;


@end

implementation

#import "BotaoCantosArredondados.h"
@import QuartzCore;


@interface BotaoCantosArredondados() {
  CALayer *sombraLayer;
}
@end


@implementation BotaoCantosArredondados

- (void)drawRect:(CGRect)rect {

  [super drawRect:rect];

  if (sombraLayer) {
    [sombraLayer removeFromSuperlayer];
  }

  sombraLayer = [CALayer layer];
  sombraLayer.backgroundColor = [[UIColor clearColor] CGColor];
  sombraLayer.shadowColor = [_shadowColor CGColor];
  UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                                  cornerRadius:_radius];
  path.lineWidth = _shadowRadius;
  sombraLayer.shadowPath = path.CGPath;

  sombraLayer.shadowOffset = _shadowOffset;
  sombraLayer.shadowOpacity = _shadowOpacity;
  sombraLayer.shadowRadius = _radius;
  sombraLayer.masksToBounds = YES;

  [self.layer addSublayer:sombraLayer];

}

- (void)setShadowColor:(UIColor *)shadowColor {
  _shadowColor = shadowColor;
}

- (void)setShadowOffset:(CGSize)shadowOffset {
  _shadowOffset = shadowOffset;
}

- (void)setShadowRadius:(CGFloat)shadowRadius {
  _shadowRadius = shadowRadius;
}

- (void)setShadowOpacity:(CGFloat)shadowOpacity {
  _shadowOpacity = shadowOpacity;
}

- (void)setRadius:(CGFloat)radius {
  _radius = radius;
}

any ideas?


Solution

  • You should try manipulating the layer of the Button i.e;

    #import <UIKit/UIKit.h>
    
    IB_DESIGNABLE
    
    @interface BotaoCantosArredondados : UIButton
    
    @property (nonatomic, assign) IBInspectable CGFloat radius;
    @property (nonatomic, assign) IBInspectable CGSize shadowOffset;
    @property (nonatomic, assign) IBInspectable CGFloat shadowRadius;
    @property (nonatomic, assign) IBInspectable CGFloat shadowOpacity;
    @property (nonatomic, strong) IBInspectable UIColor *shadowColor;
    
    @end
    

    and the implementation;

    #import "BotaoCantosArredondados.h"
    
    @implementation TestButton
    
    - (instancetype)initWithCoder:(NSCoder *)aDecoder {
        self = [super initWithCoder:aDecoder];
        if (self) {
            self.clipsToBounds = NO;
    
        }
        return self; }
    
    
    - (void)setShadowColor:(UIColor *)shadowColor {
        _shadowColor = shadowColor;
        self.layer.shadowColor = shadowColor.CGColor;
        [self.layer setNeedsDisplay];
    
    }
    
    - (void)setShadowOffset:(CGSize)shadowOffset {
        _shadowOffset = shadowOffset;
        self.layer.shadowOffset = shadowOffset;
        [self.layer setNeedsDisplay];
    
    }
    
    - (void)setShadowRadius:(CGFloat)shadowRadius {
        _shadowRadius = shadowRadius;
        self.layer.shadowRadius = shadowRadius;
        [self.layer setNeedsDisplay];
    
    }
    
    - (void)setShadowOpacity:(CGFloat)shadowOpacity {
        _shadowOpacity = shadowOpacity;
        self.layer.shadowOpacity = shadowOpacity;
        [self.layer setNeedsDisplay];
    
    }
    
    - (void)setRadius:(CGFloat)radius {
        _radius = radius;
        self.layer.cornerRadius = radius;
        [self.layer setNeedsDisplay]; }
    
    @end
    

    Edit :- you need to remove assign subclass class , then remove all property manually . and then again assign class to button and then Run programme.

    Check this ,

    enter image description here

    Output :-

    enter image description here