123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- // Copyright (c) 2013 Mutual Mobile (http://mutualmobile.com/)
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- // THE SOFTWARE.
-
-
- #import "MMDrawerBarButtonItem.h"
-
- @interface MMDrawerMenuButtonView : UIButton
- @property (nonatomic,strong) UIColor * menuButtonNormalColor;
- @property (nonatomic,strong) UIColor * menuButtonHighlightedColor;
-
- @property (nonatomic,strong) UIColor * shadowNormalColor;
- @property (nonatomic,strong) UIColor * shadowHighlightedColor;
-
- -(UIColor *)menuButtonColorForState:(UIControlState)state;
- -(void)setMenuButtonColor:(UIColor *)color forState:(UIControlState)state;
-
- -(UIColor *)shadowColorForState:(UIControlState)state;
- -(void)setShadowColor:(UIColor *)color forState:(UIControlState)state;
-
- @end
-
- @implementation MMDrawerMenuButtonView
-
- -(instancetype)initWithFrame:(CGRect)frame{
- self = [super initWithFrame:frame];
- if(self){
- [self setMenuButtonNormalColor:[[UIColor whiteColor] colorWithAlphaComponent:0.9f]];
- [self setMenuButtonHighlightedColor:[UIColor colorWithRed:139.0/255.0
- green:135.0/255.0
- blue:136.0/255.0
- alpha:0.9f]];
-
- [self setShadowNormalColor:[[UIColor blackColor] colorWithAlphaComponent:0.5f]];
- [self setShadowHighlightedColor:[[UIColor blackColor] colorWithAlphaComponent:0.2f]];
- }
- return self;
- }
-
- -(UIColor *)menuButtonColorForState:(UIControlState)state{
- UIColor * color;
- switch (state) {
- case UIControlStateNormal:
- color = self.menuButtonNormalColor;
- break;
- case UIControlStateHighlighted:
- color = self.menuButtonHighlightedColor;
- break;
- default:
- break;
- }
- return color;
- }
-
- -(void)setMenuButtonColor:(UIColor *)color forState:(UIControlState)state{
- switch (state) {
- case UIControlStateNormal:
- [self setMenuButtonNormalColor:color];
- break;
- case UIControlStateHighlighted:
- [self setMenuButtonHighlightedColor:color];
- break;
- default:
- break;
- }
- [self setNeedsDisplay];
- }
-
- -(UIColor *)shadowColorForState:(UIControlState)state{
- UIColor * color;
- switch (state) {
- case UIControlStateNormal:
- color = self.shadowNormalColor;
- break;
- case UIControlStateHighlighted:
- color = self.shadowHighlightedColor;
- break;
- default:
- break;
- }
- return color;
- }
-
- -(void)setShadowColor:(UIColor *)color forState:(UIControlState)state{
- switch (state) {
- case UIControlStateNormal:
- [self setShadowNormalColor:color];
- break;
- case UIControlStateHighlighted:
- [self setShadowHighlightedColor:color];
- break;
- default:
- break;
- }
- [self setNeedsDisplay];
- }
-
- -(void)drawRect:(CGRect)rect{
- //// General Declarations
- CGContextRef context = UIGraphicsGetCurrentContext();
-
- //Sizes
- CGFloat buttonWidth = CGRectGetWidth(self.bounds)*.80;
- CGFloat buttonHeight = CGRectGetHeight(self.bounds)*.16;
- CGFloat xOffset = CGRectGetWidth(self.bounds)*.10;
- CGFloat yOffset = CGRectGetHeight(self.bounds)*.12;
- CGFloat cornerRadius = 1.0;
-
- //// Color Declarations
- UIColor* buttonColor = [self menuButtonColorForState:self.state];
- UIColor* shadowColor = [self shadowColorForState:self.state];
-
-
- //// Shadow Declarations
- UIColor* shadow = shadowColor;
- CGSize shadowOffset = CGSizeMake(0.0, 1.0);
- CGFloat shadowBlurRadius = 0;
-
- //// Top Bun Drawing
- UIBezierPath* topBunPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(xOffset, yOffset, buttonWidth, buttonHeight) cornerRadius:cornerRadius];
- CGContextSaveGState(context);
- CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
- [buttonColor setFill];
- [topBunPath fill];
- CGContextRestoreGState(context);
-
- //// Meat Drawing
- UIBezierPath* meatPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(xOffset, yOffset*2 + buttonHeight, buttonWidth, buttonHeight) cornerRadius:cornerRadius];
- CGContextSaveGState(context);
- CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
- [buttonColor setFill];
- [meatPath fill];
- CGContextRestoreGState(context);
-
- //// Bottom Bun Drawing
- UIBezierPath* bottomBunPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(xOffset, yOffset*3 + buttonHeight*2, buttonWidth, buttonHeight) cornerRadius:cornerRadius];
- CGContextSaveGState(context);
- CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
- [buttonColor setFill];
- [bottomBunPath fill];
- CGContextRestoreGState(context);
- }
-
- -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
- [super touchesBegan:touches withEvent:event];
- [self setNeedsDisplay];
- }
-
- -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
- [super touchesEnded:touches withEvent:event];
- [self setNeedsDisplay];
- }
-
- -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
- [super touchesCancelled:touches withEvent:event];
- [self setNeedsDisplay];
- }
-
- -(void)setSelected:(BOOL)selected{
- [super setSelected:selected];
- [self setNeedsDisplay];
- }
-
- -(void)setHighlighted:(BOOL)highlighted{
- [super setHighlighted:highlighted];
- [self setNeedsDisplay];
- }
-
- -(void)setTintColor:(UIColor *)tintColor{
- if([super respondsToSelector:@selector(setTintColor:)]){
- [super setTintColor:tintColor];
- }
- }
-
- -(void)tintColorDidChange{
- [self setNeedsDisplay];
- }
-
- @end
-
- @interface MMDrawerBarButtonItem ()
- @property (nonatomic,strong) MMDrawerMenuButtonView * buttonView;
-
- @end
-
- @implementation MMDrawerBarButtonItem
-
- +(UIImage*)drawerButtonItemImage{
-
- static UIImage *drawerButtonImage = nil;
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
-
- UIGraphicsBeginImageContextWithOptions( CGSizeMake(26, 26), NO, 0 );
-
- //// Color Declarations
- UIColor* fillColor = [UIColor whiteColor];
-
- //// Frames
- CGRect frame = CGRectMake(0, 0, 26, 26);
-
- //// Bottom Bar Drawing
- UIBezierPath* bottomBarPath = [UIBezierPath bezierPathWithRect: CGRectMake(CGRectGetMinX(frame) + floor((CGRectGetWidth(frame) - 16) * 0.50000 + 0.5), CGRectGetMinY(frame) + floor((CGRectGetHeight(frame) - 1) * 0.72000 + 0.5), 16, 1)];
- [fillColor setFill];
- [bottomBarPath fill];
-
-
- //// Middle Bar Drawing
- UIBezierPath* middleBarPath = [UIBezierPath bezierPathWithRect: CGRectMake(CGRectGetMinX(frame) + floor((CGRectGetWidth(frame) - 16) * 0.50000 + 0.5), CGRectGetMinY(frame) + floor((CGRectGetHeight(frame) - 1) * 0.48000 + 0.5), 16, 1)];
- [fillColor setFill];
- [middleBarPath fill];
-
-
- //// Top Bar Drawing
- UIBezierPath* topBarPath = [UIBezierPath bezierPathWithRect: CGRectMake(CGRectGetMinX(frame) + floor((CGRectGetWidth(frame) - 16) * 0.50000 + 0.5), CGRectGetMinY(frame) + floor((CGRectGetHeight(frame) - 1) * 0.24000 + 0.5), 16, 1)];
- [fillColor setFill];
- [topBarPath fill];
-
- drawerButtonImage = UIGraphicsGetImageFromCurrentImageContext();
- });
-
- return drawerButtonImage;
- }
-
- -(instancetype)initWithTarget:(id)target action:(SEL)action{
-
- if((floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)){
- return [self initWithImage:[self.class drawerButtonItemImage]
- style:UIBarButtonItemStylePlain
- target:target
- action:action];
- }
- else {
- MMDrawerMenuButtonView * buttonView = [[MMDrawerMenuButtonView alloc] initWithFrame:CGRectMake(0, 0, 26, 26)];
- [buttonView addTarget:self action:@selector(touchUpInside:) forControlEvents:UIControlEventTouchUpInside];
- self = [self initWithCustomView:buttonView];
- if(self){
- [self setButtonView:buttonView];
- }
- self.action = action;
- self.target = target;
- return self;
- }
- }
-
- -(instancetype)initWithCoder:(NSCoder *)aDecoder{
- // non-ideal way to get the target/action, but it works
- UIBarButtonItem* barButtonItem = [[UIBarButtonItem alloc] initWithCoder: aDecoder];
- return [self initWithTarget:barButtonItem.target action:barButtonItem.action];
- }
-
- -(void)touchUpInside:(id)sender{
-
- #pragma clang diagnostic push
- #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
- [self.target performSelector:self.action withObject:sender];
- #pragma clang diagnostic pop;
-
- }
-
- -(UIColor *)menuButtonColorForState:(UIControlState)state{
- return [self.buttonView menuButtonColorForState:state];
- }
-
- -(void)setMenuButtonColor:(UIColor *)color forState:(UIControlState)state{
- [self.buttonView setMenuButtonColor:color forState:state];
- }
-
- -(UIColor *)shadowColorForState:(UIControlState)state{
- return [self.buttonView shadowColorForState:state];
- }
-
- -(void)setShadowColor:(UIColor *)color forState:(UIControlState)state{
- [self.buttonView setShadowColor:color forState:state];
- }
-
- -(void)setTintColor:(UIColor *)tintColor{
- if([super respondsToSelector:@selector(setTintColor:)]){
- [super setTintColor:tintColor];
- }
- if([self.buttonView respondsToSelector:@selector(setTintColor:)]){
- [self.buttonView setTintColor:tintColor];
- }
- }
-
- @end
|