| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- //
- // ImageTitleButton.m
- // CommonLibrary
- //
- // Created by Alexi on 3/21/14.
- // Copyright (c) 2014 Alexi. All rights reserved.
- //
- #import "ImageTitleButton.h"
- #import "UIImage+TintColor.h"
- @implementation ImageTitleButton
- - (instancetype)init
- {
- return [self initWithStyle:EImageLeftTitleRight];
- }
- - (instancetype)initWithStyle:(ImageTitleButtonStyle)style
- {
- return [self initWithStyle:style maggin:UIEdgeInsetsMake(0, 0, 0, 0)];
- }
- - (instancetype)initWithStyle:(ImageTitleButtonStyle)style maggin:(UIEdgeInsets)margin
- {
- return [self initWithStyle:style maggin:margin padding:CGSizeMake(2, 2)];
- }
- - (instancetype)initWithStyle:(ImageTitleButtonStyle)style maggin:(UIEdgeInsets)margin padding:(CGSize)padding
- {
- if (self = [super initWithFrame:CGRectZero])
- {
- _style = style;
- _margin = margin;
- _padding = padding;
- }
- return self;
- }
- - (void)setImage:(nullable UIImage *)image forState:(UIControlState)state
- {
- [super setImage:image forState:state];
- if (image && CGSizeEqualToSize(_imageSize, CGSizeZero))
- {
- _imageSize = image.size;
- }
- }
- - (void)setMargin:(UIEdgeInsets)margin
- {
- _margin = margin;
- [self setNeedsDisplay];
- }
- - (void)setPadding:(CGSize)padding
- {
- _padding = padding;
- [self setNeedsDisplay];
- }
- - (void)relayoutFrameOfSubViews
- {
- CGRect rect = self.bounds;
-
- rect.origin.x += _margin.left;
- rect.size.width -= _margin.left + _margin.right;
- rect.origin.y += _margin.top;
- rect.size.height -= _margin.top + _margin.bottom;
-
- UIImage *img = [self imageForState:UIControlStateNormal];
- CGFloat scale = [[UIScreen mainScreen] scale];
- CGSize size = CGSizeZero;
-
- if (CGSizeEqualToSize(self.imageSize, CGSizeZero))
- {
- size = CGSizeMake(img.size.width/scale, img.size.height/scale);
- }
- else
- {
- size = self.imageSize;
- }
-
- switch (_style)
- {
- case EImageTopTitleBottom:
- {
- CGRect imgRect = rect;
- imgRect.size.height = size.height;
- imgRect.origin.x += (imgRect.size.width - size.width)/2;
- imgRect.size.width = size.width;
- self.imageView.frame = imgRect;
-
- CGRect titleRect = rect;
- titleRect.origin.y += imgRect.size.height + _padding.height;
- titleRect.size.height -= imgRect.size.height + _padding.height;
- self.titleLabel.frame = titleRect;
- }
- break;
- case ETitleTopImageBottom:
- {
- CGRect imgRect = rect;
- imgRect.origin.x += (imgRect.size.width - size.width)/2;
- imgRect.size.width = size.width;
- imgRect.size.height = size.height;
- imgRect.origin.y += rect.size.height - imgRect.size.height;
- self.imageView.frame = imgRect;
-
- CGRect titleRect = rect;
- titleRect.size.height -= imgRect.size.height + _padding.height;
- self.titleLabel.frame = titleRect;
- }
- break;
- case EImageLeftTitleRight:
- {
- CGRect imgRect = rect;
- imgRect.size.width = size.width;
- imgRect.size.height = size.height;
- imgRect.origin.y += (rect.size.height - size.height)/2;
- self.imageView.frame = imgRect;
-
- CGRect titleRect = rect;
- titleRect.origin.x += imgRect.size.width + _padding.width;
- titleRect.size.width -= imgRect.size.width + _padding.width;
- self.titleLabel.frame = titleRect;
- }
- break;
- case ETitleLeftImageRight:
- {
- CGRect imgRect = rect;
- imgRect.size.width = size.width;
- imgRect.origin.x += rect.size.width - imgRect.size.width;
- imgRect.size.height = size.height;
- imgRect.origin.y += (rect.size.height - size.height)/2;
- self.imageView.frame = imgRect;
-
- CGRect titleRect = rect;
- titleRect.size.width -= imgRect.size.width + _padding.width;
- self.titleLabel.frame = titleRect;
- }
- break;
- case EImageLeftTitleRightLeft:
- {
- CGRect imgRect = rect;
- imgRect.size = self.imageSize;
- imgRect.origin.y += (rect.size.height - imgRect.size.height)/2;
- self.imageView.frame = imgRect;
-
- rect.origin.x += imgRect.size.width + self.padding.width;
- rect.size.width -= imgRect.size.width + self.padding.width;
- self.titleLabel.textAlignment = NSTextAlignmentLeft;
- self.titleLabel.frame = rect;
- }
- break;
-
- case ETitleLeftImageRightLeft:
- {
- CGRect imgRect = rect;
- imgRect.size = self.imageSize;
- imgRect.origin.y += (rect.size.height - imgRect.size.height)/2;
- imgRect.origin.x += rect.size.width - (imgRect.size.width + self.padding.width);
- self.imageView.frame = imgRect;
-
- rect.size.width -= imgRect.size.width + self.padding.width;
-
- self.titleLabel.frame = rect;
- }
- break;
-
- case EImageLeftTitleRightCenter:
- {
-
- CGSize titleSize = [self.titleLabel textSizeIn:rect.size];
-
- CGRect middleRect = CGRectInset(rect, (rect.size.width - (titleSize.width + self.imageSize.width + self.padding.width))/2, 0);
-
- CGRect imgRect = middleRect;
-
- imgRect.size = self.imageSize;
- imgRect.origin.y += (middleRect.size.height - imgRect.size.height)/2;
- self.imageView.frame = imgRect;
-
- middleRect.origin.x += imgRect.size.width + self.padding.width;
- middleRect.size.width -= imgRect.size.width + self.padding.width;
-
- self.titleLabel.frame = middleRect;
-
-
- }
- break;
-
- case ETitleLeftImageRightCenter:
- {
- CGSize titleSize = [self.titleLabel textSizeIn:rect.size];
-
- CGRect middleRect = CGRectInset(rect, (rect.size.width - (titleSize.width + self.imageSize.width + self.padding.width))/2, 0);
-
- CGRect titlerect = middleRect;
- titlerect.size.width = titleSize.width;
- self.titleLabel.frame = titlerect;
-
- middleRect.origin.x += titlerect.size.width + self.padding.width;
- middleRect.size.width -= titlerect.size.width + self.padding.width;
-
- middleRect.origin.y += (middleRect.size.height - self.imageSize.height)/2;
- middleRect.size = self.imageSize;
- self.imageView.frame = middleRect;
- }
- break;
- case EFitTitleLeftImageRight:
- {
- CGSize titleSize = [self.titleLabel textSizeIn:rect.size];
- CGRect titleRect = rect;
- titleRect.origin.y = rect.origin.y + (rect.size.height - titleSize.height)/2;
- titleRect.size = titleSize;
- self.titleLabel.frame = titleRect;
-
- titleRect.origin.x += titleRect.size.width + self.padding.width;
- titleRect.size = self.imageSize;
- titleRect.origin.y = rect.origin.y + (rect.size.height - self.imageSize.height)/2;
- self.imageView.frame = titleRect;
-
- break;
- }
- break;
-
- default:
- break;
- }
- }
- - (void)layoutSubviews
- {
- if (CGRectEqualToRect(self.bounds, CGRectZero))
- {
- return;
- }
- [super layoutSubviews];
-
- // // 单独设置title或image的时候只用
- // NSString *title = [self titleForState:UIControlStateNormal];
- // UIImage *image = [self imageForState:UIControlStateNormal];
- // if ([NSString isEmpty:title] && image)
- // {
- [self relayoutFrameOfSubViews];
- // }
- }
- - (void)setTintColor:(UIColor *)color
- {
- if (color)
- {
- UIImage *img = [self imageForState:UIControlStateNormal];
- img = [img imageWithTintColor:color];
- [self setImage:img forState:UIControlStateNormal];
- [self setTitleColor:color forState:UIControlStateNormal];
- }
- }
- @end
|