WMZBannerControl.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //
  2. // WMZBannerControl.m
  3. // WMZBanner
  4. //
  5. // Created by wmz on 2019/9/6.
  6. // Copyright © 2019 wmz. All rights reserved.
  7. //
  8. #import "WMZBannerControl.h"
  9. @implementation WMZBannerControl
  10. - (instancetype)initWithFrame:(CGRect)frame WithModel:(WMZBannerParam *)param{
  11. if (self = [super initWithFrame:frame]) {
  12. self.param = param;
  13. self.userInteractionEnabled = NO;
  14. self.hidesForSinglePage = YES;
  15. self.currentPageIndicatorTintColor = param.wBannerControlSelectColor;
  16. self.pageIndicatorTintColor = param.wBannerControlColor;
  17. if (param.wBannerControlImage) {
  18. self.inactiveImage = [UIImage imageNamed:param.wBannerControlImage];
  19. self.inactiveImageSize = param.wBannerControlImageSize;
  20. self.pageIndicatorTintColor = [UIColor clearColor];
  21. }
  22. if (param.wBannerControlSelectImage) {
  23. self.currentImage = [UIImage imageNamed:param.wBannerControlSelectImage];
  24. self.currentImageSize = param.wBannerControlSelectImageSize;
  25. self.currentPageIndicatorTintColor = [UIColor clearColor];
  26. }
  27. [self resetFrame];
  28. }
  29. return self;
  30. }
  31. - (void)setCurrentPage:(NSInteger)currentPage{
  32. [super setCurrentPage:currentPage];
  33. [self updateDots];
  34. }
  35. - (void)updateDots{
  36. for (int i = 0; i < [self.subviews count]; i++) {
  37. UIImageView *dot = [self imageViewForSubview:[self.subviews objectAtIndex:i] currPage:i];
  38. if (i == self.currentPage){
  39. dot.image = self.currentImage;
  40. CGRect rect = dot.frame;
  41. rect.size = self.currentImageSize;
  42. dot.frame = rect;
  43. dot.layer.masksToBounds = YES;
  44. dot.layer.cornerRadius = self.param.wBannerControlImageRadius?:self. self.currentImageSize.height/2;
  45. }else{
  46. dot.image = self.inactiveImage;
  47. CGRect rect = dot.frame;
  48. rect.size = self.inactiveImageSize;
  49. dot.frame = rect;
  50. dot.layer.masksToBounds = YES;
  51. dot.layer.cornerRadius = self.param.wBannerControlImageRadius?:self. self.inactiveImageSize.height/2;
  52. }
  53. }
  54. }
  55. - (UIImageView *)imageViewForSubview:(UIView *)view currPage:(int)currPage{
  56. UIImageView *dot = nil;
  57. if ([view isKindOfClass:[UIView class]]) {
  58. for (UIView *subview in view.subviews) {
  59. if ([subview isKindOfClass:[UIImageView class]]) {
  60. dot = (UIImageView *)subview;
  61. break;
  62. }
  63. }
  64. if (dot == nil) {
  65. dot = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, view.frame.size.width, view.frame.size.height)];
  66. [view addSubview:dot];
  67. }
  68. }else {
  69. dot = (UIImageView *)view;
  70. }
  71. return dot;
  72. }
  73. - (void)layoutSubviews
  74. {
  75. [super layoutSubviews];
  76. if (self.param.wBannerControlImage&&self.param.wBannerControlSelectImage){
  77. UIImageView *tmp = nil;
  78. for (int i=0; i<[self.subviews count]; i++) {
  79. UIImageView* dot = [self.subviews objectAtIndex:i];
  80. CGFloat x = (tmp?CGRectGetMaxX(tmp.frame):0)+self.param.wBannerControlSelectMargin;
  81. CGFloat y = 0;
  82. if (i == self.currentPage) {
  83. y = (self.bounds.size.height - self.currentImageSize.height)/2;
  84. [dot setFrame:CGRectMake(x, y, self.currentImageSize.width, self.currentImageSize.height)];
  85. }else {
  86. y = (self.bounds.size.height - self.inactiveImageSize.height)/2;
  87. [dot setFrame:CGRectMake(x, y, self.inactiveImageSize.width, self.inactiveImageSize.height)];
  88. }
  89. tmp = dot;
  90. if (i == [self.subviews count]-1) {
  91. CGRect rect = self.frame;
  92. rect.size.width = CGRectGetMaxX(dot.frame);
  93. rect.origin.x = (self.param.wFrame.size.width - rect.size.width)/2;
  94. self.frame = rect;
  95. }
  96. }
  97. [self resetFrame];
  98. }
  99. }
  100. - (void)resetFrame{
  101. for (int i=0; i<[self.subviews count]; i++) {
  102. UIImageView* dot = [self.subviews objectAtIndex:i];
  103. if (i == [self.subviews count]-1) {
  104. CGRect rect = self.frame;
  105. rect.size.width = CGRectGetMaxX(dot.frame);
  106. rect.origin.x = (self.param.wFrame.size.width - rect.size.width)/2;
  107. self.frame = rect;
  108. }
  109. }
  110. if (self.param.wBannerControlPosition == BannerControlLeft) {
  111. CGRect rect = self.frame;
  112. rect.origin.x = 30;
  113. self.frame = rect;
  114. }
  115. if (self.param.wBannerControlPosition == BannerControlRight) {
  116. CGRect rect = self.frame;
  117. rect.origin.x = self.superview.frame.size.width - rect.size.width - 30;
  118. self.frame = rect;
  119. }
  120. if (self.param.wCustomControl) {
  121. self.param.wCustomControl(self);
  122. }
  123. }
  124. @end