RQExamResultViewController.m 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. //
  2. // RQExamResultViewController.m
  3. // jiaPei
  4. //
  5. // Created by 张嵘 on 2022/7/26.
  6. // Copyright © 2022 JCZ. All rights reserved.
  7. //
  8. #import "RQExamResultViewController.h"
  9. @interface RQExamResultViewController ()
  10. /// viewModel
  11. @property (nonatomic, readonly, strong) RQExamResultViewModel *viewModel;
  12. @property (nonatomic, readwrite, strong) RQExamResultHeaderView *examResultHeaderView;
  13. @property (nonatomic, readwrite, strong) QMUINavigationBarScrollingAnimator *navigationAnimator;
  14. /// 返回按钮
  15. @property (nonatomic, readwrite, strong) UIBarButtonItem *backItem;
  16. @property (nonatomic, readwrite, strong) UIBarButtonItem *examResultListItem;
  17. @end
  18. @implementation RQExamResultViewController
  19. @dynamic viewModel;
  20. #pragma mark - SystemMethod
  21. - (void)viewDidLoad {
  22. [super viewDidLoad];
  23. @weakify(self)
  24. [self.navigationItem setLeftBarButtonItems:@[self.backItem]];
  25. [self.collectionView addSubview:self.examResultHeaderView];
  26. NSInteger totalNum = RQObjectIsNil(self.viewModel.questionArr)? 0 : self.viewModel.questionArr.count;
  27. NSInteger errorNum = RQObjectIsNil(self.viewModel.errorArr)? 0 : self.viewModel.errorArr.count;
  28. NSInteger rightNum = RQObjectIsNil(self.viewModel.correctArr)? 0 : self.viewModel.correctArr.count;
  29. NSInteger hasdoNum = errorNum + rightNum;
  30. NSInteger undoNum = totalNum - hasdoNum;
  31. NSInteger perScore = 100 / totalNum;
  32. NSInteger score = rightNum * perScore;
  33. // NSUInteger sec = RQ_Exercise_Module.count%60;
  34. // NSUInteger min = RQ_Exercise_Module.count/60;
  35. CGFloat progress = (hasdoNum * 1.00) / (totalNum * 1.00);
  36. __block BOOL isSuccess = (score >= 90);
  37. self.examResultHeaderView.scoreLabel.text = [NSString qmui_stringWithNSInteger:score];
  38. self.examResultHeaderView.unDoLabel.text = [NSString qmui_stringWithNSInteger:undoNum];
  39. self.examResultHeaderView.errorLabel.text = [NSString qmui_stringWithNSInteger:errorNum];
  40. self.examResultHeaderView.myProgressView.progress = progress;
  41. self.examResultHeaderView.resultLabel.text = isSuccess? @"合格" : @"不合格";
  42. self.examResultHeaderView.resultDscLabel.text = isSuccess? @"恭喜,考试合格" : @"很遗憾,考试不合格";
  43. self.examResultHeaderView.resultBtn.selected = isSuccess;
  44. self.examResultHeaderView.bgImageView.image = RQImageNamed(isSuccess? @"考试成绩背景图绿" : @"考试成绩背景图");
  45. [self.examResultHeaderView.fastUpBtn setBackgroundImage:[UIImage imageWithGradualChangingColor:^(QQGradualChangingColor *graColor) {
  46. graColor.fromColor = RQColorFromHexString(isSuccess? @"#01C18D" : @"#FF4C52");
  47. graColor.toColor = RQColorFromHexString(isSuccess? @"#3ED2AA" : @"#FC8269");
  48. graColor.type = QQGradualChangeTypeLeftToRight;
  49. } size:CGSizeMake(RQ_FIT_HORIZONTAL(76.f), RQ_FIT_HORIZONTAL(30.f)) cornerRadius:QQRadiusMakeSame(RQ_FIT_HORIZONTAL(30.f) / 2.f)] forState:UIControlStateNormal];
  50. self.examResultHeaderView.myProgressView.layer.shadowColor = isSuccess? RGBA_COLOR(26, 168, 130, 0.2).CGColor : RGBA_COLOR(193, 16, 16, 0.2).CGColor;
  51. self.navigationAnimator = [[QMUINavigationBarScrollingAnimator alloc] init];
  52. self.navigationAnimator.scrollView = self.collectionView;// 指定要关联的 scrollView
  53. self.navigationAnimator.offsetYToStartAnimation = 30;// 设置滚动的起点,值即表示在默认停靠的位置往下滚动多少距离后即触发动画,默认是 0
  54. self.navigationAnimator.distanceToStopAnimation = 64;// 设置从起点开始滚动多长的距离达到终点
  55. self.navigationAnimator.backgroundImageBlock = ^UIImage * _Nonnull(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) {
  56. return [[UIImage qmui_imageWithColor:RQColorFromHexString(isSuccess? @"#01C18D" : @"#FF4C52") size:CGSizeMake(RQ_SCREEN_WIDTH, RQ_APPLICATION_NAV_BAR_HEIGHT) cornerRadius:0] qmui_imageWithAlpha:progress];
  57. };
  58. self.navigationAnimator.shadowImageBlock = ^UIImage * _Nonnull(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) {
  59. return [NavBarShadowImage qmui_imageWithAlpha:progress];
  60. };
  61. self.navigationAnimator.tintColorBlock = ^UIColor * _Nonnull(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) {
  62. return [UIColor qmui_colorFromColor:UIColorWhite toColor:UIColorWhite progress:progress];
  63. };
  64. self.navigationAnimator.titleViewTintColorBlock = self.navigationAnimator.tintColorBlock;
  65. self.navigationAnimator.statusbarStyleBlock = ^UIStatusBarStyle(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) {
  66. return progress < .25 ? UIStatusBarStyleDefault : UIStatusBarStyleLightContent;
  67. };
  68. }
  69. - (void)viewDidLayoutSubviews {
  70. [super viewDidLayoutSubviews];
  71. self.collectionView.frame = CGRectMake(0, 0, RQ_SCREEN_WIDTH, RQ_SCREEN_HEIGHT - RQ_APPLICATION_SAFEAREA_BOTTOM_HEIGHT);
  72. self.examResultHeaderView.frame = CGRectMake(0, - RQ_FIT_HORIZONTAL(350.f), RQ_SCREEN_WIDTH, RQ_FIT_HORIZONTAL(350.f));
  73. }
  74. - (void)gotoExamResultList {
  75. NSArray *arr = @[];
  76. if (RQ_YDTQuestion_Module.subject == RQHomePageSubjectType_SubjectOne) {
  77. arr = RQObjectIsNil(RQ_COMMON_MANAGER.examResultOneListArr)? @[] : RQ_COMMON_MANAGER.examResultOneListArr;
  78. } else if (RQ_YDTQuestion_Module.subject == RQHomePageSubjectType_SubjectFour) {
  79. arr = RQObjectIsNil(RQ_COMMON_MANAGER.examResultFourListArr)? @[] : RQ_COMMON_MANAGER.examResultFourListArr;
  80. }
  81. RQExamProbabilityViewModel *examProbabilityViewModel = [[RQExamProbabilityViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:@{
  82. RQViewModelUtilKey : arr,
  83. }];
  84. [RQ_APPDELEGATE.services pushViewModel:examProbabilityViewModel animated:YES];
  85. }
  86. #pragma mark - OverrideMethods
  87. - (UIEdgeInsets)contentInset {
  88. return UIEdgeInsetsMake(RQ_FIT_HORIZONTAL(350.f), 0, 0, 0);
  89. }
  90. - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath {
  91. RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section];
  92. RQCommonCollectionItemViewModel *itemViewModel = groupViewModel.itemViewModels[indexPath.row];
  93. return [NSClassFromString(itemViewModel.itemClassName) cellWithCollectionView:collectionView forIndexPath:indexPath];
  94. }
  95. - (void)configureCell:(RQCommonCollectionViewCell *)cell atIndexPath:(NSIndexPath *)indexPath withObject:(id)object {
  96. [cell bindViewModel:object];
  97. }
  98. - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
  99. return UIEdgeInsetsZero;
  100. }
  101. - (UIStatusBarStyle)preferredStatusBarStyle {
  102. // 需要手动调用 navigationAnimator.statusbarStyleBlock 来告诉系统状态栏的变化
  103. if (self.navigationAnimator) {
  104. return self.navigationAnimator.statusbarStyleBlock(self.navigationAnimator, self.navigationAnimator.progress);
  105. }
  106. return [super preferredStatusBarStyle];
  107. }
  108. // 建议配合 QMUINavigationControllerAppearanceDelegate 控制不同界面切换时的 navigationBar 样式,否则需自己在 viewWillAppear:、viewWillDisappear: 里控制
  109. #pragma mark - <QMUINavigationControllerAppearanceDelegate>
  110. - (UIImage *)qmui_navigationBarBackgroundImage {
  111. return self.navigationAnimator.backgroundImageBlock(self.navigationAnimator, self.navigationAnimator.progress);
  112. }
  113. - (UIImage *)qmui_navigationBarShadowImage {
  114. return self.navigationAnimator.shadowImageBlock(self.navigationAnimator, self.navigationAnimator.progress);
  115. }
  116. - (UIColor *)qmui_navigationBarTintColor {
  117. return self.navigationAnimator.tintColorBlock(self.navigationAnimator, self.navigationAnimator.progress);
  118. }
  119. - (UIColor *)qmui_titleViewTintColor {
  120. return [self qmui_navigationBarTintColor];
  121. }
  122. #pragma mark - <QMUICustomNavigationBarTransitionDelegate>
  123. // 为了展示接口的使用,QMUI Demo 没有打开配置表的 AutomaticCustomNavigationBarTransitionStyle,因此当 navigationBar 样式与默认样式不同时,需要手动在 customNavigationBarTransitionKey 里返回一个与其他界面不相同的值,这样才能使用自定义的 navigationBar 转场样式
  124. - (NSString *)customNavigationBarTransitionKey {
  125. return self.navigationAnimator.progress >= 1 ? nil : @"progress";
  126. }
  127. - (void)rq_back{ /// 返回按钮事件处理
  128. [self.viewModel.services popToRootViewModelAnimated:YES];
  129. }
  130. #pragma mark - LazyLoad
  131. - (RQExamResultHeaderView *)examResultHeaderView {
  132. if (!_examResultHeaderView) {
  133. _examResultHeaderView = [RQExamResultHeaderView examResultHeaderView];
  134. }
  135. return _examResultHeaderView;
  136. }
  137. - (UIBarButtonItem *)backItem {
  138. if (_backItem == nil) {
  139. _backItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"backIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(rq_back)];
  140. // _backItem.tintColor = UIColorWhite;
  141. }
  142. return _backItem;
  143. }
  144. - (UIBarButtonItem *)examResultListItem {
  145. if (!_examResultListItem) {
  146. _examResultListItem = [UIBarButtonItem rq_systemItemWithTitle:@"成绩单" titleColor:RQ_MAIN_BACKGROUNDCOLOR imageName:nil target:self selector:@selector(gotoExamResultList) textType:YES];
  147. }
  148. return _examResultListItem;
  149. }
  150. @end