如果对于UIButton中的titleEdgeInsets和imageEdgeInsets不是很明白的,先参考://www.greatytc.com/p/1f1c9dada4dd
二话不说,直接上代码
.h文件
typedef enum {
UIButtonTitleWithImageAlignmentUp = 0, // image is up, title is down
UIButtonTitleWithImageAlignmentLeft, // image is left, title is right
UIButtonTitleWithImageAlignmentDown, // image is down, title is up
UIButtonTitleWithImageAlignmentRight // image is right, title is left
} UIButtonTitleWithImageAlignment;
@interface EYImgTextButton : UIButton
@property (nonatomic) CGFloat imgTextDistance; // image and title的之间的Distance,
@property(nonatomic,assign)UIButtonTitleWithImageAlignment buttonTitleWithImageAlignment;
@end
.m文件
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_imgTextDistance=5;
_buttonTitleWithImageAlignment=UIButtonTitleWithImageAlignmentLeft;
//default Alignment is in order to facilitate the layout
[self setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[self setContentVerticalAlignment:UIControlContentVerticalAlignmentTop];
}
return self;
}
-(void)layoutSubviews{
[super layoutSubviews];
[self setUpImgTitleConstraints];
}
-(void)setUpImgTitleConstraints{
CGFloat buttonWidth = self.frame.size.width;
CGFloat buttonHeight = self.frame.size.height;
CGFloat imgWidth = self.imageView.image.size.width;
CGFloat imgHeight = self.imageView.image.size.height;
CGSize textSize = [self.titleLabel.text sizeWithAttributes:@{NSFontAttributeName:self.titleLabel.font}];
CGFloat textWitdh = textSize.width;
CGFloat textHeight = textSize.height;
CGFloat interval; // distance between the whole image title part and button
CGFloat imgOffsetX; // horizontal offset of image
CGFloat imgOffsetY; // vertical offset of image
CGFloat titleOffsetX; // horizontal offset of title
CGFloat titleOffsetY; // vertical offset of title
if (_buttonTitleWithImageAlignment == UIButtonTitleWithImageAlignmentUp) {
interval = (buttonHeight - (imgHeight + _imgTextDistance + textHeight)) / 2;
imgOffsetX = (buttonWidth - imgWidth) / 2;
imgOffsetY = interval;
titleOffsetX = (buttonWidth - textWitdh) / 2 - imgWidth;
titleOffsetY = interval + imgHeight + _imgTextDistance;
}else if (_buttonTitleWithImageAlignment == UIButtonTitleWithImageAlignmentLeft) {
interval = (buttonWidth - (imgWidth + _imgTextDistance + textWitdh)) / 2;
imgOffsetX = interval;
imgOffsetY = (buttonHeight - imgHeight) / 2;
titleOffsetX = buttonWidth - (imgWidth + textWitdh + interval);
titleOffsetY = (buttonHeight - textHeight) / 2;
}else if (_buttonTitleWithImageAlignment == UIButtonTitleWithImageAlignmentDown) {
interval = (buttonHeight - (imgHeight + _imgTextDistance + textHeight)) / 2;
imgOffsetX = (buttonWidth - imgWidth) / 2;
imgOffsetY = interval + textHeight + _imgTextDistance;
titleOffsetX = (buttonWidth - textWitdh) / 2 - imgWidth;
titleOffsetY = interval;
}else if (_buttonTitleWithImageAlignment == UIButtonTitleWithImageAlignmentRight) {
interval = (buttonWidth - (imgWidth + _imgTextDistance + textWitdh)) / 2;
imgOffsetX = interval + textWitdh + _imgTextDistance;
imgOffsetY = (buttonHeight - imgHeight) / 2;
titleOffsetX = - (imgWidth - interval);
titleOffsetY = (buttonHeight - textHeight) / 2;
}
[self setImageEdgeInsets:UIEdgeInsetsMake(imgOffsetY, imgOffsetX, 0, 0)];
[self setTitleEdgeInsets:UIEdgeInsetsMake(titleOffsetY, titleOffsetX, 0, 0)];
}
直接拿过来就能用,支持masonry