// // RQExamResultViewController.m // jiaPei // // Created by 张嵘 on 2022/7/26. // Copyright © 2022 JCZ. All rights reserved. // #import "RQExamResultViewController.h" @interface RQExamResultViewController () /// viewModel @property (nonatomic, readonly, strong) RQExamResultViewModel *viewModel; @property (nonatomic, readwrite, strong) RQExamResultHeaderView *examResultHeaderView; @property (nonatomic, readwrite, strong) QMUINavigationBarScrollingAnimator *navigationAnimator; /// 返回按钮 @property (nonatomic, readwrite, strong) UIBarButtonItem *backItem; @property (nonatomic, readwrite, strong) UIBarButtonItem *examResultListItem; @end @implementation RQExamResultViewController @dynamic viewModel; #pragma mark - SystemMethod - (void)viewDidLoad { [super viewDidLoad]; @weakify(self) [self.navigationItem setLeftBarButtonItems:@[self.backItem]]; [self.collectionView addSubview:self.examResultHeaderView]; NSInteger totalNum = RQObjectIsNil(self.viewModel.questionArr)? 0 : self.viewModel.questionArr.count; NSInteger errorNum = RQObjectIsNil(self.viewModel.errorArr)? 0 : self.viewModel.errorArr.count; NSInteger rightNum = RQObjectIsNil(self.viewModel.correctArr)? 0 : self.viewModel.correctArr.count; NSInteger hasdoNum = errorNum + rightNum; NSInteger undoNum = totalNum - hasdoNum; NSInteger perScore = 100 / totalNum; NSInteger score = rightNum * perScore; // NSUInteger sec = RQ_Exercise_Module.count%60; // NSUInteger min = RQ_Exercise_Module.count/60; CGFloat progress = (hasdoNum * 1.00) / (totalNum * 1.00); __block BOOL isSuccess = (score >= 90); self.examResultHeaderView.scoreLabel.text = [NSString qmui_stringWithNSInteger:score]; self.examResultHeaderView.unDoLabel.text = [NSString qmui_stringWithNSInteger:undoNum]; self.examResultHeaderView.errorLabel.text = [NSString qmui_stringWithNSInteger:errorNum]; self.examResultHeaderView.myProgressView.progress = progress; self.examResultHeaderView.resultLabel.text = isSuccess? @"合格" : @"不合格"; self.examResultHeaderView.resultDscLabel.text = isSuccess? @"恭喜,考试合格" : @"很遗憾,考试不合格"; self.examResultHeaderView.resultBtn.selected = isSuccess; self.examResultHeaderView.bgImageView.image = RQImageNamed(isSuccess? @"考试成绩背景图绿" : @"考试成绩背景图"); [self.examResultHeaderView.fastUpBtn setBackgroundImage:[UIImage imageWithGradualChangingColor:^(QQGradualChangingColor *graColor) { graColor.fromColor = RQColorFromHexString(isSuccess? @"#01C18D" : @"#FF4C52"); graColor.toColor = RQColorFromHexString(isSuccess? @"#3ED2AA" : @"#FC8269"); graColor.type = QQGradualChangeTypeLeftToRight; } size:CGSizeMake(RQ_FIT_HORIZONTAL(76.f), RQ_FIT_HORIZONTAL(30.f)) cornerRadius:QQRadiusMakeSame(RQ_FIT_HORIZONTAL(30.f) / 2.f)] forState:UIControlStateNormal]; self.examResultHeaderView.myProgressView.layer.shadowColor = isSuccess? RGBA_COLOR(26, 168, 130, 0.2).CGColor : RGBA_COLOR(193, 16, 16, 0.2).CGColor; self.navigationAnimator = [[QMUINavigationBarScrollingAnimator alloc] init]; self.navigationAnimator.scrollView = self.collectionView;// 指定要关联的 scrollView self.navigationAnimator.offsetYToStartAnimation = 30;// 设置滚动的起点,值即表示在默认停靠的位置往下滚动多少距离后即触发动画,默认是 0 self.navigationAnimator.distanceToStopAnimation = 64;// 设置从起点开始滚动多长的距离达到终点 self.navigationAnimator.backgroundImageBlock = ^UIImage * _Nonnull(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) { return [[UIImage qmui_imageWithColor:RQColorFromHexString(isSuccess? @"#01C18D" : @"#FF4C52") size:CGSizeMake(RQ_SCREEN_WIDTH, RQ_APPLICATION_NAV_BAR_HEIGHT) cornerRadius:0] qmui_imageWithAlpha:progress]; }; self.navigationAnimator.shadowImageBlock = ^UIImage * _Nonnull(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) { return [NavBarShadowImage qmui_imageWithAlpha:progress]; }; self.navigationAnimator.tintColorBlock = ^UIColor * _Nonnull(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) { return [UIColor qmui_colorFromColor:UIColorWhite toColor:UIColorWhite progress:progress]; }; self.navigationAnimator.titleViewTintColorBlock = self.navigationAnimator.tintColorBlock; self.navigationAnimator.statusbarStyleBlock = ^UIStatusBarStyle(QMUINavigationBarScrollingAnimator * _Nonnull animator, float progress) { return progress < .25 ? UIStatusBarStyleDefault : UIStatusBarStyleLightContent; }; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; self.collectionView.frame = CGRectMake(0, 0, RQ_SCREEN_WIDTH, RQ_SCREEN_HEIGHT - RQ_APPLICATION_SAFEAREA_BOTTOM_HEIGHT); self.examResultHeaderView.frame = CGRectMake(0, - RQ_FIT_HORIZONTAL(350.f), RQ_SCREEN_WIDTH, RQ_FIT_HORIZONTAL(350.f)); } - (void)gotoExamResultList { NSArray *arr = @[]; if (RQ_YDTQuestion_Module.subject == RQHomePageSubjectType_SubjectOne) { arr = RQObjectIsNil(RQ_COMMON_MANAGER.examResultOneListArr)? @[] : RQ_COMMON_MANAGER.examResultOneListArr; } else if (RQ_YDTQuestion_Module.subject == RQHomePageSubjectType_SubjectFour) { arr = RQObjectIsNil(RQ_COMMON_MANAGER.examResultFourListArr)? @[] : RQ_COMMON_MANAGER.examResultFourListArr; } RQExamProbabilityViewModel *examProbabilityViewModel = [[RQExamProbabilityViewModel alloc] initWithServices:RQ_APPDELEGATE.services params:@{ RQViewModelUtilKey : arr, }]; [RQ_APPDELEGATE.services pushViewModel:examProbabilityViewModel animated:YES]; } #pragma mark - OverrideMethods - (UIEdgeInsets)contentInset { return UIEdgeInsetsMake(RQ_FIT_HORIZONTAL(350.f), 0, 0, 0); } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath { RQCommonGroupViewModel *groupViewModel = self.viewModel.dataSource[indexPath.section]; RQCommonCollectionItemViewModel *itemViewModel = groupViewModel.itemViewModels[indexPath.row]; return [NSClassFromString(itemViewModel.itemClassName) cellWithCollectionView:collectionView forIndexPath:indexPath]; } - (void)configureCell:(RQCommonCollectionViewCell *)cell atIndexPath:(NSIndexPath *)indexPath withObject:(id)object { [cell bindViewModel:object]; } - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { return UIEdgeInsetsZero; } - (UIStatusBarStyle)preferredStatusBarStyle { // 需要手动调用 navigationAnimator.statusbarStyleBlock 来告诉系统状态栏的变化 if (self.navigationAnimator) { return self.navigationAnimator.statusbarStyleBlock(self.navigationAnimator, self.navigationAnimator.progress); } return [super preferredStatusBarStyle]; } // 建议配合 QMUINavigationControllerAppearanceDelegate 控制不同界面切换时的 navigationBar 样式,否则需自己在 viewWillAppear:、viewWillDisappear: 里控制 #pragma mark - - (UIImage *)qmui_navigationBarBackgroundImage { return self.navigationAnimator.backgroundImageBlock(self.navigationAnimator, self.navigationAnimator.progress); } - (UIImage *)qmui_navigationBarShadowImage { return self.navigationAnimator.shadowImageBlock(self.navigationAnimator, self.navigationAnimator.progress); } - (UIColor *)qmui_navigationBarTintColor { return self.navigationAnimator.tintColorBlock(self.navigationAnimator, self.navigationAnimator.progress); } - (UIColor *)qmui_titleViewTintColor { return [self qmui_navigationBarTintColor]; } #pragma mark - // 为了展示接口的使用,QMUI Demo 没有打开配置表的 AutomaticCustomNavigationBarTransitionStyle,因此当 navigationBar 样式与默认样式不同时,需要手动在 customNavigationBarTransitionKey 里返回一个与其他界面不相同的值,这样才能使用自定义的 navigationBar 转场样式 - (NSString *)customNavigationBarTransitionKey { return self.navigationAnimator.progress >= 1 ? nil : @"progress"; } - (void)rq_back{ /// 返回按钮事件处理 [self.viewModel.services popToRootViewModelAnimated:YES]; } #pragma mark - LazyLoad - (RQExamResultHeaderView *)examResultHeaderView { if (!_examResultHeaderView) { _examResultHeaderView = [RQExamResultHeaderView examResultHeaderView]; } return _examResultHeaderView; } - (UIBarButtonItem *)backItem { if (_backItem == nil) { _backItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"backIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(rq_back)]; // _backItem.tintColor = UIColorWhite; } return _backItem; } - (UIBarButtonItem *)examResultListItem { if (!_examResultListItem) { _examResultListItem = [UIBarButtonItem rq_systemItemWithTitle:@"成绩单" titleColor:RQ_MAIN_BACKGROUNDCOLOR imageName:nil target:self selector:@selector(gotoExamResultList) textType:YES]; } return _examResultListItem; } @end