From ac60dc7410c6c507dc87994d298e4477b14217a6 Mon Sep 17 00:00:00 2001 From: Christopher Owen Date: Wed, 9 Apr 2014 10:36:11 +1000 Subject: [PATCH 1/2] Allow the setting of a mask for the current page indicator as an alternative to a normal image. --- SMPageControl.h | 1 + SMPageControl.m | 85 ++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 75 insertions(+), 11 deletions(-) diff --git a/SMPageControl.h b/SMPageControl.h index 530c404..12f7c65 100755 --- a/SMPageControl.h +++ b/SMPageControl.h @@ -54,6 +54,7 @@ typedef NS_ENUM(NSUInteger, SMPageControlTapBehavior) { - (void)setImage:(UIImage *)image forPage:(NSInteger)pageIndex; - (void)setCurrentImage:(UIImage *)image forPage:(NSInteger)pageIndex; - (void)setImageMask:(UIImage *)image forPage:(NSInteger)pageIndex; +- (void)setCurrentImageMask:(UIImage *)image forPage:(NSInteger)pageIndex; - (UIImage *)imageForPage:(NSInteger)pageIndex; - (UIImage *)currentImageForPage:(NSInteger)pageIndex; diff --git a/SMPageControl.m b/SMPageControl.m index b0eb1fa..7f53f8b 100755 --- a/SMPageControl.m +++ b/SMPageControl.m @@ -24,7 +24,8 @@ typedef NS_ENUM(NSUInteger, SMPageControlImageType) { SMPageControlImageTypeNormal = 1, SMPageControlImageTypeCurrent, - SMPageControlImageTypeMask + SMPageControlImageTypeMask, + SMPageControlImageTypeCurrentMask }; typedef NS_ENUM(NSUInteger, SMPageControlStyleDefaults) { @@ -39,7 +40,9 @@ @interface SMPageControl () @property (strong, readonly, nonatomic) NSMutableDictionary *pageImages; @property (strong, readonly, nonatomic) NSMutableDictionary *currentPageImages; @property (strong, readonly, nonatomic) NSMutableDictionary *pageImageMasks; +@property (strong, readonly, nonatomic) NSMutableDictionary *currentPageImageMasks; @property (strong, readonly, nonatomic) NSMutableDictionary *cgImageMasks; +@property (strong, readonly, nonatomic) NSMutableDictionary *cgCurrentImageMasks; @property (strong, readwrite, nonatomic) NSArray *pageRects; // Page Control used for stealing page number localizations for accessibility labels @@ -60,8 +63,10 @@ @implementation SMPageControl @synthesize pageNames = _pageNames; @synthesize pageImages = _pageImages; @synthesize currentPageImages = _currentPageImages; +@synthesize currentPageImageMasks = _currentPageImageMasks; @synthesize pageImageMasks = _pageImageMasks; @synthesize cgImageMasks = _cgImageMasks; +@synthesize cgCurrentImageMasks = _cgCurrentImageMasks; + (void)initialize { @@ -157,7 +162,9 @@ - (void)_renderPages:(CGContextRef)context rect:(CGRect)rect fillColor = _currentPageIndicatorTintColor ? _currentPageIndicatorTintColor : [UIColor whiteColor]; image = _currentPageImages[indexNumber]; if (nil == image) { - image = _currentPageIndicatorImage; + if (nil == _currentPageImageMasks[indexNumber]) { + image = _currentPageIndicatorImage; + } } } else { fillColor = _pageIndicatorTintColor ? _pageIndicatorTintColor : [[UIColor whiteColor] colorWithAlphaComponent:0.3f]; @@ -169,15 +176,22 @@ - (void)_renderPages:(CGContextRef)context rect:(CGRect)rect // If no finished images have been set, try a masking image if (nil == image) { - maskingImage = (__bridge CGImageRef)_cgImageMasks[indexNumber]; - UIImage *originalImage = _pageImageMasks[indexNumber]; - maskSize = originalImage.size; - - // If no per page mask is set, try for a global page mask! - if (nil == maskingImage) { - maskingImage = _pageImageMask; - maskSize = _pageIndicatorMaskImage.size; - } + if (i == _displayedPage) { + maskingImage = (__bridge CGImageRef)_cgCurrentImageMasks[indexNumber]; + UIImage *originalImage = _currentPageImageMasks[indexNumber]; + maskSize = originalImage.size; + } + else { + maskingImage = (__bridge CGImageRef)_cgImageMasks[indexNumber]; + UIImage *originalImage = _pageImageMasks[indexNumber]; + maskSize = originalImage.size; + } + + // If no per page mask is set, try for a global page mask! + if (nil == maskingImage) { + maskingImage = _pageImageMask; + maskSize = _pageIndicatorMaskImage.size; + } } [fillColor set]; @@ -287,6 +301,8 @@ - (void)_setImage:(UIImage *)image forPage:(NSInteger)pageIndex type:(SMPageCont case SMPageControlImageTypeMask: dictionary = self.pageImageMasks; break; + case SMPageControlImageTypeCurrentMask: + dictionary = self.currentPageImageMasks; default: break; } @@ -310,6 +326,25 @@ - (void)setCurrentImage:(UIImage *)image forPage:(NSInteger)pageIndex [self _updateMeasuredIndicatorSizes]; } +- (void)setCurrentImageMask:(UIImage *)image forPage:(NSInteger)pageIndex +{ + [self _setImage:image forPage:pageIndex type:SMPageControlImageTypeCurrentMask]; + + if (nil == image) { + [self.cgCurrentImageMasks removeObjectForKey:@(pageIndex)]; + return; + } + + CGImageRef maskImage = [self createMaskForImage:image]; + + if (maskImage) { + self.cgCurrentImageMasks[@(pageIndex)] = (__bridge id)maskImage; + CGImageRelease(maskImage); + [self _updateMeasuredIndicatorSizeWithSize:image.size]; + [self setNeedsDisplay]; + } +} + - (void)setImageMask:(UIImage *)image forPage:(NSInteger)pageIndex { [self _setImage:image forPage:pageIndex type:SMPageControlImageTypeMask]; @@ -346,6 +381,9 @@ - (id)_imageForPage:(NSInteger)pageIndex type:(SMPageControlImageType)type case SMPageControlImageTypeMask: dictionary = _pageImageMasks; break; + case SMPageControlImageTypeCurrentMask: + dictionary = _currentPageImageMasks; + break; default: break; } @@ -368,6 +406,11 @@ - (UIImage *)imageMaskForPage:(NSInteger)pageIndex return [self _imageForPage:pageIndex type:SMPageControlImageTypeMask]; } +- (UIImage *)currentImageMaskForPage:(NSInteger)pageIndex +{ + return [self _imageForPage:pageIndex type:SMPageControlImageTypeCurrentMask]; +} + - (CGSize)sizeThatFits:(CGSize)size { CGSize sizeThatFits = [self sizeForNumberOfPages:self.numberOfPages]; @@ -681,6 +724,16 @@ - (NSMutableDictionary *)pageImageMasks return _pageImageMasks; } +- (NSMutableDictionary *)currentPageImageMasks +{ + if (nil != _currentPageImageMasks) { + return _currentPageImageMasks; + } + + _currentPageImageMasks = [[NSMutableDictionary alloc] init]; + return _currentPageImageMasks; +} + - (NSMutableDictionary *)cgImageMasks { if (nil != _cgImageMasks) { @@ -691,6 +744,16 @@ - (NSMutableDictionary *)cgImageMasks return _cgImageMasks; } +- (NSMutableDictionary *)cgCurrentImageMasks +{ + if (nil != _cgCurrentImageMasks) { + return _cgCurrentImageMasks; + } + + _cgCurrentImageMasks = [[NSMutableDictionary alloc] init]; + return _cgCurrentImageMasks; +} + #pragma mark - UIAccessibility - (void)setName:(NSString *)name forPage:(NSInteger)pageIndex From e01048c6df66a8a90e6f746c941b59e544e549fe Mon Sep 17 00:00:00 2001 From: Christopher Owen Date: Wed, 9 Apr 2014 10:57:29 +1000 Subject: [PATCH 2/2] Use tabs in line with most of the rest of the source. Add a missing break to a switch case. --- SMPageControl.m | 130 ++++++++++++++++++++++++------------------------ 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/SMPageControl.m b/SMPageControl.m index 7f53f8b..c4fa154 100755 --- a/SMPageControl.m +++ b/SMPageControl.m @@ -25,7 +25,7 @@ typedef NS_ENUM(NSUInteger, SMPageControlImageType) { SMPageControlImageTypeNormal = 1, SMPageControlImageTypeCurrent, SMPageControlImageTypeMask, - SMPageControlImageTypeCurrentMask + SMPageControlImageTypeCurrentMask }; typedef NS_ENUM(NSUInteger, SMPageControlStyleDefaults) { @@ -162,9 +162,9 @@ - (void)_renderPages:(CGContextRef)context rect:(CGRect)rect fillColor = _currentPageIndicatorTintColor ? _currentPageIndicatorTintColor : [UIColor whiteColor]; image = _currentPageImages[indexNumber]; if (nil == image) { - if (nil == _currentPageImageMasks[indexNumber]) { - image = _currentPageIndicatorImage; - } + if (nil == _currentPageImageMasks[indexNumber]) { + image = _currentPageIndicatorImage; + } } } else { fillColor = _pageIndicatorTintColor ? _pageIndicatorTintColor : [[UIColor whiteColor] colorWithAlphaComponent:0.3f]; @@ -176,31 +176,30 @@ - (void)_renderPages:(CGContextRef)context rect:(CGRect)rect // If no finished images have been set, try a masking image if (nil == image) { - if (i == _displayedPage) { - maskingImage = (__bridge CGImageRef)_cgCurrentImageMasks[indexNumber]; - UIImage *originalImage = _currentPageImageMasks[indexNumber]; - maskSize = originalImage.size; - } - else { - maskingImage = (__bridge CGImageRef)_cgImageMasks[indexNumber]; - UIImage *originalImage = _pageImageMasks[indexNumber]; - maskSize = originalImage.size; - } - - // If no per page mask is set, try for a global page mask! - if (nil == maskingImage) { - maskingImage = _pageImageMask; - maskSize = _pageIndicatorMaskImage.size; - } + if (i == _displayedPage) { + maskingImage = (__bridge CGImageRef)_cgCurrentImageMasks[indexNumber]; + UIImage *originalImage = _currentPageImageMasks[indexNumber]; + maskSize = originalImage.size; + } else { + maskingImage = (__bridge CGImageRef)_cgImageMasks[indexNumber]; + UIImage *originalImage = _pageImageMasks[indexNumber]; + maskSize = originalImage.size; + } + + // If no per page mask is set, try for a global page mask! + if (nil == maskingImage) { + maskingImage = _pageImageMask; + maskSize = _pageIndicatorMaskImage.size; + } } - + [fillColor set]; CGRect indicatorRect; if (image) { yOffset = [self _topOffsetForHeight:image.size.height rect:rect]; CGFloat centeredXOffset = xOffset + floorf((_measuredIndicatorWidth - image.size.width) / 2.0f); [image drawAtPoint:CGPointMake(centeredXOffset, yOffset)]; - indicatorRect = CGRectMake(centeredXOffset, yOffset, image.size.width, image.size.height); + indicatorRect = CGRectMake(centeredXOffset, yOffset, image.size.width, image.size.height); } else if (maskingImage) { yOffset = [self _topOffsetForHeight:maskSize.height rect:rect]; CGFloat centeredXOffset = xOffset + floorf((_measuredIndicatorWidth - maskSize.width) / 2.0f); @@ -209,11 +208,11 @@ - (void)_renderPages:(CGContextRef)context rect:(CGRect)rect } else { yOffset = [self _topOffsetForHeight:_indicatorDiameter rect:rect]; CGFloat centeredXOffset = xOffset + floorf((_measuredIndicatorWidth - _indicatorDiameter) / 2.0f); - indicatorRect = CGRectMake(centeredXOffset, yOffset, _indicatorDiameter, _indicatorDiameter); + indicatorRect = CGRectMake(centeredXOffset, yOffset, _indicatorDiameter, _indicatorDiameter); CGContextFillEllipseInRect(context, indicatorRect); } - [pageRects addObject:[NSValue valueWithCGRect:indicatorRect]]; + [pageRects addObject:[NSValue valueWithCGRect:indicatorRect]]; maskingImage = NULL; xOffset += _measuredIndicatorWidth + _indicatorMargin; } @@ -301,17 +300,18 @@ - (void)_setImage:(UIImage *)image forPage:(NSInteger)pageIndex type:(SMPageCont case SMPageControlImageTypeMask: dictionary = self.pageImageMasks; break; - case SMPageControlImageTypeCurrentMask: - dictionary = self.currentPageImageMasks; + case SMPageControlImageTypeCurrentMask: + dictionary = self.currentPageImageMasks; + break; default: break; } - - if (image) { - dictionary[@(pageIndex)] = image; - } else { - [dictionary removeObjectForKey:@(pageIndex)]; - } + + if (image) { + dictionary[@(pageIndex)] = image; + } else { + [dictionary removeObjectForKey:@(pageIndex)]; + } } - (void)setImage:(UIImage *)image forPage:(NSInteger)pageIndex @@ -328,21 +328,21 @@ - (void)setCurrentImage:(UIImage *)image forPage:(NSInteger)pageIndex - (void)setCurrentImageMask:(UIImage *)image forPage:(NSInteger)pageIndex { - [self _setImage:image forPage:pageIndex type:SMPageControlImageTypeCurrentMask]; - - if (nil == image) { - [self.cgCurrentImageMasks removeObjectForKey:@(pageIndex)]; - return; - } - - CGImageRef maskImage = [self createMaskForImage:image]; - - if (maskImage) { - self.cgCurrentImageMasks[@(pageIndex)] = (__bridge id)maskImage; - CGImageRelease(maskImage); - [self _updateMeasuredIndicatorSizeWithSize:image.size]; - [self setNeedsDisplay]; - } + [self _setImage:image forPage:pageIndex type:SMPageControlImageTypeCurrentMask]; + + if (nil == image) { + [self.cgCurrentImageMasks removeObjectForKey:@(pageIndex)]; + return; + } + + CGImageRef maskImage = [self createMaskForImage:image]; + + if (maskImage) { + self.cgCurrentImageMasks[@(pageIndex)] = (__bridge id)maskImage; + CGImageRelease(maskImage); + [self _updateMeasuredIndicatorSizeWithSize:image.size]; + [self setNeedsDisplay]; + } } - (void)setImageMask:(UIImage *)image forPage:(NSInteger)pageIndex @@ -381,9 +381,9 @@ - (id)_imageForPage:(NSInteger)pageIndex type:(SMPageControlImageType)type case SMPageControlImageTypeMask: dictionary = _pageImageMasks; break; - case SMPageControlImageTypeCurrentMask: - dictionary = _currentPageImageMasks; - break; + case SMPageControlImageTypeCurrentMask: + dictionary = _currentPageImageMasks; + break; default: break; } @@ -408,7 +408,7 @@ - (UIImage *)imageMaskForPage:(NSInteger)pageIndex - (UIImage *)currentImageMaskForPage:(NSInteger)pageIndex { - return [self _imageForPage:pageIndex type:SMPageControlImageTypeCurrentMask]; + return [self _imageForPage:pageIndex type:SMPageControlImageTypeCurrentMask]; } - (CGSize)sizeThatFits:(CGSize)size @@ -473,7 +473,7 @@ - (CGImageRef)createMaskForImage:(UIImage *)image CF_RETURNS_RETAINED CGContextDrawImage(context, CGRectMake(0, 0, pixelsWide, pixelsHigh), image.CGImage); CGImageRef maskImage = CGBitmapContextCreateImage(context); CGContextRelease(context); - + return maskImage; } @@ -506,7 +506,7 @@ - (void)_updateMeasuredIndicatorSizes if (self.pageIndicatorMaskImage) { [self _updateMeasuredIndicatorSizeWithSize:self.pageIndicatorMaskImage.size]; } - + if ([self respondsToSelector:@selector(invalidateIntrinsicContentSize)]) { [self invalidateIntrinsicContentSize]; } @@ -726,12 +726,12 @@ - (NSMutableDictionary *)pageImageMasks - (NSMutableDictionary *)currentPageImageMasks { - if (nil != _currentPageImageMasks) { - return _currentPageImageMasks; - } - - _currentPageImageMasks = [[NSMutableDictionary alloc] init]; - return _currentPageImageMasks; + if (nil != _currentPageImageMasks) { + return _currentPageImageMasks; + } + + _currentPageImageMasks = [[NSMutableDictionary alloc] init]; + return _currentPageImageMasks; } - (NSMutableDictionary *)cgImageMasks @@ -746,12 +746,12 @@ - (NSMutableDictionary *)cgImageMasks - (NSMutableDictionary *)cgCurrentImageMasks { - if (nil != _cgCurrentImageMasks) { - return _cgCurrentImageMasks; - } - - _cgCurrentImageMasks = [[NSMutableDictionary alloc] init]; - return _cgCurrentImageMasks; + if (nil != _cgCurrentImageMasks) { + return _cgCurrentImageMasks; + } + + _cgCurrentImageMasks = [[NSMutableDictionary alloc] init]; + return _cgCurrentImageMasks; } #pragma mark - UIAccessibility