MORankCurrentView.m 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. //
  2. // MORankCurrentView.m
  3. // MiMoLive
  4. //
  5. // Created by MiMo on 2025/9/10.
  6. //
  7. #import "MORankCurrentView.h"
  8. #import "MORankBottomButton.h"
  9. @interface MORankCurrentView ()
  10. @property (nonatomic, strong) UIView *contentView;
  11. @property (nonatomic, strong) UIImageView *indexImgView;
  12. @property (nonatomic, strong) UILabel *indexLabel;
  13. @property (nonatomic, strong) UIImageView *avatarImgView;
  14. @property (nonatomic, strong) UILabel *nameLabel;
  15. @property (nonatomic, strong) UIImageView *vipImgView;
  16. @property (nonatomic, strong) MOBaseLevelView *levelImgView;
  17. @property (nonatomic, strong) UIButton *goldNumBtn;
  18. @property (nonatomic, strong) MORankBottomButton *hitButton;
  19. @property (nonatomic, strong) MORankBasedata *dataModel;
  20. @property (nonatomic, strong) MOHeatRankCurrent *heatModel;
  21. @end
  22. @implementation MORankCurrentView
  23. - (instancetype)init {
  24. if (self = [super init]) {
  25. [self setupShadow];
  26. [self setupUI];
  27. }
  28. return self;
  29. }
  30. - (void)setupShadow {
  31. self.backgroundColor = UIColor.clearColor;
  32. // 阴影设置在 self 上
  33. self.layer.shadowColor = [UIColor blackColor].CGColor;
  34. self.layer.shadowOpacity = 0.1;
  35. self.layer.shadowOffset = CGSizeMake(0, 2);
  36. self.layer.shadowRadius = 6;
  37. // 用 contentView 包裹内容,负责圆角
  38. _contentView = [[UIView alloc] init];
  39. _contentView.backgroundColor = UIColor.whiteColor;
  40. _contentView.layer.cornerRadius = 16.0;
  41. if (@available(iOS 11.0, *)) {
  42. _contentView.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner;
  43. }
  44. _contentView.layer.masksToBounds = YES;
  45. [self addSubview:_contentView];
  46. [_contentView mas_makeConstraints:^(MASConstraintMaker *make) {
  47. make.edges.equalTo(self);
  48. }];
  49. }
  50. - (void)setupUI {
  51. [self.contentView addSubview:self.indexLabel];
  52. [self.indexLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  53. make.size.mas_equalTo(CGSizeMake(30, 30));
  54. make.left.mas_equalTo(8);
  55. make.top.mas_equalTo(19);
  56. }];
  57. [self.contentView addSubview:self.indexImgView];
  58. [self.indexImgView mas_makeConstraints:^(MASConstraintMaker *make) {
  59. make.size.mas_equalTo(CGSizeMake(30, 30));
  60. make.left.mas_equalTo(8);
  61. make.top.mas_equalTo(19);
  62. }];
  63. [self.contentView addSubview:self.avatarImgView];
  64. [self.avatarImgView mas_makeConstraints:^(MASConstraintMaker *make) {
  65. make.size.mas_equalTo(CGSizeMake(40, 40));
  66. make.left.mas_equalTo(52);
  67. make.top.mas_equalTo(14);
  68. }];
  69. [self addSubview:self.goldNumBtn];
  70. [self.goldNumBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  71. make.left.mas_equalTo(106);
  72. make.bottom.equalTo(self.avatarImgView);
  73. make.height.mas_equalTo(18);
  74. make.width.mas_greaterThanOrEqualTo(100);
  75. }];
  76. [self addSubview:self.hitButton];
  77. [self.hitButton mas_makeConstraints:^(MASConstraintMaker *make) {
  78. make.centerY.equalTo(self.avatarImgView);
  79. make.right.mas_equalTo(-12);
  80. make.width.mas_equalTo(120);
  81. make.height.mas_equalTo(48);
  82. }];
  83. [self.contentView addSubview:self.nameLabel];
  84. [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  85. make.left.mas_equalTo(106);
  86. make.top.equalTo(self.avatarImgView);
  87. make.height.mas_equalTo(19);
  88. make.width.greaterThanOrEqualTo(@20.0);
  89. }];
  90. [self.contentView addSubview:self.levelImgView];
  91. [self.levelImgView mas_makeConstraints:^(MASConstraintMaker *make) {
  92. make.left.equalTo(self.nameLabel.mas_right).offset(4.0);
  93. make.centerY.equalTo(self.nameLabel);
  94. make.width.equalTo(@(KLevelWidth));
  95. make.height.equalTo(@(MOLevelNormalHeight));
  96. }];
  97. [self.contentView addSubview:self.vipImgView];
  98. [self.vipImgView mas_makeConstraints:^(MASConstraintMaker *make) {
  99. make.left.equalTo(self.levelImgView.mas_right).offset(2.0);
  100. make.centerY.equalTo(self.levelImgView.mas_centerY);
  101. make.width.equalTo(@(MOLevelNormalHeight));
  102. make.height.equalTo(@(MOLevelNormalHeight));
  103. }];
  104. }
  105. - (void)hitButtonAciton {
  106. if (self.hitBlock) {
  107. self.hitBlock(self.dataModel.rankHit);
  108. }
  109. }
  110. //贡献榜UI
  111. - (void)setupContribute:(MORankBasedata *)dataModel {
  112. _dataModel = dataModel;
  113. self.indexLabel.text = [NSString stringWithFormat:@"%.0f", dataModel.rankMe.idx];
  114. if (dataModel.rankMe.idx == -1) {
  115. self.indexLabel.text = @"99+";
  116. } else if (dataModel.rankMe.idx == -2) {
  117. self.indexLabel.text = @"10+";
  118. }
  119. [self.goldNumBtn setImage:[UIImage imageNamed:@"icon_rank_zuan"] forState:UIControlStateNormal];
  120. NSString *goldNumStr = [MOTextTools numberToStringWith:dataModel.rankMe.total];
  121. [self.goldNumBtn setTitle:goldNumStr forState:UIControlStateNormal];
  122. [self.avatarImgView sd_setImageWithURL:[NSURL URLWithString:dataModel.rankMe.user.userProfile.avatar] placeholderImage:[UIImage imageNamed:@"icon_mine_placeHolder"]];
  123. self.indexImgView.hidden = YES;
  124. self.indexLabel.hidden = YES;
  125. if (dataModel.rankMe.idx == 1) {
  126. self.indexImgView.hidden = NO;
  127. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_1"];
  128. } else if (dataModel.rankMe.idx == 2) {
  129. self.indexImgView.hidden = NO;
  130. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_2"];
  131. } else if (dataModel.rankMe.idx == 3) {
  132. self.indexImgView.hidden = NO;
  133. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_3"];
  134. } else {
  135. self.indexLabel.hidden = NO;
  136. }
  137. self.hitButton.hidden = YES;
  138. if (dataModel.rankHit) {
  139. self.hitButton.hidden = NO;
  140. NSString *desc = nil;
  141. if (dataModel.rankHit.hitType == 2) {//去上榜1
  142. desc = NSLocalString(@"C60019");
  143. } else {//去上榜
  144. desc = NSLocalString(@"C60020");
  145. }
  146. [self.hitButton configureWithCount:[NSString stringWithFormat:@"x %@", [MOTextTools numberToStringWith:dataModel.rankHit.hitAmount]] desc:desc isGradient:YES];
  147. [self.hitButton.iconView sd_setImageWithURL:[NSURL URLWithString:dataModel.rankHit.giftImg]];
  148. }
  149. self.levelImgView.levelNum = dataModel.rankMe.user.level;
  150. if(dataModel.rankMe.user.level >= 100){
  151. [self.levelImgView mas_updateConstraints:^(MASConstraintMaker *make) {
  152. make.width.equalTo(@(MOLevelMaxWidth));
  153. }];
  154. }
  155. else{
  156. [self.levelImgView mas_updateConstraints:^(MASConstraintMaker *make) {
  157. make.width.equalTo(@(MOLevelNormalWidth));
  158. }];
  159. }
  160. MOBaseVips *vipObject = [[MOSvgaSourceManage shareManager] toGetTheVipObjectWith:dataModel.rankMe.user.vipType];
  161. if(vipObject.thumbnail.length > 0){
  162. [self.vipImgView sd_setImageWithURL:[NSURL URLWithString:vipObject.thumbnail] placeholderImage:nil];
  163. self.nameLabel.text = [self handleRankNameLabel:dataModel.rankMe.user.userProfile.nickname vip:YES];
  164. }
  165. else{
  166. [self.vipImgView setImage:nil];
  167. self.nameLabel.text = [self handleRankNameLabel:dataModel.rankMe.user.userProfile.nickname vip:NO];
  168. }
  169. }
  170. //收入榜UI
  171. - (void)setupRevenue:(MORankBasedata *)dataModel {
  172. _dataModel = dataModel;
  173. self.indexLabel.text = [NSString stringWithFormat:@"%.0f", dataModel.rankFooter.idx];
  174. if (dataModel.rankFooter.idx == -1) {
  175. self.indexLabel.text = @"99+";
  176. }
  177. [self.goldNumBtn setImage:[UIImage imageNamed:@"icon_rank_gold_bean"] forState:UIControlStateNormal];
  178. NSString *goldNumStr = [MOTextTools numberToStringWith:dataModel.rankFooter.total];
  179. [self.goldNumBtn setTitle:goldNumStr forState:UIControlStateNormal];
  180. [self.avatarImgView sd_setImageWithURL:[NSURL URLWithString:dataModel.rankFooter.userBase.userProfile.avatar] placeholderImage:[UIImage imageNamed:@"icon_mine_placeHolder"]];
  181. self.indexImgView.hidden = YES;
  182. self.indexLabel.hidden = YES;
  183. if (dataModel.rankFooter.idx == 1) {
  184. self.indexImgView.hidden = NO;
  185. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_1"];
  186. } else if (dataModel.rankFooter.idx == 2) {
  187. self.indexImgView.hidden = NO;
  188. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_2"];
  189. } else if (dataModel.rankFooter.idx == 3) {
  190. self.indexImgView.hidden = NO;
  191. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_3"];
  192. } else {
  193. self.indexLabel.hidden = NO;
  194. }
  195. self.hitButton.hidden = YES;
  196. if (dataModel.rankHit) {
  197. self.hitButton.hidden = NO;
  198. NSString *desc = nil;
  199. if (dataModel.rankHit.hitType == 2) {//去上榜1
  200. desc = NSLocalString(@"C60019");
  201. } else {//去上榜
  202. desc = NSLocalString(@"C60020");
  203. }
  204. [self.hitButton configureWithCount:[NSString stringWithFormat:@"x %@", [MOTextTools numberToStringWith:dataModel.rankHit.hitAmount]] desc:desc isGradient:YES];
  205. [self.hitButton.iconView sd_setImageWithURL:[NSURL URLWithString:dataModel.rankHit.giftImg]];
  206. }
  207. self.levelImgView.levelNum = dataModel.rankFooter.userBase.level;
  208. if(dataModel.rankFooter.userBase.level >= 100){
  209. [self.levelImgView mas_updateConstraints:^(MASConstraintMaker *make) {
  210. make.width.equalTo(@(MOLevelMaxWidth));
  211. }];
  212. }
  213. else{
  214. [self.levelImgView mas_updateConstraints:^(MASConstraintMaker *make) {
  215. make.width.equalTo(@(MOLevelNormalWidth));
  216. }];
  217. }
  218. MOBaseVips *vipObject = [[MOSvgaSourceManage shareManager] toGetTheVipObjectWith:dataModel.rankFooter.userBase.vipType];
  219. if(vipObject.thumbnail.length > 0){
  220. [self.vipImgView sd_setImageWithURL:[NSURL URLWithString:vipObject.thumbnail] placeholderImage:nil];
  221. self.nameLabel.text = [self handleRankNameLabel:dataModel.rankFooter.userBase.userProfile.nickname vip:YES];
  222. }
  223. else{
  224. [self.vipImgView setImage:nil];
  225. self.nameLabel.text = [self handleRankNameLabel:dataModel.rankFooter.userBase.userProfile.nickname vip:NO];
  226. }
  227. }
  228. //收益榜和贡献榜复用
  229. - (NSString *)handleRankNameLabel:(NSString *)name vip:(BOOL)vip {
  230. if (self.hitButton.isHidden) {//不显示右下角引导送礼按钮
  231. return [MOTools trimString:name maxLength:12];
  232. }
  233. if (SCREENWIDTH < 400.0 || vip) {
  234. return [MOTools trimString:name maxLength:6];
  235. } else {
  236. return [MOTools trimString:name maxLength:9];
  237. }
  238. }
  239. //热度榜底部UI
  240. - (void)setupHeatRank:(MOHeatRankCurrent *)heatModel {
  241. _heatModel = heatModel;
  242. self.hitButton.hidden = YES;
  243. self.indexLabel.text = [NSString stringWithFormat:@"%zd", heatModel.rank];
  244. if (heatModel.rank == -1) {
  245. self.indexLabel.text = @"99+";
  246. }
  247. [self.goldNumBtn setImage:[UIImage imageNamed:@"icon_rank_heat"] forState:UIControlStateNormal];
  248. NSString *goldNumStr = [MOTextTools numberToStringAboutTwoWith:heatModel.heat];
  249. [self.goldNumBtn setTitle:goldNumStr forState:UIControlStateNormal];
  250. [self.avatarImgView sd_setImageWithURL:[NSURL URLWithString:heatModel.user.userProfile.avatar] placeholderImage:[UIImage imageNamed:@"icon_mine_placeHolder"]];
  251. self.indexImgView.hidden = YES;
  252. self.indexLabel.hidden = YES;
  253. if (heatModel.rank == 1) {
  254. self.indexImgView.hidden = NO;
  255. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_1"];
  256. } else if (heatModel.rank == 2) {
  257. self.indexImgView.hidden = NO;
  258. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_2"];
  259. } else if (heatModel.rank == 3) {
  260. self.indexImgView.hidden = NO;
  261. self.indexImgView.image = [UIImage imageNamed:@"icon_rank_3"];
  262. } else {
  263. self.indexLabel.hidden = NO;
  264. }
  265. self.levelImgView.levelNum = heatModel.user.level;
  266. if(heatModel.user.level >= 100){
  267. [self.levelImgView mas_updateConstraints:^(MASConstraintMaker *make) {
  268. make.width.equalTo(@(MOLevelMaxWidth));
  269. }];
  270. }
  271. else{
  272. [self.levelImgView mas_updateConstraints:^(MASConstraintMaker *make) {
  273. make.width.equalTo(@(MOLevelNormalWidth));
  274. }];
  275. }
  276. MOBaseVips *vipObject = [[MOSvgaSourceManage shareManager] toGetTheVipObjectWith:heatModel.user.vipType];
  277. if(vipObject.thumbnail.length > 0){
  278. [self.vipImgView sd_setImageWithURL:[NSURL URLWithString:vipObject.thumbnail] placeholderImage:nil];
  279. self.nameLabel.text = [self handleHeatRankNameLabel:heatModel.user.userProfile.nickname vip:YES];
  280. }
  281. else{
  282. [self.vipImgView setImage:nil];
  283. self.nameLabel.text = [self handleHeatRankNameLabel:heatModel.user.userProfile.nickname vip:NO];
  284. }
  285. }
  286. //热度榜专用
  287. - (NSString *)handleHeatRankNameLabel:(NSString *)name vip:(BOOL)vip {
  288. if (SCREENWIDTH < 400.0 || vip) {
  289. return [MOTools trimString:name maxLength:13];
  290. } else {
  291. return [MOTools trimString:name maxLength:15];
  292. }
  293. }
  294. #pragma mark - Lazy
  295. - (UILabel *)indexLabel {
  296. if (!_indexLabel) {
  297. _indexLabel = [[UILabel alloc] init];
  298. _indexLabel.textColor = [MOTools colorWithHexString:@"#CDCFD9"];
  299. _indexLabel.font = [MOTextTools boldFont:15];
  300. _indexLabel.textAlignment = NSTextAlignmentCenter;
  301. _indexLabel.adjustsFontSizeToFitWidth = YES;
  302. }
  303. return _indexLabel;
  304. }
  305. - (UIImageView *)indexImgView {
  306. if (!_indexImgView) {
  307. _indexImgView = [[UIImageView alloc] init];
  308. _indexImgView.hidden = YES;
  309. }
  310. return _indexImgView;
  311. }
  312. - (UIImageView *)avatarImgView {
  313. if (!_avatarImgView) {
  314. _avatarImgView = [[UIImageView alloc] init];
  315. _avatarImgView.contentMode = UIViewContentModeScaleAspectFill;
  316. _avatarImgView.layer.masksToBounds = YES;
  317. _avatarImgView.layer.cornerRadius = 20;
  318. }
  319. return _avatarImgView;
  320. }
  321. - (UILabel *)nameLabel {
  322. if (!_nameLabel) {
  323. _nameLabel = [[UILabel alloc] init];
  324. _nameLabel.textColor = kBaseTextColor_1;
  325. _nameLabel.font = [MOTextTools poppinsMediumFont:16];
  326. }
  327. return _nameLabel;
  328. }
  329. - (UIButton *)goldNumBtn{
  330. if (!_goldNumBtn)
  331. {
  332. _goldNumBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  333. _goldNumBtn.backgroundColor = [UIColor clearColor];
  334. // [_goldNumBtn setImage:[UIImage imageNamed:@"icon_rank_gold_bean"] forState:UIControlStateNormal];
  335. // [_goldNumBtn setTitle:@"0" forState:UIControlStateNormal];
  336. _goldNumBtn.titleLabel.font = [MOTextTools mediumFont:12];
  337. _goldNumBtn.titleEdgeInsets = UIEdgeInsetsMake(0, 3.0, 0, 0);
  338. [_goldNumBtn setTitleColor:[MOTools colorWithHexString:@"#5C5E66"] forState:UIControlStateNormal];
  339. _goldNumBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
  340. }
  341. return _goldNumBtn;
  342. }
  343. - (MORankBottomButton *)hitButton {
  344. if (!_hitButton) {
  345. _hitButton = [[MORankBottomButton alloc] initWithFrame:CGRectMake(0, 0, kScaleWidth(168), 48)];
  346. [_hitButton addTarget:self action:@selector(hitButtonAciton) forControlEvents:UIControlEventTouchUpInside];
  347. }
  348. return _hitButton;
  349. }
  350. - (UIImageView *)vipImgView{
  351. if(!_vipImgView){
  352. _vipImgView = [[UIImageView alloc] init];
  353. _vipImgView.contentMode = UIViewContentModeScaleAspectFit;
  354. }
  355. return _vipImgView;
  356. }
  357. - (MOBaseLevelView *)levelImgView{
  358. if(!_levelImgView){
  359. _levelImgView = [[MOBaseLevelView alloc] init];
  360. }
  361. return _levelImgView;
  362. }
  363. @end