YMRankTopView.m 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. //
  2. // YMRankTopView.m
  3. // MSYOUPAI
  4. //
  5. // Created by You on 2024/4/22.
  6. // Copyright © 2024 MS. All rights reserved.
  7. //
  8. #import "YMRankTopView.h"
  9. #define avatarWidth 65
  10. #define avatarWidth2 55
  11. @interface YMRankTopView()
  12. /// 排行榜VM
  13. @property (nonatomic, strong) YMRankingListSubCategoryViewModel *viewModel;
  14. @property (nonatomic, strong) UIImageView *rankingV1;
  15. @property (nonatomic, strong) UIImageView *rankingV2;
  16. @property (nonatomic, strong) UIImageView *rankingV3;
  17. @property (nonatomic, strong) UIImageView *avatarFrame1;
  18. @property (nonatomic, strong) UIImageView *avatarFrame2;
  19. @property (nonatomic, strong) UIImageView *avatarFrame3;
  20. @property (nonatomic, strong) UIImageView *avatarImgv1;
  21. @property (nonatomic, strong) UIImageView *avatarImgv2;
  22. @property (nonatomic, strong) UIImageView *avatarImgv3;
  23. //@property (nonatomic, strong) UIView *detailOneView;
  24. //@property (nonatomic, strong) UIView *detailTwoView;
  25. //@property (nonatomic, strong) UIView *detailThreeView;
  26. @property (nonatomic, strong) UILabel *userL1;
  27. @property (nonatomic, strong) UILabel *distanceL1;
  28. @property (nonatomic, strong) UILabel *userL2;
  29. @property (nonatomic, strong) UILabel *distanceL2;
  30. @property (nonatomic, strong) UILabel *userL3;
  31. @property (nonatomic, strong) UILabel *distanceL3;
  32. /// 遮罩视图
  33. @property (nonatomic, strong) UIView *maskView2;
  34. @end
  35. @implementation YMRankTopView
  36. - (void)ym_setupViews{
  37. [self addSubview:self.maskView2];
  38. [self addSubview:self.rankingV1];
  39. [self addSubview:self.rankingV2];
  40. [self addSubview:self.rankingV3];
  41. [self addSubview:self.avatarImgv1];
  42. [self addSubview:self.avatarImgv2];
  43. [self addSubview:self.avatarImgv3];
  44. [self addSubview:self.avatarFrame1];
  45. [self addSubview:self.avatarFrame2];
  46. [self addSubview:self.avatarFrame3];
  47. [self addSubview:self.userL1];
  48. [self addSubview:self.userL2];
  49. [self addSubview:self.userL3];
  50. [self addSubview:self.distanceL1];
  51. [self addSubview:self.distanceL2];
  52. [self addSubview:self.distanceL3];
  53. [self setNeedsUpdateConstraints];
  54. [self updateConstraintsIfNeeded];
  55. }
  56. - (void)updateConstraints{
  57. [self.maskView2 mas_makeConstraints:^(MASConstraintMaker *make) {
  58. make.left.equalTo(self).offset(20);
  59. make.right.equalTo(self).offset(-20);
  60. make.bottom.equalTo(self);
  61. make.height.mas_equalTo(adapt(0.1));
  62. }];
  63. [self.rankingV1 mas_makeConstraints:^(MASConstraintMaker *make) {
  64. make.centerX.equalTo(self);
  65. make.bottom.equalTo(self.maskView2.mas_top);
  66. make.width.mas_equalTo(adapt(120));
  67. make.height.mas_equalTo(adapt(115));
  68. }];
  69. [self.rankingV2 mas_makeConstraints:^(MASConstraintMaker *make) {
  70. make.right.equalTo(self.rankingV1.mas_left).offset(adapt(-10));
  71. make.bottom.equalTo(self.rankingV1);
  72. make.width.mas_equalTo(adapt(100));
  73. make.height.mas_equalTo(adapt(85));
  74. }];
  75. [self.rankingV3 mas_makeConstraints:^(MASConstraintMaker *make) {
  76. make.left.equalTo(self.rankingV1.mas_right).offset(adapt(10));
  77. make.bottom.equalTo(self.rankingV1);
  78. make.width.mas_equalTo(adapt(100));
  79. make.height.mas_equalTo(adapt(85));
  80. }];
  81. [self.avatarImgv1 mas_makeConstraints:^(MASConstraintMaker *make) {
  82. make.bottom.equalTo(self.rankingV1.mas_top).offset(adapt(-30));
  83. make.centerX.equalTo(self.rankingV1);
  84. make.width.height.mas_equalTo(adapt(avatarWidth));
  85. }];
  86. [self.avatarFrame1 mas_makeConstraints:^(MASConstraintMaker *make) {
  87. make.center.equalTo(self.avatarImgv1);
  88. make.width.mas_equalTo(adapt(83));
  89. make.height.mas_equalTo(adapt(93));
  90. }];
  91. [self.avatarImgv2 mas_makeConstraints:^(MASConstraintMaker *make) {
  92. make.bottom.equalTo(self.rankingV2.mas_top).offset(adapt(-30));
  93. make.centerX.equalTo(self.rankingV2);
  94. make.width.height.mas_equalTo(adapt(avatarWidth2));
  95. }];
  96. [self.avatarFrame2 mas_makeConstraints:^(MASConstraintMaker *make) {
  97. make.center.equalTo(self.avatarImgv2);
  98. make.width.height.mas_equalTo(adapt(70));
  99. }];
  100. [self.avatarImgv3 mas_makeConstraints:^(MASConstraintMaker *make) {
  101. make.bottom.equalTo(self.rankingV3.mas_top).offset(adapt(-30));
  102. make.centerX.equalTo(self.rankingV3);
  103. make.width.height.mas_equalTo(adapt(avatarWidth2));
  104. }];
  105. [self.avatarFrame3 mas_makeConstraints:^(MASConstraintMaker *make) {
  106. make.center.equalTo(self.avatarImgv3);
  107. make.width.height.mas_equalTo(adapt(70));
  108. }];
  109. // 1
  110. [self.userL1 mas_makeConstraints:^(MASConstraintMaker *make) {
  111. make.centerX.equalTo(self.rankingV1);
  112. make.centerY.equalTo(self.rankingV1.mas_top).offset(adapt(0));
  113. make.leading.trailing.equalTo(self.rankingV1);
  114. }];
  115. [self.distanceL1 mas_makeConstraints:^(MASConstraintMaker *make) {
  116. make.centerX.equalTo(self.rankingV1);
  117. make.top.equalTo(self.rankingV1.mas_top).offset(adapt(23));
  118. make.leading.trailing.equalTo(self.rankingV1);
  119. }];
  120. // 2
  121. [self.userL2 mas_makeConstraints:^(MASConstraintMaker *make) {
  122. make.centerX.equalTo(self.rankingV2);
  123. make.centerY.equalTo(self.rankingV2.mas_top).offset(adapt(0));
  124. make.leading.trailing.equalTo(self.rankingV2);
  125. }];
  126. [self.distanceL2 mas_makeConstraints:^(MASConstraintMaker *make) {
  127. make.centerX.equalTo(self.rankingV2);
  128. make.top.equalTo(self.rankingV2.mas_top).offset(adapt(23));
  129. make.leading.trailing.equalTo(self.rankingV2);
  130. }];
  131. // 3
  132. [self.userL3 mas_makeConstraints:^(MASConstraintMaker *make) {
  133. make.centerX.equalTo(self.rankingV3);
  134. make.centerY.equalTo(self.rankingV3.mas_top).offset(adapt(0));
  135. make.leading.trailing.equalTo(self.rankingV3);
  136. }];
  137. [self.distanceL3 mas_makeConstraints:^(MASConstraintMaker *make) {
  138. make.centerX.equalTo(self.rankingV3);
  139. make.top.equalTo(self.rankingV3.mas_top).offset(adapt(23));
  140. make.leading.trailing.equalTo(self.rankingV3);
  141. }];
  142. [super updateConstraints];
  143. }
  144. - (void)ym_bindViewModel:(YMRankingListSubCategoryViewModel*)viewModel{
  145. if (!viewModel) {
  146. return;
  147. }
  148. _viewModel = viewModel;
  149. @weakify(self)
  150. [[[[RACObserve(self.viewModel, rankingOneUser) distinctUntilChanged] deliverOnMainThread] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(YMRankingListCellViewModel * VM) {
  151. @strongify(self)
  152. if (VM == nil || [VM isKindOfClass:[NSNull class]]) {
  153. self.avatarFrame1.hidden = YES;
  154. } else {
  155. if (!OCStringIsEmpty(VM.rankingUserAvatar)) {
  156. [self.avatarImgv1 sd_setImageWithURL:[LCTools getImageUrlWithAddress:VM.rankingUserAvatar] placeholderImage: ImageByName(@"ym_ranking_avatar_default")];
  157. }
  158. if (!OCStringIsEmpty(VM.rankingUserNickname)) {
  159. self.userL1.text = VM.rankingUserNickname;
  160. }
  161. if (!OCStringIsEmpty(VM.rankingUserRankingDifference)) {
  162. self.distanceL1.text = VM.rankingUserRankingDifference;
  163. }
  164. self.avatarFrame1.hidden = NO;
  165. }
  166. }];
  167. [[[[RACObserve(self.viewModel, rankingTwoUser) distinctUntilChanged] deliverOnMainThread] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(YMRankingListCellViewModel * VM) {
  168. @strongify(self)
  169. if (VM == nil || [VM isKindOfClass:[NSNull class]]) {
  170. self.avatarFrame2.hidden = YES;
  171. } else {
  172. if (!OCStringIsEmpty(VM.rankingUserAvatar)) {
  173. [self.avatarImgv2 sd_setImageWithURL:[LCTools getImageUrlWithAddress:VM.rankingUserAvatar] placeholderImage: ImageByName(@"ym_ranking_avatar_default")];
  174. }
  175. if (!OCStringIsEmpty(VM.rankingUserNickname)) {
  176. self.userL2.text = VM.rankingUserNickname;
  177. }
  178. if (!OCStringIsEmpty(VM.rankingUserRankingDifference)) {
  179. self.distanceL2.text = VM.rankingUserRankingDifference;
  180. }
  181. self.avatarFrame2.hidden = NO;
  182. }
  183. }];
  184. [[[[RACObserve(self.viewModel, rankingThreeUser) distinctUntilChanged] deliverOnMainThread] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(YMRankingListCellViewModel * VM) {
  185. @strongify(self)
  186. if (VM == nil || [VM isKindOfClass:[NSNull class]]) {
  187. self.avatarFrame3.hidden = YES;
  188. } else {
  189. if (!OCStringIsEmpty(VM.rankingUserAvatar)) {
  190. [self.avatarImgv3 sd_setImageWithURL:[LCTools getImageUrlWithAddress:VM.rankingUserAvatar] placeholderImage: ImageByName(@"ym_ranking_avatar_default")];
  191. }
  192. if (!OCStringIsEmpty(VM.rankingUserNickname)) {
  193. self.userL3.text = VM.rankingUserNickname;
  194. }
  195. if (!OCStringIsEmpty(VM.rankingUserRankingDifference)) {
  196. self.distanceL3.text = VM.rankingUserRankingDifference;
  197. }
  198. self.avatarFrame3.hidden = NO;
  199. }
  200. }];
  201. }
  202. - (UIImageView *)rankingV1{
  203. if (!_rankingV1) {
  204. _rankingV1 = [[UIImageView alloc]init];
  205. _rankingV1.image = ImageByName(@"ym_ranking_one_booth");
  206. }
  207. return _rankingV1;
  208. }
  209. - (UIImageView *)rankingV2{
  210. if (!_rankingV2) {
  211. _rankingV2 = [[UIImageView alloc]init];
  212. _rankingV2.image = ImageByName(@"ym_ranking_two_booth");
  213. }
  214. return _rankingV2;
  215. }
  216. - (UIImageView *)rankingV3{
  217. if (!_rankingV3) {
  218. _rankingV3 = [[UIImageView alloc]init];
  219. _rankingV3.image = ImageByName(@"ym_ranking_three_booth");
  220. }
  221. return _rankingV3;
  222. }
  223. - (UIView *)maskView2{
  224. if (!_maskView2) {
  225. _maskView2 = [[UIView alloc]init];
  226. _maskView2.backgroundColor = UIColor.clearColor;
  227. [_maskView2 addRectCorner:UIRectCornerTopLeft|UIRectCornerTopRight radius:20];
  228. }
  229. return _maskView2;
  230. }
  231. - (UIImageView *)avatarImgv1{
  232. if (!_avatarImgv1) {
  233. _avatarImgv1 = [[UIImageView alloc]init];
  234. _avatarImgv1.contentMode = UIViewContentModeScaleAspectFill;
  235. _avatarImgv1.backgroundColor = UIColor.lightGrayColor;
  236. _avatarImgv1.userInteractionEnabled = true;
  237. _avatarImgv1.image = ImageByName(@"ym_ranking_avatar_default");
  238. [_avatarImgv1 addRectCorner:UIRectCornerAllCorners radius:avatarWidth/2];
  239. }
  240. return _avatarImgv1;
  241. }
  242. - (UIImageView *)avatarImgv2{
  243. if (!_avatarImgv2) {
  244. _avatarImgv2 = [[UIImageView alloc]init];
  245. _avatarImgv2.contentMode = UIViewContentModeScaleAspectFill;
  246. _avatarImgv2.backgroundColor = UIColor.lightGrayColor;
  247. _avatarImgv2.userInteractionEnabled = true;
  248. _avatarImgv2.image = ImageByName(@"ym_ranking_avatar_default");
  249. [_avatarImgv2 addRectCorner:UIRectCornerAllCorners radius:avatarWidth2/2];
  250. }
  251. return _avatarImgv2;
  252. }
  253. - (UIImageView *)avatarImgv3{
  254. if (!_avatarImgv3) {
  255. _avatarImgv3 = [[UIImageView alloc]init];
  256. _avatarImgv3.contentMode = UIViewContentModeScaleAspectFill;
  257. _avatarImgv3.userInteractionEnabled = true;
  258. _avatarImgv3.backgroundColor = UIColor.lightGrayColor;
  259. _avatarImgv3.image = ImageByName(@"ym_ranking_avatar_default");
  260. [_avatarImgv3 addRectCorner:UIRectCornerAllCorners radius:avatarWidth2/2];
  261. }
  262. return _avatarImgv3;
  263. }
  264. - (UIImageView *)avatarFrame1{
  265. if (!_avatarFrame1) {
  266. _avatarFrame1 = [[UIImageView alloc]init];
  267. _avatarFrame1.image = ImageByName(@"ym_ranking_avatar_one_pendant");
  268. _avatarFrame1.userInteractionEnabled = true;
  269. WS(weakSelf)
  270. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
  271. [_avatarFrame1 addGestureRecognizer:tap];
  272. [[[tap rac_gestureSignal] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {
  273. [weakSelf.viewModel.gotoPersonalPageSubject sendNext:@(self.viewModel.rankingOneUser.rankingUserId)];
  274. }];
  275. }
  276. return _avatarFrame1;
  277. }
  278. - (UIImageView *)avatarFrame2{
  279. if (!_avatarFrame2) {
  280. _avatarFrame2 = [[UIImageView alloc]init];
  281. _avatarFrame2.image = ImageByName(@"ym_ranking_avatar_two_pendant");
  282. _avatarFrame2.userInteractionEnabled = true;
  283. WS(weakSelf)
  284. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
  285. [_avatarFrame2 addGestureRecognizer:tap];
  286. [[[tap rac_gestureSignal] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {
  287. [weakSelf.viewModel.gotoPersonalPageSubject sendNext:@(self.viewModel.rankingTwoUser.rankingUserId)];
  288. }];
  289. }
  290. return _avatarFrame2;
  291. }
  292. - (UIImageView *)avatarFrame3{
  293. if (!_avatarFrame3) {
  294. _avatarFrame3 = [[UIImageView alloc]init];
  295. _avatarFrame3.image = ImageByName(@"ym_ranking_avatar_three_pendant");
  296. _avatarFrame3.userInteractionEnabled = true;
  297. WS(weakSelf)
  298. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
  299. [_avatarFrame3 addGestureRecognizer:tap];
  300. [[[tap rac_gestureSignal] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {
  301. [weakSelf.viewModel.gotoPersonalPageSubject sendNext:@(self.viewModel.rankingThreeUser.rankingUserId)];
  302. }];
  303. }
  304. return _avatarFrame3;
  305. }
  306. //- (UIView *)detailOneView{
  307. // if (!_detailOneView) {
  308. // _detailOneView = [[UIView alloc]init];
  309. // }
  310. // return _detailOneView;
  311. //}
  312. //- (UIView *)detailTwoView{
  313. // if (!_detailTwoView) {
  314. // _detailTwoView = [[UIView alloc]init];
  315. // }
  316. // return _detailTwoView;
  317. //}
  318. //
  319. //- (UIView *)detailThreeView{
  320. // if (!_detailThreeView) {
  321. // _detailThreeView = [[UIView alloc]init];
  322. // }
  323. // return _detailThreeView;
  324. //}
  325. - (UILabel *)userL1{
  326. if (!_userL1) {
  327. _userL1 = [[UILabel alloc]init];
  328. _userL1.font = LCFont(13);
  329. _userL1.textColor = HexColorFromRGB(0x000000);
  330. _userL1.textAlignment = NSTextAlignmentCenter;
  331. _userL1.text = @"******";
  332. }
  333. return _userL1;
  334. }
  335. - (UILabel *)userL2{
  336. if (!_userL2) {
  337. _userL2 = [[UILabel alloc]init];
  338. _userL2.font = LCFont(13);
  339. _userL2.textColor = HexColorFromRGB(0x000000);
  340. _userL2.textAlignment = NSTextAlignmentCenter;
  341. _userL2.text = @"******";
  342. }
  343. return _userL2;
  344. }
  345. - (UILabel *)userL3{
  346. if (!_userL3) {
  347. _userL3 = [[UILabel alloc]init];
  348. _userL3.font = LCFont(13);
  349. _userL3.textColor = HexColorFromRGB(0x000000);
  350. _userL3.textAlignment = NSTextAlignmentCenter;
  351. _userL3.text = @"******";
  352. }
  353. return _userL3;
  354. }
  355. - (UILabel *)distanceL1{
  356. if (!_distanceL1) {
  357. _distanceL1 = [[UILabel alloc]init];
  358. _distanceL1.font = LCFont(10);
  359. _distanceL1.textColor = HexColorFromRGBA(0x000000,0.5);
  360. _distanceL1.textAlignment = NSTextAlignmentCenter;
  361. _distanceL1.text = @"距离上名 ****";
  362. }
  363. return _distanceL1;
  364. }
  365. - (UILabel *)distanceL2{
  366. if (!_distanceL2) {
  367. _distanceL2 = [[UILabel alloc]init];
  368. _distanceL2.font = LCFont(10);
  369. _distanceL2.textColor = HexColorFromRGBA(0x000000,0.5);
  370. _distanceL2.textAlignment = NSTextAlignmentCenter;
  371. _distanceL2.text = @"距离上名 ****";
  372. }
  373. return _distanceL2;
  374. }
  375. - (UILabel *)distanceL3{
  376. if (!_distanceL3) {
  377. _distanceL3 = [[UILabel alloc]init];
  378. _distanceL3.font = LCFont(10);
  379. _distanceL3.textColor = HexColorFromRGBA(0x000000,0.5);
  380. _distanceL3.textAlignment = NSTextAlignmentCenter;
  381. _distanceL3.text = @"距离上名 ****";
  382. }
  383. return _distanceL3;
  384. }
  385. @end