From 32fcb809c5bbadbda102773d915102afe3236061 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Fri, 16 Mar 2018 12:24:36 -0700 Subject: [PATCH 1/2] Updated code to support macOS versions earlier than 10.12 by: 1.) mapping NSImageLeading and NSImageTrailing image positions to NSImageLeft and NSImageRight respectively when run on macOS 10.12 but ignore these values otherwise. 2.) assumes imageHugsTitle == NO on macOS < 10.12. This property was added in 10.12 and the default value is NO. --- SYFlatButton/SYFlatButton/SYFlatButton.m | 88 ++++++++++++++++++++---- 1 file changed, 74 insertions(+), 14 deletions(-) diff --git a/SYFlatButton/SYFlatButton/SYFlatButton.m b/SYFlatButton/SYFlatButton/SYFlatButton.m index 8e589cb..df80781 100644 --- a/SYFlatButton/SYFlatButton/SYFlatButton.m +++ b/SYFlatButton/SYFlatButton/SYFlatButton.m @@ -79,8 +79,24 @@ - (void)setupImageLayer { CGFloat x = 0.0; // Image's origin x CGFloat y = 0.0; // Image's origin y + NSCellImagePosition effectiveImagePosition = self.imagePosition; + + if (@available(macOS 10.12, *)) { + switch(self.imagePosition) { + case NSImageTrailing: + effectiveImagePosition = NSImageRight; + break; + case NSImageLeading: + effectiveImagePosition = NSImageLeft; + break; + default: + //no mapping needed + break; + } + } + // Caculate the image's and title's position depends on button's imagePosition and imageHugsTitle property - switch (self.imagePosition) { + switch (effectiveImagePosition) { case NSNoImage: return; break; @@ -94,26 +110,40 @@ - (void)setupImageLayer { y = (buttonSize.height - imageSize.height) / 2.0; break; } - case NSImageLeading: case NSImageLeft: { - x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; + if (@available(macOS 10.12, *)) { + x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; + } else { + x = self.spacing; + } y = (buttonSize.height - imageSize.height) / 2.0; break; } - case NSImageTrailing: case NSImageRight: { - x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width + titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - imageSize.width - self.spacing); + if (@available(macOS 10.12, *)) { + x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width + titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - imageSize.width - self.spacing); + } else { + x = (buttonSize.width - imageSize.width - self.spacing); + } y = (buttonSize.height - imageSize.height) / 2.0; break; } case NSImageAbove: { x = (buttonSize.width - imageSize.width) / 2.0; - y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; + if (@available(macOS 10.12, *)) { + y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; + } else { + y = self.spacing; + } break; } case NSImageBelow: { x = (buttonSize.width - imageSize.width) / 2.0; - y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height + titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - imageSize.height - self.spacing); + if (@available(macOS 10.12, *)) { + y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height + titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - imageSize.height - self.spacing); + } else { + y = (buttonSize.height - imageSize.height - self.spacing); + } break; } default: { @@ -146,8 +176,24 @@ - (void)setupTitleLayer { CGFloat x = 0.0; // Title's origin x CGFloat y = 0.0; // Title's origin y + NSCellImagePosition effectiveImagePosition = self.imagePosition; + + if (@available(macOS 10.12, *)) { + switch(self.imagePosition) { + case NSImageTrailing: + effectiveImagePosition = NSImageRight; + break; + case NSImageLeading: + effectiveImagePosition = NSImageLeft; + break; + default: + //no mapping needed + break; + } + } + // Caculate the image's and title's position depends on button's imagePosition and imageHugsTitle property - switch (self.imagePosition) { + switch (effectiveImagePosition) { case NSImageOnly: { return; break; @@ -162,25 +208,39 @@ - (void)setupTitleLayer { y = (buttonSize.height - titleSize.height) / 2.0; break; } - case NSImageLeading: case NSImageLeft: { - x = self.imageHugsTitle ? ((buttonSize.width + imageSize.width - titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - titleSize.width - self.spacing); + if (@available(macOS 10.12, *)) { + x = self.imageHugsTitle ? ((buttonSize.width + imageSize.width - titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - titleSize.width - self.spacing); + } else { + x = (buttonSize.width - titleSize.width - self.spacing); + } y = (buttonSize.height - titleSize.height) / 2.0; break; } - case NSImageTrailing: case NSImageRight: { - x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; + if (@available(macOS 10.12, *)) { + x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; + } else { + x = self.spacing; + } y = (buttonSize.height - titleSize.height) / 2.0; break; } case NSImageAbove: { x = (buttonSize.width - titleSize.width) / 2.0; - y = self.imageHugsTitle ? ((buttonSize.height + imageSize.height - titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - titleSize.height - self.spacing); + if (@available(macOS 10.12, *)) { + y = self.imageHugsTitle ? ((buttonSize.height + imageSize.height - titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - titleSize.height - self.spacing); + } else { + y = (buttonSize.height - titleSize.height - self.spacing); + } break; } case NSImageBelow: { - y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; + if (@available(macOS 10.12, *)) { + y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; + } else { + y = self.spacing; + } x = (buttonSize.width - titleSize.width) / 2.0; break; } From 2fb6015b2f6cf628e6398e6adbb091d6dbdb1835 Mon Sep 17 00:00:00 2001 From: Matt Galloway Date: Sun, 18 Mar 2018 13:14:03 -0700 Subject: [PATCH 2/2] Refactored to a cleaner implementation. --- SYFlatButton/SYFlatButton/SYFlatButton.m | 108 +++++++++-------------- 1 file changed, 40 insertions(+), 68 deletions(-) diff --git a/SYFlatButton/SYFlatButton/SYFlatButton.m b/SYFlatButton/SYFlatButton/SYFlatButton.m index df80781..8ac6773 100644 --- a/SYFlatButton/SYFlatButton/SYFlatButton.m +++ b/SYFlatButton/SYFlatButton/SYFlatButton.m @@ -79,23 +79,14 @@ - (void)setupImageLayer { CGFloat x = 0.0; // Image's origin x CGFloat y = 0.0; // Image's origin y - NSCellImagePosition effectiveImagePosition = self.imagePosition; - + // Caculate the image's and title's position depends on button's imagePosition and imageHugsTitle property + + NSCellImagePosition effectiveImagePosition = [self effectiveImagePositionFrom:self.imagePosition]; + BOOL effectiveImageHugsTitle = NO; if (@available(macOS 10.12, *)) { - switch(self.imagePosition) { - case NSImageTrailing: - effectiveImagePosition = NSImageRight; - break; - case NSImageLeading: - effectiveImagePosition = NSImageLeft; - break; - default: - //no mapping needed - break; - } + effectiveImageHugsTitle = self.imageHugsTitle; } - - // Caculate the image's and title's position depends on button's imagePosition and imageHugsTitle property + switch (effectiveImagePosition) { case NSNoImage: return; @@ -111,39 +102,23 @@ - (void)setupImageLayer { break; } case NSImageLeft: { - if (@available(macOS 10.12, *)) { - x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; - } else { - x = self.spacing; - } + x = effectiveImageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; y = (buttonSize.height - imageSize.height) / 2.0; break; } case NSImageRight: { - if (@available(macOS 10.12, *)) { - x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width + titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - imageSize.width - self.spacing); - } else { - x = (buttonSize.width - imageSize.width - self.spacing); - } + x = effectiveImageHugsTitle ? ((buttonSize.width - imageSize.width + titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - imageSize.width - self.spacing); y = (buttonSize.height - imageSize.height) / 2.0; break; } case NSImageAbove: { x = (buttonSize.width - imageSize.width) / 2.0; - if (@available(macOS 10.12, *)) { - y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; - } else { - y = self.spacing; - } + y = effectiveImageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; break; } case NSImageBelow: { x = (buttonSize.width - imageSize.width) / 2.0; - if (@available(macOS 10.12, *)) { - y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height + titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - imageSize.height - self.spacing); - } else { - y = (buttonSize.height - imageSize.height - self.spacing); - } + y = effectiveImageHugsTitle ? ((buttonSize.height - imageSize.height + titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - imageSize.height - self.spacing); break; } default: { @@ -176,23 +151,14 @@ - (void)setupTitleLayer { CGFloat x = 0.0; // Title's origin x CGFloat y = 0.0; // Title's origin y - NSCellImagePosition effectiveImagePosition = self.imagePosition; + // Caculate the image's and title's position depends on button's imagePosition and imageHugsTitle property + NSCellImagePosition effectiveImagePosition = [self effectiveImagePositionFrom:self.imagePosition]; + BOOL effectiveImageHugsTitle = NO; if (@available(macOS 10.12, *)) { - switch(self.imagePosition) { - case NSImageTrailing: - effectiveImagePosition = NSImageRight; - break; - case NSImageLeading: - effectiveImagePosition = NSImageLeft; - break; - default: - //no mapping needed - break; - } + effectiveImageHugsTitle = self.imageHugsTitle; } - // Caculate the image's and title's position depends on button's imagePosition and imageHugsTitle property switch (effectiveImagePosition) { case NSImageOnly: { return; @@ -209,38 +175,22 @@ - (void)setupTitleLayer { break; } case NSImageLeft: { - if (@available(macOS 10.12, *)) { - x = self.imageHugsTitle ? ((buttonSize.width + imageSize.width - titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - titleSize.width - self.spacing); - } else { - x = (buttonSize.width - titleSize.width - self.spacing); - } + x = effectiveImageHugsTitle ? ((buttonSize.width + imageSize.width - titleSize.width) / 2.0 + self.spacing) : (buttonSize.width - titleSize.width - self.spacing); y = (buttonSize.height - titleSize.height) / 2.0; break; } case NSImageRight: { - if (@available(macOS 10.12, *)) { - x = self.imageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; - } else { - x = self.spacing; - } + x = effectiveImageHugsTitle ? ((buttonSize.width - imageSize.width - titleSize.width) / 2.0 - self.spacing) : self.spacing; y = (buttonSize.height - titleSize.height) / 2.0; break; } case NSImageAbove: { x = (buttonSize.width - titleSize.width) / 2.0; - if (@available(macOS 10.12, *)) { - y = self.imageHugsTitle ? ((buttonSize.height + imageSize.height - titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - titleSize.height - self.spacing); - } else { - y = (buttonSize.height - titleSize.height - self.spacing); - } + y = effectiveImageHugsTitle ? ((buttonSize.height + imageSize.height - titleSize.height) / 2.0 + self.spacing) : (buttonSize.height - titleSize.height - self.spacing); break; } case NSImageBelow: { - if (@available(macOS 10.12, *)) { - y = self.imageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; - } else { - y = self.spacing; - } + y = effectiveImageHugsTitle ? ((buttonSize.height - imageSize.height - titleSize.height) / 2.0 - self.spacing) : self.spacing; x = (buttonSize.width - titleSize.width) / 2.0; break; } @@ -438,4 +388,26 @@ - (CATextLayer *)titleLayer { return _titleLayer; } +#pragma mark - Helper Methods + +- (NSCellImagePosition)effectiveImagePositionFrom:(NSCellImagePosition) originalImagePosition { + + NSCellImagePosition effectiveImagePosition = originalImagePosition; + + if (@available(macOS 10.12, *)) { + switch(originalImagePosition) { + case NSImageTrailing: + effectiveImagePosition = NSImageRight; + break; + case NSImageLeading: + effectiveImagePosition = NSImageLeft; + break; + default: + //no mapping needed + break; + } + } + return effectiveImagePosition; +} + @end