From c447a3e75360b8017ba0b850bc39a1361802f053 Mon Sep 17 00:00:00 2001 From: 00 Date: Thu, 14 Nov 2019 15:46:49 +0800 Subject: [PATCH] support RTL language --- .../UIButton+MiddleAligning.h | 1 + .../UIButton+MiddleAligning.m | 83 +++++++++++++------ 2 files changed, 57 insertions(+), 27 deletions(-) diff --git a/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.h b/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.h index 4c2ef4d..3a5ea58 100644 --- a/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.h +++ b/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.h @@ -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 diff --git a/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.m b/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.m index c3d6b18..d753f74 100644 --- a/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.m +++ b/Pod/Classes/UIButton+MiddleAligning/UIButton+MiddleAligning.m @@ -14,19 +14,18 @@ @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; } @@ -34,42 +33,72 @@ - (UIImage *)MiddleAlignedButtonImageScaleToSize:(CGSize)size @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; }