JXCategoryTitleImageCell.m 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // JXCategoryImageCell.m
  3. // JXCategoryView
  4. //
  5. // Created by jiaxin on 2018/8/8.
  6. // Copyright © 2018年 jiaxin. All rights reserved.
  7. //
  8. #import "JXCategoryTitleImageCell.h"
  9. #import "JXCategoryTitleImageCellModel.h"
  10. @interface JXCategoryTitleImageCell()
  11. @property (nonatomic, strong) NSString *currentImageName;
  12. @property (nonatomic, strong) NSURL *currentImageURL;
  13. @end
  14. @implementation JXCategoryTitleImageCell
  15. - (void)prepareForReuse {
  16. [super prepareForReuse];
  17. self.currentImageName = nil;
  18. self.currentImageURL = nil;
  19. }
  20. - (void)initializeViews {
  21. [super initializeViews];
  22. _imageView = [[UIImageView alloc] init];
  23. _imageView.contentMode = UIViewContentModeScaleAspectFit;
  24. [self.contentView addSubview:_imageView];
  25. }
  26. - (void)layoutSubviews {
  27. [super layoutSubviews];
  28. JXCategoryTitleImageCellModel *myCellModel = (JXCategoryTitleImageCellModel *)self.cellModel;
  29. self.titleLabel.hidden = NO;
  30. self.imageView.hidden = NO;
  31. CGSize imageSize = myCellModel.imageSize;
  32. self.imageView.bounds = CGRectMake(0, 0, imageSize.width, imageSize.height);
  33. switch (myCellModel.imageType) {
  34. case JXCategoryTitleImageType_TopImage:
  35. {
  36. CGFloat contentHeight = imageSize.height + myCellModel.titleImageSpacing + self.titleLabel.bounds.size.height;
  37. self.imageView.center = CGPointMake(self.contentView.center.x, (self.contentView.bounds.size.height - contentHeight)/2 + imageSize.height/2);
  38. [self refreshTitleLabelCenter:CGPointMake(self.contentView.center.x, CGRectGetMaxY(self.imageView.frame) + myCellModel.titleImageSpacing + self.titleLabel.bounds.size.height/2)];
  39. }
  40. break;
  41. case JXCategoryTitleImageType_LeftImage:
  42. {
  43. CGFloat contentWidth = imageSize.width + myCellModel.titleImageSpacing + self.titleLabel.bounds.size.width;
  44. self.imageView.center = CGPointMake((self.contentView.bounds.size.width - contentWidth)/2 + imageSize.width/2, self.contentView.center.y);
  45. [self refreshTitleLabelCenter:CGPointMake(CGRectGetMaxX(self.imageView.frame) + myCellModel.titleImageSpacing + self.titleLabel.bounds.size.width/2, self.contentView.center.y)];
  46. }
  47. break;
  48. case JXCategoryTitleImageType_BottomImage:
  49. {
  50. CGFloat contentHeight = imageSize.height + myCellModel.titleImageSpacing + self.titleLabel.bounds.size.height;
  51. [self refreshTitleLabelCenter:CGPointMake(self.contentView.center.x, (self.contentView.bounds.size.height - contentHeight)/2 + self.titleLabel.bounds.size.height/2)];
  52. self.imageView.center = CGPointMake(self.contentView.center.x, CGRectGetMaxY(self.titleLabel.frame) + myCellModel.titleImageSpacing + imageSize.height/2);
  53. }
  54. break;
  55. case JXCategoryTitleImageType_RightImage:
  56. {
  57. CGFloat contentWidth = imageSize.width + myCellModel.titleImageSpacing + self.titleLabel.bounds.size.width;
  58. [self refreshTitleLabelCenter:CGPointMake((self.contentView.bounds.size.width - contentWidth)/2 + self.titleLabel.bounds.size.width/2, self.contentView.center.y)];
  59. self.imageView.center = CGPointMake(CGRectGetMaxX(self.titleLabel.frame) + myCellModel.titleImageSpacing + imageSize.width/2, self.contentView.center.y);
  60. }
  61. break;
  62. case JXCategoryTitleImageType_OnlyImage:
  63. {
  64. self.titleLabel.hidden = YES;
  65. self.imageView.center = self.contentView.center;
  66. }
  67. break;
  68. case JXCategoryTitleImageType_OnlyTitle:
  69. {
  70. self.imageView.hidden = YES;
  71. [self refreshTitleLabelCenter:self.contentView.center];
  72. }
  73. break;
  74. default:
  75. break;
  76. }
  77. }
  78. - (void)refreshTitleLabelCenter:(CGPoint)center {
  79. JXCategoryTitleImageCellModel *myCellModel = (JXCategoryTitleImageCellModel *)self.cellModel;
  80. if (myCellModel.titleLabelAnchorPointStyle == JXCategoryTitleLabelAnchorPointStyleBottom) {
  81. center.y += (self.titleLabel.bounds.size.height/2 + myCellModel.titleLabelVerticalOffset);
  82. }else if (myCellModel.titleLabelAnchorPointStyle == JXCategoryTitleLabelAnchorPointStyleTop) {
  83. center.y -= (self.titleLabel.bounds.size.height/2 + myCellModel.titleLabelVerticalOffset);
  84. }
  85. self.titleLabel.center = center;
  86. }
  87. - (void)reloadData:(JXCategoryBaseCellModel *)cellModel {
  88. [super reloadData:cellModel];
  89. JXCategoryTitleImageCellModel *myCellModel = (JXCategoryTitleImageCellModel *)cellModel;
  90. //因为`- (void)reloadData:(JXCategoryBaseCellModel *)cellModel`方法会回调多次,尤其是左右滚动的时候会调用无数次,如果每次都触发图片加载,会非常消耗性能。所以只会在图片发生了变化的时候,才进行图片加载。
  91. NSString *currentImageName = nil;
  92. NSURL *currentImageURL = nil;
  93. if (myCellModel.imageName != nil) {
  94. currentImageName = myCellModel.imageName;
  95. }else if (myCellModel.imageURL != nil) {
  96. currentImageURL = myCellModel.imageURL;
  97. }
  98. if (myCellModel.isSelected) {
  99. if (myCellModel.selectedImageName != nil) {
  100. currentImageName = myCellModel.selectedImageName;
  101. }else if (myCellModel.selectedImageURL != nil) {
  102. currentImageURL = myCellModel.selectedImageURL;
  103. }
  104. }
  105. if (currentImageName != nil && ![currentImageName isEqualToString:self.currentImageName]) {
  106. self.currentImageName = currentImageName;
  107. self.imageView.image = [UIImage imageNamed:currentImageName];
  108. }else if (currentImageURL != nil && ![currentImageURL.absoluteString isEqualToString:self.currentImageURL.absoluteString]) {
  109. self.currentImageURL = currentImageURL;
  110. if (myCellModel.loadImageCallback != nil) {
  111. myCellModel.loadImageCallback(self.imageView, currentImageURL);
  112. }
  113. }
  114. if (myCellModel.isImageZoomEnabled) {
  115. self.imageView.transform = CGAffineTransformMakeScale(myCellModel.imageZoomScale, myCellModel.imageZoomScale);
  116. }else {
  117. self.imageView.transform = CGAffineTransformIdentity;
  118. }
  119. [self setNeedsLayout];
  120. }
  121. @end