MyMusicViewController.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. //
  2. // MyMusicViewController.m
  3. // KulexiuForTeacher
  4. //
  5. // Created by Kyle on 2022/3/28.
  6. //
  7. #import "MyMusicViewController.h"
  8. #import "KSBaseWKWebViewController.h"
  9. #import "JXCategoryView.h"
  10. #import "JXPagerListRefreshView.h"
  11. #import "MyMusicBodyView.h"
  12. #import "TeacherInfo.h"
  13. #import "UserInfoManager.h"
  14. #import "MusicShareModel.h"
  15. #import "MusicShareDisplayView.h"
  16. #import <UIImage+KSScreenShot.h>
  17. #import "TZImageManager.h"
  18. #import <RecordCheckManager.h>
  19. #import "KSPremissionAlert.h"
  20. #import "KSUMShareManager.h"
  21. #import "MyMusicSearchView.h"
  22. #import <KSChoosePicker.h>
  23. #import "MyMusicNavView.h"
  24. #define HEADER_HEIGHT (50)
  25. #define SEARCH_HEIGHT (50)
  26. @interface MyMusicViewController ()<JXPagerViewDelegate, JXPagerMainTableViewGestureDelegate,JXCategoryViewDelegate>
  27. @property (nonatomic, strong) MyMusicNavView *navView;
  28. @property (nonatomic, assign) NSInteger selectedIndex;
  29. @property (nonatomic, strong) NSMutableArray *listViewArray;
  30. @property (nonatomic, strong) TeacherInfo *teacherInfo;
  31. @property (nonatomic, strong) MusicShareDisplayView *shareView;
  32. @property (nonatomic, strong) MyMusicSearchView *searchView;
  33. @property (nonatomic, strong) NSMutableArray *subjectList;
  34. @property (nonatomic, strong) NSString *searchKey;
  35. @property (nonatomic, strong) NSString *subjectIds;
  36. @end
  37. @implementation MyMusicViewController
  38. - (void)viewDidLoad {
  39. [super viewDidLoad];
  40. // Do any additional setup after loading the view.
  41. self.ks_prefersNavigationBarHidden = YES;
  42. _titles = @[@"已上架",@"审核中",@"审核失败",@"已下架"];
  43. [self configUI];
  44. [self countUMEvent];
  45. }
  46. - (void)countUMEvent {
  47. [USER_MANAGER sendUMEvent:@"klx_uploadMusic"];
  48. }
  49. - (void)configUI {
  50. [self.scrollView removeFromSuperview];
  51. self.view.backgroundColor = HexRGB(0xf8f9fc);
  52. [self.view addSubview:self.navView];
  53. [self.navView mas_makeConstraints:^(MASConstraintMaker *make) {
  54. make.left.right.top.mas_equalTo(self.view);
  55. make.height.mas_equalTo(kNaviBarHeight);
  56. }];
  57. [self.view addSubview:self.searchView];
  58. [self.searchView mas_makeConstraints:^(MASConstraintMaker *make) {
  59. make.left.right.mas_equalTo(self.view);
  60. make.top.mas_equalTo(self.navView.mas_bottom);
  61. make.height.mas_equalTo(SEARCH_HEIGHT);
  62. }];
  63. _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, SEARCH_HEIGHT + kNaviBarHeight, kScreenWidth, HEADER_HEIGHT)];
  64. self.categoryView.titles = self.titles;
  65. self.categoryView.delegate = self;
  66. self.categoryView.titleFont = [UIFont systemFontOfSize:17.0f];
  67. self.categoryView.titleSelectedFont = [UIFont systemFontOfSize:17.0f weight:UIFontWeightMedium];
  68. self.categoryView.titleSelectedColor = HexRGB(0x333333);
  69. self.categoryView.titleColor = HexRGB(0x666666);
  70. self.categoryView.titleColorGradientEnabled = YES;
  71. self.categoryView.backgroundColor = [UIColor whiteColor];
  72. JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
  73. lineView.indicatorColor = THEMECOLOR;
  74. lineView.indicatorWidth = 16;
  75. lineView.indicatorHeight = 4.0f;
  76. self.categoryView.indicators = @[lineView];
  77. _pagerView = [self preferredPagingView];
  78. self.pagerView.frame = CGRectMake(0, SEARCH_HEIGHT + kNaviBarHeight, KPortraitWidth, KPortraitHeight - kNaviBarHeight - iPhoneXSafeBottomMargin - SEARCH_HEIGHT);
  79. self.pagerView.backgroundColor = [UIColor clearColor];
  80. self.pagerView.mainTableView.backgroundColor = [UIColor clearColor];
  81. self.pagerView.listContainerView.backgroundColor = [UIColor clearColor];
  82. self.pagerView.mainTableView.gestureDelegate = self;
  83. self.categoryView.listContainer = (id<JXCategoryViewListContainer>)self.pagerView.listContainerView;
  84. self.pagerView.listContainerView.listCellBackgroundColor = [UIColor clearColor];
  85. [self.view addSubview:self.pagerView];
  86. self.categoryView.listContainer = (id<JXCategoryViewListContainer>)self.pagerView.listContainerView;
  87. }
  88. - (void)shareButtonClick { // 获取分享数据
  89. [LOADING_MANAGER showHUD];
  90. [KSNetworkingManager queryMusicShareMessageRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
  91. [LOADING_MANAGER removeHUD];
  92. if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
  93. NSDictionary *resultDic = [dic ks_dictionaryValueForKey:@"data"];
  94. MusicShareModel *model = [[MusicShareModel alloc] initWithDictionary:resultDic];
  95. if (model.musicSheetCount == 0) {
  96. [LOADING_MANAGER MBShowAUTOHidingInWindow:@"您还没有上架曲谱"];
  97. }
  98. else {
  99. [self displayShareViewWithSource:model];
  100. }
  101. }
  102. else {
  103. [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
  104. }
  105. } faliure:^(NSError * _Nonnull error) {
  106. [LOADING_MANAGER removeHUD];
  107. }];
  108. }
  109. - (void)displayShareViewWithSource:(MusicShareModel *)model {
  110. self.shareView = [MusicShareDisplayView shareInstance];
  111. [self.shareView configWithSource:model];
  112. MJWeakSelf;
  113. [self.shareView shareActionCallback:^(SHARETYPE type) {
  114. UIImage *image = [UIImage getCurrentViewShot:weakSelf.shareView.containerView];
  115. if (type == SHARETYPE_SAVE) {
  116. [weakSelf savePicWithImage:image];
  117. }
  118. else {
  119. [weakSelf showShareUI:image];
  120. }
  121. }];
  122. [self.shareView showShareViewInView:self.view];
  123. }
  124. - (void)showShareUI:(UIImage *)image {
  125. [KSUMShareManager shareInstanceWithImage:image url:@"" shareTitle:@"" descMessage:@"" shareType:KSSHARETYPE_IMAGE showInView:self callback:^(BOOL isSuccess, NSString * _Nonnull descMessage) {
  126. if (isSuccess) {
  127. [self .shareView hideView];
  128. }
  129. else {
  130. }
  131. [LOADING_MANAGER MBShowAUTOHidingInWindow:descMessage];
  132. }];
  133. }
  134. - (void)savePicWithImage:(UIImage *)image {
  135. // 判断相册权限
  136. [RecordCheckManager checkPhotoLibraryPremissionAvaiableCallback:^(PREMISSIONTYPE type) {
  137. if (type == PREMISSIONTYPE_YES) {
  138. [[TZImageManager manager] savePhotoWithImage:image completion:^(PHAsset *asset, NSError *error) {
  139. if (!error) {
  140. [self .shareView hideView];
  141. [LOADING_MANAGER MBShowAUTOHidingInWindow:@"已保存到相册"];
  142. }
  143. else {
  144. [LOADING_MANAGER MBShowAUTOHidingInWindow:@"保存图片失败"];
  145. }
  146. }];
  147. }
  148. else {
  149. [self showAlertWithMessage:@"请开启相册访问权限" type:CHECKDEVICETYPE_CAMREA];
  150. }
  151. }];
  152. }
  153. - (void)showAlertWithMessage:(NSString *)message type:(CHECKDEVICETYPE)deviceType {
  154. [KSPremissionAlert shareInstanceDisplayImage:deviceType message:message showInView:self.view cancel:^{
  155. } confirm:^{
  156. [self openSettingView];
  157. }];
  158. }
  159. - (void)openSettingView {
  160. if (@available(iOS 10, *)) {
  161. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] options:@{} completionHandler:nil];
  162. } else {
  163. [[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];
  164. }
  165. }
  166. - (void)viewWillAppear:(BOOL)animated {
  167. [super viewWillAppear:animated];
  168. self.navigationController.interactivePopGestureRecognizer.enabled = YES;
  169. [self requestTeachMessage];
  170. [self requestSubjectList];
  171. if (self.listViewArray.count > self.categoryView.selectedIndex) {
  172. id value = self.listViewArray[self.categoryView.selectedIndex];
  173. if ([value isKindOfClass:[MyMusicBodyView class]]) {
  174. MyMusicBodyView *listView = (MyMusicBodyView *)value;
  175. [listView beginFirstRefresh];
  176. }
  177. }
  178. }
  179. - (void)requestTeachMessage {
  180. [KSNetworkingManager queryTeacherInfoRequest:KS_GET success:^(NSDictionary * _Nonnull dic) {
  181. if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
  182. self.teacherInfo = [[TeacherInfo alloc] initWithDictionary:[dic ks_dictionaryValueForKey:@"data"]];
  183. [self refreshHeadView];
  184. }
  185. else {
  186. [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
  187. }
  188. } faliure:^(NSError * _Nonnull error) {
  189. }];
  190. }
  191. - (void)refreshHeadView {
  192. // 刷新老师认证和音乐人认证状态
  193. [self refreshAuthStatus];
  194. }
  195. - (void)refreshAuthStatus {
  196. for (NSInteger index = 0; index < self.listViewArray.count; index++) {
  197. id view = self.listViewArray[index];
  198. if ([view isKindOfClass:[MyMusicBodyView class]]) {
  199. MyMusicBodyView *listView = (MyMusicBodyView *)view;
  200. listView.teaherStatus = self.teacherInfo.entryStatus;
  201. }
  202. }
  203. }
  204. - (void)requestSubjectList {
  205. [KSNetworkingManager querySubjectItemRequest:KS_POST success:^(NSDictionary * _Nonnull dic) {
  206. if ([dic ks_integerValueForKey:@"code"] == 200 && [dic ks_boolValueForKey:@"status"]) {
  207. NSArray *dataArray = [NSMutableArray array];
  208. dataArray = [dic ks_arrayValueForKey:@"data"];
  209. NSMutableArray *subjectArray = [NSMutableArray array];
  210. for (NSDictionary *parm in dataArray) {
  211. NSMutableDictionary *subjectSource = [NSMutableDictionary dictionary];
  212. [subjectSource setValue:[parm ks_stringValueForKey:@"id"] forKey:@"subjectId"];
  213. [subjectSource setValue:[parm ks_stringValueForKey:@"name"] forKey:@"subjectName"];
  214. [subjectArray addObject:subjectSource];
  215. }
  216. self.subjectList = [subjectArray mutableCopy];
  217. }
  218. else{
  219. [LOADING_MANAGER MBShowAUTOHidingInWindow:MESSAGEKEY];
  220. }
  221. } faliure:^(NSError * _Nonnull error) {
  222. }];
  223. }
  224. - (void)viewDidAppear:(BOOL)animated {
  225. [super viewDidAppear:animated];
  226. self.navigationController.interactivePopGestureRecognizer.enabled = (self.categoryView.selectedIndex == 0);
  227. }
  228. - (JXPagerView *)preferredPagingView {
  229. return [[JXPagerListRefreshView alloc] initWithDelegate:self];
  230. }
  231. #pragma mark - JXPagerViewDelegate
  232. - (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView {
  233. return [UIView new];
  234. }
  235. - (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView {
  236. return CGFLOAT_MIN;
  237. }
  238. - (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
  239. return HEADER_HEIGHT;
  240. }
  241. - (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView {
  242. return self.categoryView;
  243. }
  244. - (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView {
  245. //和categoryView的item数量一致
  246. return self.titles.count;
  247. }
  248. - (id<JXPagerViewListViewDelegate>)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index {
  249. MyMusicBodyView *listView = [[MyMusicBodyView alloc] init];
  250. listView.naviController = self.navigationController;
  251. [self.listViewArray replaceObjectAtIndex:index withObject:listView];
  252. self.listViewArray[index] = listView;
  253. listView.selectIndex = index;
  254. if (self.teacherInfo) {
  255. listView.teaherStatus = self.teacherInfo.entryStatus;
  256. }
  257. else {
  258. listView.teaherStatus = @"PASS";
  259. }
  260. listView.subjectIds = self.subjectIds;
  261. listView.searchKey = self.searchKey;
  262. [listView beginFirstRefresh];
  263. return listView;
  264. }
  265. #pragma mark - JXCategoryViewDelegate
  266. - (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index {
  267. self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0);
  268. if (self.listViewArray.count > index) {
  269. id value = self.listViewArray[index];
  270. if ([value isKindOfClass:[KSJXBodyView class]]) {
  271. KSJXBodyView *listView = (KSJXBodyView *)value;
  272. [listView beginFirstRefresh];
  273. }
  274. }
  275. }
  276. #pragma mark - JXPagerMainTableViewGestureDelegate
  277. - (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
  278. //禁止categoryView左右滑动的时候,上下和左右都可以滚动
  279. if (otherGestureRecognizer == self.categoryView.collectionView.panGestureRecognizer) {
  280. return NO;
  281. }
  282. return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
  283. }
  284. - (NSMutableArray *)listViewArray {
  285. if (!_listViewArray) {
  286. _listViewArray = [NSMutableArray arrayWithArray:@[@"",@"",@"",@""]];
  287. }
  288. return _listViewArray;
  289. }
  290. - (MyMusicSearchView *)searchView {
  291. if (!_searchView) {
  292. _searchView = [MyMusicSearchView shareInstance];
  293. MJWeakSelf;
  294. [_searchView musicSearchAction:^(MYMUSICSORT type, NSString * _Nullable searchKey) {
  295. [weakSelf musicSearchAction:type searchKey:searchKey];
  296. }];
  297. }
  298. return _searchView;
  299. }
  300. - (void)musicSearchAction:(MYMUSICSORT)type searchKey:(NSString *)searchKey {
  301. switch (type) {
  302. case MYMUSICSORT_SUBJECT:
  303. {
  304. [self searchSubject];
  305. }
  306. break;
  307. case MYMUSICSORT_SEARCH:
  308. {
  309. [self evaluateSource:searchKey];
  310. }
  311. break;
  312. case MYMUSICSORT_UPLOAD:
  313. {
  314. [self uploadSong];
  315. }
  316. break;
  317. default:
  318. break;
  319. }
  320. }
  321. - (void)uploadSong {
  322. NSString *url = [NSString stringWithFormat:@"%@%@", WEBHOST, @"/#/music-upload"];
  323. KSBaseWKWebViewController *webCtrl = [[KSBaseWKWebViewController alloc] init];
  324. webCtrl.url = url;
  325. [self.navigationController pushViewController:webCtrl animated:YES];
  326. }
  327. - (void)searchSubject {
  328. if (self.subjectList.count) {
  329. NSMutableArray *nameArray = [NSMutableArray array];
  330. [nameArray addObject:@"全部"];
  331. for (NSDictionary *parm in self.subjectList) {
  332. [nameArray addObject:[parm ks_stringValueForKey:@"subjectName"]];
  333. }
  334. MJWeakSelf;
  335. KSChoosePicker *picker = [[KSChoosePicker alloc] initWithTitle:@"" sourceData:nameArray lastChooseIndex:0 sureButtonColor:THEMECOLOR chooseReturnWithBlock:^(NSString * _Nonnull returnValue, NSInteger chooseIndex) {
  336. if (chooseIndex == 0) {
  337. weakSelf.searchView.subjectLabel.text = @"声部";
  338. weakSelf.subjectIds = nil;
  339. }
  340. else {
  341. NSDictionary *parm = self.subjectList[chooseIndex-1];
  342. weakSelf.searchView.subjectLabel.text = returnValue;
  343. weakSelf.subjectIds = [parm ks_stringValueForKey:@"subjectId"];
  344. }
  345. [weakSelf refreshSearchSource];
  346. } cancel:^{
  347. }];
  348. [picker showPicker];
  349. }
  350. else {
  351. [LOADING_MANAGER MBShowAUTOHidingInWindow:@"无声部信息"];
  352. }
  353. }
  354. - (void)evaluateSource:(NSString *)searchKey {
  355. self.searchKey = searchKey;
  356. [self refreshSearchSource];
  357. }
  358. - (void)refreshSearchSource {
  359. for (NSInteger index = 0; index < self.listViewArray.count; index++) {
  360. id view = self.listViewArray[index];
  361. if ([view isKindOfClass:[MyMusicBodyView class]]) {
  362. MyMusicBodyView *courseView = (MyMusicBodyView *)view;
  363. courseView.subjectIds = self.subjectIds;
  364. courseView.searchKey = self.searchKey;
  365. [courseView beginFirstRefresh];
  366. }
  367. }
  368. }
  369. - (MyMusicNavView *)navView {
  370. if (!_navView) {
  371. _navView = [MyMusicNavView shareInstance];
  372. MJWeakSelf;
  373. [_navView musicNavAction:^(MUSICNAVACTION action) {
  374. if (action == MUSICNAVACTION_BACK) {
  375. [weakSelf backAction];
  376. }
  377. else {
  378. [weakSelf shareButtonClick];
  379. }
  380. }];
  381. }
  382. return _navView;
  383. }
  384. /*
  385. #pragma mark - Navigation
  386. // In a storyboard-based application, you will often want to do a little preparation before navigation
  387. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
  388. // Get the new view controller using [segue destinationViewController].
  389. // Pass the selected object to the new view controller.
  390. }
  391. */
  392. @end