MHStickersView.m 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. //
  2. // MHStickersView.m
  3. #import "MHStickersView.h"
  4. #import "MHStickerCell.h"
  5. //#import "StickerManager.h"
  6. //#import "StickerDataListModel.h"
  7. #import "MHSectionStickersView.h"
  8. #import "MHBeautyParams.h"
  9. #import "MHBottomView.h"
  10. #import <MHBeautySDK/MHBeautySDK.h>
  11. #define kNetWorkPrefix @"https://data.facegl.com"
  12. @interface MHStickersView ()<UIScrollViewDelegate,MHSectionStickersViewDelegate>
  13. @property (nonatomic, assign) NSInteger lastIndex;//记录按钮的索引,以便更新UI
  14. @property (nonatomic, strong) UIView *lineView;
  15. @property (nonatomic, strong) UIScrollView *scrollView;
  16. @property (nonatomic, strong) NSMutableArray *views;
  17. @property(nonatomic,strong)NSArray *stickersArr;
  18. @property (nonatomic, assign) NSInteger lastViewIndex;//记录View索引,取消选中贴纸
  19. @property (nonatomic, assign) BOOL isFirstSelect;
  20. @property (nonatomic, assign) NSInteger currentViewIndex;
  21. @property (nonatomic, strong) NSMutableArray *titleBtnArr;
  22. @property (nonatomic, strong) NSMutableArray *allArr;
  23. @property (nonatomic, strong) NSMutableArray *urls;
  24. @property (nonatomic, strong) MHBottomView * bottomView;
  25. @property (nonatomic, assign) int sdkLevelTYpe;///<sdk类型
  26. @end
  27. @implementation MHStickersView
  28. - (instancetype)initWithFrame:(CGRect)frame {
  29. if (self = [super initWithFrame:frame]) {
  30. self.backgroundColor = [UIColor clearColor];
  31. self.lastViewIndex = -1;
  32. [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:@"selectedStickerIndex"];
  33. _urls = [NSMutableArray array];
  34. [self configureStickerTypes];
  35. }
  36. return self;
  37. }
  38. - (void)configureStickerTypes {
  39. for (UIView *subview in self.subviews){
  40. [subview removeFromSuperview];
  41. }
  42. NSMutableArray *titleBtns = [NSMutableArray array];
  43. [self.urls removeAllObjects];
  44. self.stickersArr = [MHSDK shareInstance].stickerArray;
  45. for (int i = 0; i < self.stickersArr.count; i++) {
  46. NSDictionary * itemDic1 = self.stickersArr[i];
  47. NSString * selectedItemName = itemDic1[@"name"];
  48. NSAttributedString *name = [self stringAttachment:selectedItemName textColor:i==0?FontColorSelected:FontColorBlackNormal];
  49. [titleBtns addObject:name];
  50. NSString * urlString = [NSString stringWithFormat:@"%@%@",kNetWorkPrefix,itemDic1[@"mark"]];
  51. NSData *data = [urlString dataUsingEncoding:NSUTF8StringEncoding];
  52. urlString = [data base64EncodedStringWithOptions:0];
  53. [_urls addObject:urlString];
  54. }
  55. self.allArr = [NSMutableArray arrayWithCapacity:titleBtns.count];
  56. self.titleBtnArr = [NSMutableArray arrayWithCapacity:titleBtns.count];
  57. self.views = [NSMutableArray arrayWithCapacity:titleBtns.count];
  58. UIButton *cancelBtn = [UIButton buttonWithType:0];
  59. UIImage * image = BundleImg(@"sticker_not");
  60. [cancelBtn setHighlighted:YES];
  61. cancelBtn.frame = CGRectMake(0, 0, MHStickerSectionHeight, MHStickerSectionHeight);
  62. cancelBtn.tag = 1108;
  63. [cancelBtn addTarget:self action:@selector(cancelStiker) forControlEvents:UIControlEventTouchUpInside];
  64. [self addSubview:cancelBtn];
  65. UIImageView * imageV = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, MHStickerSectionHeight - 20, MHStickerSectionHeight - 20)];
  66. imageV.image = image;
  67. [self addSubview:imageV];
  68. UIView * line = [[UIView alloc] initWithFrame:CGRectMake(MHStickerSectionHeight, 0, 0.5, MHStickerSectionHeight)];
  69. line.backgroundColor = LineColor;
  70. [self addSubview:line];
  71. for (int i = 0; i<titleBtns.count; i++) {
  72. UIButton *titleBtn = [UIButton buttonWithType:0];
  73. [titleBtn setAttributedTitle:titleBtns[i] forState:0];
  74. titleBtn.frame = CGRectMake(((window_width - MHStickerSectionHeight)/titleBtns.count)*i + MHStickerSectionHeight, 0, ((window_width - MHStickerSectionHeight)/titleBtns.count), MHStickerSectionHeight);
  75. titleBtn.tag = 1109+i;
  76. [titleBtn addTarget:self action:@selector(switchStickerOrMask:) forControlEvents:UIControlEventTouchUpInside];
  77. [self addSubview:titleBtn];
  78. NSMutableArray *muArr = [NSMutableArray array];
  79. [self.allArr addObject:muArr];
  80. [self.titleBtnArr addObject:titleBtn];
  81. MHSectionStickersView *stickersView = [[MHSectionStickersView alloc] initWithFrame:CGRectMake(window_width * i, 0, window_width, self.frame.size.height - MHStickerSectionHeight-0.5)];
  82. stickersView.tag = [self.stickersArr[i][@"list_order"] integerValue] +1111;
  83. stickersView.lastTag = stickersView.tag;
  84. stickersView.delegate = self;
  85. [self.scrollView addSubview:stickersView];
  86. [self.views addObject:stickersView];
  87. }
  88. _lineView = [[UIView alloc] initWithFrame:CGRectMake(0, MHStickerSectionHeight, window_width, 0.5)];
  89. _lineView.backgroundColor = LineColor;
  90. [self addSubview:_lineView];
  91. [self addSubview:self.scrollView];
  92. if (isNeedBottom) {
  93. [self addSubview:self.bottomView];
  94. }
  95. // self.frame.origin.y
  96. ///修改MHUI
  97. CGFloat bottom = self.lineView.frame.origin.y + self.lineView.frame.size.height;
  98. // CGFloat bottom = MHStickerSectionHeight;
  99. CGRect rect = self.scrollView.frame;
  100. self.scrollView.frame = CGRectMake(rect.origin.x, bottom, rect.size.width, rect.size.height);
  101. self.scrollView.contentSize = CGSizeMake(window_width * titleBtns.count, self.frame.size.height - bottom);
  102. }
  103. - (void)switchStickerOrMask:(UIButton *)btn {
  104. NSInteger tag = btn.tag - 1109;
  105. [self.scrollView setContentOffset:CGPointMake(window_width * tag, 0) animated:YES];
  106. [self switchViewToRequestData:tag];
  107. }
  108. - (void)switchSelectedBtnUI:(NSInteger)index textColor:(UIColor *)color {
  109. UIButton *curentBtn = self.titleBtnArr[index];
  110. NSAttributedString *str = curentBtn.currentAttributedTitle;
  111. NSMutableAttributedString *str2 = [[NSMutableAttributedString alloc] initWithAttributedString:str];
  112. [str2 addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(0, str.length)];
  113. [curentBtn setAttributedTitle:str2 forState:0];
  114. }
  115. - (void)clearStikerUI{
  116. if (self.lastIndex >= 0) {
  117. if ([MHSDK shareInstance].stickerArray.count == 0) {
  118. return;
  119. }
  120. NSMutableArray *currentArr = self.allArr[self.currentViewIndex];
  121. MHSectionStickersView *currentSubView = self.views[self.currentViewIndex];
  122. NSString *la = [[NSUserDefaults standardUserDefaults] objectForKey:@"selectedStickerIndex"];
  123. if (la != nil && ![la isEqualToString:@""]) {
  124. NSInteger laindex = la.integerValue;
  125. if (laindex < currentArr.count) {
  126. StickerDataListModel *model = currentArr[laindex+1];
  127. model.isSelected = NO;
  128. currentSubView.lastIndex = -1;
  129. [currentSubView.collectionView reloadData];
  130. }
  131. }else{
  132. [currentArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
  133. StickerDataListModel *model = obj;
  134. model.isSelected = NO;
  135. if (stop) {
  136. [currentSubView.collectionView reloadData];
  137. }
  138. }];
  139. }
  140. }
  141. }
  142. #pragma mark - 底部按钮响应
  143. - (void)cameraAction:(BOOL)isTakePhoto{
  144. NSLog(@"点击了拍照");
  145. if (isTakePhoto) {
  146. if ([self.delegate respondsToSelector:@selector(takePhoto)]) {
  147. [self.delegate takePhoto];
  148. }
  149. }else{
  150. if ([self.delegate respondsToSelector:@selector(clickPackUp)]) {
  151. [self.delegate clickPackUp];
  152. }
  153. }
  154. }
  155. #pragma mark - delegate
  156. - (void)handleSelectedStickerEffect:(NSString *)stickerContent stickerModel:(nonnull StickerDataListModel *)model{
  157. //NSLog(@"sss---%@",stickerContent);
  158. if (!IsStringWithAnyText(model.name) && !IsStringWithAnyText(model.resource) ) {
  159. if ([self.delegate respondsToSelector:@selector(handleStickerEffect: sticker:withLevel:)]) {
  160. [self.delegate handleStickerEffect:@"" sticker:nil withLevel:0];
  161. [[NSUserDefaults standardUserDefaults] setObject:@"" forKey:kMHSticker];
  162. }
  163. } else {
  164. if ([self.delegate respondsToSelector:@selector(handleStickerEffect: sticker:withLevel:)]) {
  165. NSDictionary * itemDic = self.stickersArr[self.currentViewIndex];
  166. NSInteger level = [itemDic[@"id"] integerValue];
  167. [self.delegate handleStickerEffect:stickerContent sticker:model withLevel:level];
  168. if (isSaveSticker) {
  169. NSDictionary *info = @{@"content":stickerContent,
  170. @"kLevel":@(level)};
  171. [[NSUserDefaults standardUserDefaults] setObject:info forKey:kMHSticker];
  172. }
  173. }
  174. }
  175. }
  176. //当切换分类后,点击贴纸,取消上一个分类下贴纸的选中效果
  177. - (void)reloadLastStickerSelectedStatus:(BOOL)needReset {
  178. if (!self.isFirstSelect) {
  179. self.lastViewIndex = 0;
  180. self.isFirstSelect = YES;
  181. }
  182. MHSectionStickersView *lastSubView = self.views[self.lastViewIndex];
  183. NSMutableArray *lastArr = self.allArr[self.lastViewIndex];
  184. NSString *la = [[NSUserDefaults standardUserDefaults] objectForKey:@"selectedStickerIndex"];
  185. if (la != nil && ![la isEqualToString:@""]) {
  186. NSInteger laindex = la.integerValue;
  187. if (laindex < lastArr.count) {
  188. StickerDataListModel *model = lastArr[laindex];
  189. model.isSelected = !needReset;
  190. [lastSubView.collectionView reloadData];
  191. }
  192. }
  193. MHSectionStickersView *subView = self.views[self.currentViewIndex];
  194. subView.lastTag = subView.tag;
  195. self.lastViewIndex = self.currentViewIndex;
  196. }
  197. #pragma mark - 取消贴纸
  198. - (void)cancelStiker{
  199. StickerDataListModel * model = [[StickerDataListModel alloc] init];
  200. model.resource = @"";
  201. [self handleSelectedStickerEffect:model.name stickerModel:model];
  202. [self clearStikerUI];
  203. }
  204. #pragma mark - data
  205. - (void)configureStickers:(NSArray *)arr {
  206. NSMutableArray *muArr = self.allArr.firstObject;
  207. [muArr addObjectsFromArray:arr];
  208. MHSectionStickersView *stickersView = self.views.firstObject;
  209. [stickersView configureData:arr];
  210. }
  211. - (BOOL)stickerIsExistWithStickerName:(NSString * )stickerName{
  212. NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"sticker"];
  213. NSString * path1 = [path stringByAppendingPathComponent:stickerName];
  214. if (![[NSFileManager defaultManager] fileExistsAtPath:path1]) {
  215. return NO;
  216. }
  217. return YES;
  218. }
  219. - (void)switchViewToRequestData:(NSInteger)index {
  220. NSInteger currentIndex = MIN(index, self.allArr.count);
  221. NSMutableArray *arr = self.allArr[currentIndex];
  222. [arr removeAllObjects];
  223. MHSectionStickersView *currentSubView = self.views[currentIndex];
  224. NSString *url = self.urls[currentIndex];
  225. NSDictionary * itemDic = [MHSDK shareInstance].stickerArray[index];
  226. NSString * oldStickerVersion = [[NSUserDefaults standardUserDefaults] objectForKey:OldStickerVesion];
  227. NSString * stickerVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"sticker_version"];
  228. NSArray * stickerArr = [[NSUserDefaults standardUserDefaults] objectForKey:itemDic[@"name"]];
  229. NSMutableArray * stickerMutArr = [NSMutableArray array];
  230. StickerDataListModel *model;
  231. NSSet *set = [NSSet setWithObjects:[NSString class],[NSNumber class],[StickerDataListModel class], nil];
  232. for (NSData * data in stickerArr) {
  233. if (data && ![data isKindOfClass:[NSString class]]) {
  234. if (@available(iOS 11.0,*)) {
  235. model = [NSKeyedUnarchiver unarchivedObjectOfClasses:set fromData:data error:nil];
  236. }else{
  237. model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  238. }
  239. model.is_downloaded = [self stickerIsExistWithStickerName:model.name]?@"1":@"0";
  240. [stickerMutArr addObject:model];
  241. }
  242. }
  243. if ((oldStickerVersion && oldStickerVersion.length > 0) && (stickerMutArr && stickerMutArr.count > 0)&& ([oldStickerVersion isEqual:stickerVersion])) {
  244. [currentSubView configureData:stickerMutArr];
  245. [arr addObjectsFromArray:stickerMutArr];
  246. [self.allArr replaceObjectAtIndex:index withObject:arr];
  247. } else {
  248. [[StickerManager sharedManager] requestStickersListWithUrl:url
  249. Success:^(NSArray<StickerDataListModel *> * _Nonnull stickerArray) {
  250. dispatch_async(dispatch_get_main_queue(), ^{
  251. [arr addObjectsFromArray:stickerArray];
  252. [self.allArr replaceObjectAtIndex:index withObject:arr];
  253. [currentSubView configureData:arr];
  254. NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:stickerArray.count];
  255. for (StickerDataListModel * model in stickerArray) {
  256. NSData * data = [NSKeyedArchiver archivedDataWithRootObject:model requiringSecureCoding:YES error:nil];
  257. [dataArray addObject:data];
  258. }
  259. [[NSUserDefaults standardUserDefaults] setObject:dataArray forKey:itemDic[@"name"]];
  260. [[NSUserDefaults standardUserDefaults] setObject:stickerVersion forKey:OldStickerVesion];
  261. });
  262. } Failed:^{
  263. }];
  264. }
  265. if (!self.isFirstSelect) {
  266. self.lastViewIndex = 0;
  267. self.isFirstSelect = YES;
  268. self.lastIndex = 0;
  269. }
  270. MHSectionStickersView *lastSubView = self.views[self.lastViewIndex];
  271. currentSubView.lastTag = lastSubView.tag;
  272. [self switchSelectedBtnUI:currentIndex textColor:FontColorSelected];
  273. if (self.lastIndex != currentIndex) {
  274. [self switchSelectedBtnUI:self.lastIndex textColor:FontColorBlackNormal];
  275. }
  276. self.lastIndex = currentIndex;
  277. self.currentViewIndex = currentIndex;
  278. }
  279. #pragma mark - scrollDelegate
  280. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  281. NSInteger index = scrollView.contentOffset.x / window_width;
  282. [self switchViewToRequestData:index];
  283. }
  284. #pragma mark - lazy
  285. - (UIScrollView *)scrollView {
  286. if (!_scrollView) {
  287. _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, window_width, self.frame.size.height - MHStickerSectionHeight-0.5)];
  288. _scrollView.pagingEnabled = YES;
  289. ///修改MHUI
  290. _scrollView.backgroundColor = [UIColor clearColor];
  291. _scrollView.bounces = NO;
  292. _scrollView.delegate = self;
  293. _scrollView.scrollsToTop = NO;
  294. _scrollView.showsHorizontalScrollIndicator = NO;
  295. }
  296. return _scrollView;
  297. }
  298. ///修改MHUI
  299. - (MHBottomView*)bottomView{
  300. if (!_bottomView) {
  301. __weak typeof(self) weakSelf = self;
  302. CGFloat bottom = self.frame.size.height - MHBottomViewHeight;
  303. _bottomView = [[MHBottomView alloc] initWithFrame:CGRectMake(0, bottom, window_width, MHBottomViewHeight)];
  304. _bottomView.isSticker = YES;
  305. // _bottomView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
  306. _bottomView.clickBtn = ^(BOOL isTakePhoto) {
  307. [weakSelf cameraAction:isTakePhoto];
  308. };
  309. }
  310. return _bottomView;
  311. }
  312. - (NSAttributedString *)stringAttachment:(NSString *)content textColor:(UIColor *)color {
  313. NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:YZMsg(content)];
  314. [string addAttributes:@{NSForegroundColorAttributeName:color,NSFontAttributeName:Font_12} range:NSMakeRange(0, string.length)];
  315. if ([content containsString:@"基础"]) {
  316. return string;
  317. }
  318. NSTextAttachment *attchment = [[NSTextAttachment alloc]init];
  319. attchment.bounds = CGRectMake(0, 2.5,18,10);//设置frame
  320. UIImage *img = BundleImg(@"pro");
  321. attchment.image = img;//设置需要插入的图片
  322. NSAttributedString *attchmentString = [NSAttributedString attributedStringWithAttachment:attchment];
  323. [string appendAttributedString:attchmentString];
  324. return string;
  325. }
  326. - (int)sdkLevelTYpe{
  327. return [[MHSDK shareInstance] getSDKLevel];
  328. }
  329. @end