Skip to content

Commit d27f33a

Browse files
committed
Merge pull request #17 from idpaterson/pull-requests/autolayout-support
Added support for AutoLayout matching UIPageControl
2 parents f5382b5 + 9a5f2cb commit d27f33a

File tree

2 files changed

+48
-5
lines changed

2 files changed

+48
-5
lines changed

SMPageControl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ typedef NS_ENUM(NSUInteger, SMPageControlTapBehavior) {
3131
@property (nonatomic) NSInteger currentPage;
3232
@property (nonatomic) CGFloat indicatorMargin UI_APPEARANCE_SELECTOR; // deafult is 10
3333
@property (nonatomic) CGFloat indicatorDiameter UI_APPEARANCE_SELECTOR; // deafult is 6
34+
@property (nonatomic) CGFloat minHeight UI_APPEARANCE_SELECTOR; // default is 36, cannot be less than indicatorDiameter
3435
@property (nonatomic) SMPageControlAlignment alignment UI_APPEARANCE_SELECTOR; // deafult is Center
3536
@property (nonatomic) SMPageControlVerticalAlignment verticalAlignment UI_APPEARANCE_SELECTOR; // deafult is Middle
3637

SMPageControl.m

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@
1515

1616
#define DEFAULT_INDICATOR_WIDTH 6.0f
1717
#define DEFAULT_INDICATOR_MARGIN 10.0f
18+
#define DEFAULT_MIN_HEIGHT 36.0f
1819

1920
#define DEFAULT_INDICATOR_WIDTH_LARGE 7.0f
2021
#define DEFAULT_INDICATOR_MARGIN_LARGE 9.0f
21-
22-
#define MIN_HEIGHT 36.0f
22+
#define DEFAULT_MIN_HEIGHT_LARGE 36.0f
2323

2424
typedef NS_ENUM(NSUInteger, SMPageControlImageType) {
2525
SMPageControlImageTypeNormal = 1,
@@ -370,9 +370,18 @@ - (UIImage *)imageMaskForPage:(NSInteger)pageIndex
370370

371371
- (CGSize)sizeThatFits:(CGSize)size
372372
{
373-
CGSize sizeThatFits = [self sizeForNumberOfPages:self.numberOfPages];
374-
sizeThatFits.height = MAX(sizeThatFits.height, MIN_HEIGHT);
375-
return sizeThatFits;
373+
CGSize sizeThatFits = [self sizeForNumberOfPages:self.numberOfPages];
374+
sizeThatFits.height = MAX(sizeThatFits.height, _minHeight);
375+
return sizeThatFits;
376+
}
377+
378+
- (CGSize)intrinsicContentSize
379+
{
380+
if (_numberOfPages < 1 || (_numberOfPages < 2 && _hidesForSinglePage)) {
381+
return CGSizeMake(UIViewNoIntrinsicMetric, 0.0f);
382+
}
383+
CGSize intrinsicContentSize = CGSizeMake(UIViewNoIntrinsicMetric, MAX(_measuredIndicatorHeight, _minHeight));
384+
return intrinsicContentSize;
376385
}
377386

378387
- (void)updatePageNumberForScrollView:(UIScrollView *)scrollView
@@ -395,12 +404,14 @@ - (void)setStyleWithDefaults:(SMPageControlStyleDefaults)defaultStyle
395404
self.indicatorDiameter = DEFAULT_INDICATOR_WIDTH_LARGE;
396405
self.indicatorMargin = DEFAULT_INDICATOR_MARGIN_LARGE;
397406
self.pageIndicatorTintColor = [[UIColor whiteColor] colorWithAlphaComponent:0.2f];
407+
self.minHeight = DEFAULT_MIN_HEIGHT_LARGE;
398408
break;
399409
case SMPageControlDefaultStyleClassic:
400410
default:
401411
self.indicatorDiameter = DEFAULT_INDICATOR_WIDTH;
402412
self.indicatorMargin = DEFAULT_INDICATOR_MARGIN;
403413
self.pageIndicatorTintColor = [[UIColor whiteColor] colorWithAlphaComponent:0.3f];
414+
self.minHeight = DEFAULT_MIN_HEIGHT;
404415
break;
405416
}
406417
}
@@ -452,6 +463,10 @@ - (void)_updateMeasuredIndicatorSizes
452463
if (self.pageIndicatorMaskImage) {
453464
[self _updateMeasuredIndicatorSizeWithSize:self.pageIndicatorMaskImage.size];
454465
}
466+
467+
if ([self respondsToSelector:@selector(invalidateIntrinsicContentSize)]) {
468+
[self invalidateIntrinsicContentSize];
469+
}
455470
}
456471

457472

@@ -510,6 +525,12 @@ - (void)setIndicatorDiameter:(CGFloat)indicatorDiameter
510525
}
511526

512527
_indicatorDiameter = indicatorDiameter;
528+
529+
// Absolute minimum height of the control is the indicator diameter
530+
if (_minHeight < indicatorDiameter) {
531+
self.minHeight = indicatorDiameter;
532+
}
533+
513534
[self _updateMeasuredIndicatorSizes];
514535
[self setNeedsDisplay];
515536
}
@@ -524,6 +545,24 @@ - (void)setIndicatorMargin:(CGFloat)indicatorMargin
524545
[self setNeedsDisplay];
525546
}
526547

548+
- (void)setMinHeight:(CGFloat)minHeight
549+
{
550+
if (minHeight == _minHeight) {
551+
return;
552+
}
553+
554+
// Absolute minimum height of the control is the indicator diameter
555+
if (minHeight < _indicatorDiameter) {
556+
minHeight = _indicatorDiameter;
557+
}
558+
559+
_minHeight = minHeight;
560+
if ([self respondsToSelector:@selector(invalidateIntrinsicContentSize)]) {
561+
[self invalidateIntrinsicContentSize];
562+
}
563+
[self setNeedsLayout];
564+
}
565+
527566
- (void)setNumberOfPages:(NSInteger)numberOfPages
528567
{
529568
if (numberOfPages == _numberOfPages) {
@@ -533,6 +572,9 @@ - (void)setNumberOfPages:(NSInteger)numberOfPages
533572
self.accessibilityPageControl.numberOfPages = numberOfPages;
534573

535574
_numberOfPages = MAX(0, numberOfPages);
575+
if ([self respondsToSelector:@selector(invalidateIntrinsicContentSize)]) {
576+
[self invalidateIntrinsicContentSize];
577+
}
536578
[self updateAccessibilityValue];
537579
[self setNeedsDisplay];
538580
}

0 commit comments

Comments
 (0)