Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
@discussion The middle aligning method for imageView and titleLabel.
*/
- (void)middleAlignButtonWithSpacing:(CGFloat)spacing;
- (void)middleAlignButtonWithSpacing:(CGFloat)spacing direction:(UIUserInterfaceLayoutDirection)direction;

@end
83 changes: 56 additions & 27 deletions Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.m
Original file line number Diff line number Diff line change
Expand Up @@ -14,62 +14,91 @@ @interface UIImage (MiddleAligning)

@implementation UIImage (MiddleAligning)

- (UIImage *)MiddleAlignedButtonImageScaleToSize:(CGSize)size
{
- (UIImage *)MiddleAlignedButtonImageScaleToSize:(CGSize)size {
UIGraphicsBeginImageContextWithOptions(size, NO, 0);

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, size.width, size.height), self.CGImage);

CGContextTranslateCTM(context, 0, size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), self.CGImage);
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

return scaledImage;
}

@end

@implementation UIButton (MiddleAligning)

- (void)middleAlignButtonWithSpacing:(CGFloat)spacing
{
NSString *titleString = [self titleForState:UIControlStateNormal]?:@"";
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:titleString attributes:@{NSFontAttributeName : self.titleLabel.font}];
CGSize titleSize = [attributedString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
CGSize imageSize = [self imageForState:UIControlStateNormal].size;
- (void)middleAlignButtonWithSpacing:(CGFloat)spacing {
UIUserInterfaceLayoutDirection direction = [UIApplication sharedApplication].userInterfaceLayoutDirection;
if ([self respondsToSelector:@selector(effectiveUserInterfaceLayoutDirection)]) {
direction = self.effectiveUserInterfaceLayoutDirection;
}
[self middleAlignButtonWithSpacing:spacing direction:direction];
}

- (void)middleAlignButtonWithSpacing:(CGFloat)spacing direction:(UIUserInterfaceLayoutDirection)direction {
UIControlState state = UIControlStateNormal;

NSString *titleString = [self titleForState:state]? : @"";
NSDictionary *attributes = @{NSFontAttributeName : self.titleLabel.font};
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:titleString attributes:attributes];
CGSize titleSize = [attributedString boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
context:nil].size;

CGSize imageSize = [self imageForState:state].size;

CGFloat maxImageHeight = CGRectGetHeight(self.frame) - titleSize.height - spacing * 2;
CGFloat maxImageWidth = CGRectGetWidth(self.frame);

UIImage *image = self.imageView.image;

UIImage *newImage = nil;

if (imageSize.width > ceilf(maxImageWidth)) {
CGFloat ratio = maxImageWidth / imageSize.width;
newImage = [self.imageView.image MiddleAlignedButtonImageScaleToSize:CGSizeMake(maxImageWidth, imageSize.height * ratio)];
newImage = [image MiddleAlignedButtonImageScaleToSize:CGSizeMake(maxImageWidth, imageSize.height * ratio)];
imageSize = newImage.size;
}
if (imageSize.height > ceilf(maxImageHeight)) {
CGFloat ratio = maxImageHeight / imageSize.height;
newImage = [self.imageView.image MiddleAlignedButtonImageScaleToSize:CGSizeMake(imageSize.width * ratio, maxImageHeight)];
newImage = [image MiddleAlignedButtonImageScaleToSize:CGSizeMake(imageSize.width * ratio, maxImageHeight)];
imageSize = newImage.size;
}
if (newImage) {
if (newImage != nil) {
if ([newImage respondsToSelector:@selector(imageWithRenderingMode:)]) {
newImage = [newImage imageWithRenderingMode:self.imageView.image.renderingMode];
newImage = [newImage imageWithRenderingMode:image.renderingMode];
}
[self setImage:newImage forState:UIControlStateNormal];
[self setImage:newImage forState:state];
}

CGFloat imageVerticalDiff = titleSize.height + spacing;
CGFloat imageHorizontalDiff = titleSize.width;

self.imageEdgeInsets = UIEdgeInsetsMake(-imageVerticalDiff, 0, 0, -imageHorizontalDiff);


CGFloat titleVerticalDiff = imageSize.height + spacing;
CGFloat titleHorizontalDiff = imageSize.width;

self.titleEdgeInsets = UIEdgeInsetsMake(0, -titleHorizontalDiff, -titleVerticalDiff, 0);


UIEdgeInsets imageEdgeInsets, titleEdgeInsets;

switch (direction) {
case UIUserInterfaceLayoutDirectionLeftToRight:
imageEdgeInsets = UIEdgeInsetsMake(-imageVerticalDiff, 0, 0, -imageHorizontalDiff);
titleEdgeInsets = UIEdgeInsetsMake(0, -titleHorizontalDiff, -titleVerticalDiff, 0);
break;
case UIUserInterfaceLayoutDirectionRightToLeft:
imageEdgeInsets = UIEdgeInsetsMake(-imageVerticalDiff, -imageHorizontalDiff, 0, 0);
titleEdgeInsets = UIEdgeInsetsMake(0, 0, -titleVerticalDiff, -titleHorizontalDiff);
break;
}

self.imageEdgeInsets = imageEdgeInsets;
self.titleEdgeInsets = titleEdgeInsets;

self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
}
Expand Down