MHMeiyanMenusView.m 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. //
  2. // MHMeiyanMenusView.m
  3. #import "MHMeiyanMenusView.h"
  4. #import "MHBeautyMenuCell.h"
  5. #import "MHStickersView.h"
  6. #import "MHBeautyParams.h"
  7. //#import "StickerDataListModel.h"
  8. //#import "StickerManager.h"
  9. #import "MHMagnifiedView.h"
  10. #import "MHBeautyAssembleView.h"
  11. #import "MHSpecificAssembleView.h"
  12. #import "MHBeautiesModel.h"
  13. #import "MHFilterModel.h"
  14. #import <MHBeautySDK/MHBeautySDK.h>
  15. #import "MHMakeUpView.h"
  16. //#define kBasicStickerURL @"aHR0cHM6Ly9kYXRhLmZhY2VnbC5jb20vYXBpL3Nkay92MS9zdGlja2VyL2luZGV4"
  17. static NSString *StickerImg = @"menu_sticker";
  18. static NSString *BeautyImg = @"menu_beauty";
  19. static NSString *FaceImg = @"face";
  20. static NSString *CameraImg = @"beautyCamera";
  21. static NSString *FilterImg = @"menu_filter";
  22. static NSString *SpecificImg = @"menu_special";
  23. static NSString *HahaImg = @"haha";
  24. static NSString *MakeUpImg =@"beautyMakeup";
  25. @interface MHMeiyanMenusView()<UICollectionViewDelegate,UICollectionViewDataSource,MHBeautyAssembleViewDelegate,MHStickersViewDelegate,MHMagnifiedViewDelegate,MHSpecificAssembleViewDelegate,MHBeautyManagerDelegate,MHMakeUpViewDelegate>
  26. @property (nonatomic, strong) MHBeautyManager *beautyManager;//美型特性管理器,必须传入
  27. @property (nonatomic, strong) UICollectionView *collectionView;
  28. //@property (nonatomic, strong) NSMutableArray *array;
  29. @property (nonatomic, strong) UIView *currentView;
  30. @property (nonatomic, assign) NSInteger lastIndex;//上一个index
  31. @property (nonatomic, strong) UIView *superView;
  32. @property (nonatomic, strong) MHMagnifiedView *magnifiedView;//哈哈镜
  33. @property (nonatomic, strong) MHBeautyAssembleView *beautyAssembleView;//美颜集合
  34. @property (nonatomic, strong) MHSpecificAssembleView *specificAssembleView;//特效集合
  35. @property (nonatomic, strong) MHStickersView *stickersView;//贴纸
  36. @property (nonatomic, strong) MHMakeUpView *makeUpView;//美妆
  37. @property (nonatomic, assign) BOOL menuHidden;
  38. @property (nonatomic, assign) int sdkLevelTYpe;///<sdk类型
  39. @property (nonatomic, assign) BOOL isShowStatusLabel;///<是否显示提示状态label
  40. @property (nonatomic, strong) UILabel * statusLabel;
  41. @property(nonatomic,strong)UIButton *switchLanguageBtn;
  42. @property(nonatomic,strong)NSMutableArray *facesArray;//处理美型数据
  43. @property(nonatomic,strong)NSMutableArray *beautiesArray;//处理美颜数据
  44. @end
  45. @implementation MHMeiyanMenusView
  46. #pragma mark - 调用上次保存美颜数据/第一次使用读取默认数据
  47. - (void)setupDefaultBeautyAndFaceValue{
  48. /***
  49. 针对自己项目的实际情况修改MHBeautyParams.h 文件里的kDefaultValueFromLocal。NO表示从接口获取,YES表示读取本地plist文件的数据.默认是YES
  50. ***/
  51. //设置美型默认数据
  52. NSArray *faceArr = [[MHSDK shareInstance] faceArr];
  53. if (IsArrayWithAnyItem(faceArr)) {
  54. for (int i = 0; i<faceArr.count; i++) {
  55. NSString *faceKey = [NSString stringWithFormat:@"face_%ld",(long)i];
  56. //读取之前设置的美型数值,如果是未设置过,则点击后读取默认的数值,默认数值参考MHFaceParams.plist
  57. NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:faceKey];
  58. if (i != 0) {
  59. [self handleFaceBeautyWithType:i sliderValue:value.integerValue];
  60. }
  61. }
  62. }
  63. //美颜默认数据
  64. NSArray *beautyArr = [[MHSDK shareInstance] skinArray];
  65. if (IsArrayWithAnyItem(beautyArr)) {
  66. for (int i = 0; i<beautyArr.count; i++) {
  67. NSString *faceKey = [NSString stringWithFormat:@"beauty_%ld",(long)i];
  68. // //读取之前设置的数值,如果是未设置过,则点击后读取默认的数值,默认数值参考MHBeautyParams.plist
  69. NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:faceKey];
  70. if (i != 0) {
  71. [self handleBeautyWithType:i level:(value.integerValue/10.0)];
  72. }
  73. }
  74. }
  75. //一键美颜默认数据
  76. //如果想要实现保存一键美颜效果,需要将(MHBeautyParams.h中的)isSaveOneclickBeauty = YES
  77. NSArray *oneclickArr = [[MHSDK shareInstance] completeBeautyArray];
  78. if (IsArrayWithAnyItem(oneclickArr)) {
  79. MHBeautiesModel *model;
  80. NSSet *set = [NSSet setWithObjects:[NSString class],[NSNumber class],[MHBeautiesModel class], nil];
  81. NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kOneclickBeauty];
  82. if (data && ![data isKindOfClass:[NSString class]]) {
  83. if (@available(iOS 11.0,*)) {
  84. model = [NSKeyedUnarchiver unarchivedObjectOfClasses:set fromData:data error:nil];
  85. }else{
  86. model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  87. }
  88. //因为一键美颜默认值是50,所以如果是50,则默认用户未调整过slider,还是使用一键美颜的各个参数默认值
  89. if (model.defaultValue.integerValue == 50) {
  90. [self handleQuickBeautyValue:model];
  91. }else{
  92. [self handleQuickBeautyWithSliderValue:model.defaultValue.integerValue quickBeautyModel:model];
  93. }
  94. }
  95. }
  96. //读取美妆效果
  97. [self getSavedMakeupData];
  98. //获取保存的贴纸
  99. [self getSavedStickerData];
  100. //获取保存的滤镜效果
  101. [self getSavedFiltersData];
  102. //获取保存的特效效果
  103. [self getSacedSpecialFilterData];
  104. //获取保存的水印效果
  105. [self getSavedWatermarkData];
  106. //获取保存的哈哈镜效果
  107. [self getSavedHahaMirrorData];
  108. //获取动作贴纸效果
  109. [self getSavedActionData];
  110. }
  111. //读取上次选中的水印
  112. - (void)getSavedWatermarkData{
  113. NSDictionary *info = [[NSUserDefaults standardUserDefaults] objectForKey:kMHWatermark];
  114. if (IsDictionaryWithAnyKeyValue(info)) {
  115. NSNumber *aliment = [info objectForKey:@"kWatermarkAliment"];
  116. NSString *name = [info valueForKey:@"KWatermarkName"];
  117. [self.beautyManager setWatermark:name alignment:aliment.integerValue];
  118. }
  119. }
  120. //读取上次选中的哈哈镜
  121. - (void)getSavedHahaMirrorData{
  122. NSInteger type = [[NSUserDefaults standardUserDefaults] integerForKey:kMHHaHaMirror];
  123. [self handleMagnify:type withIsMenu:NO];
  124. }
  125. //获取保存的动作贴纸效果
  126. - (void)getSavedActionData{
  127. NSDictionary *info = [[NSUserDefaults standardUserDefaults] objectForKey:kMHAction];
  128. if ([info isKindOfClass:[NSDictionary class]]) {
  129. NSString *content = info[@"content"];
  130. NSNumber *action = info[@"kaction"];
  131. [self.beautyManager setSticker:content action:action.intValue];
  132. dispatch_async(dispatch_get_main_queue(), ^{
  133. switch (action.intValue) {
  134. case 0:
  135. {
  136. self.statusLabel.hidden = YES;
  137. self.statusLabel.text = @"";
  138. }
  139. break;
  140. case 1:
  141. {
  142. self.statusLabel.hidden = NO;
  143. self.statusLabel.text = @"请抬头";
  144. }
  145. break;
  146. case 2:
  147. {
  148. self.statusLabel.hidden = NO;
  149. self.statusLabel.text = @"请张嘴";
  150. }
  151. break;
  152. case 3:
  153. {
  154. self.statusLabel.hidden = NO;
  155. self.statusLabel.text = @"请眨眼";
  156. }
  157. break;
  158. default:
  159. break;
  160. }
  161. });
  162. if ([MHSDK shareInstance].menuArray.count > 0) {
  163. for (MHBeautiesModel * model in self.array) {
  164. NSString * itemName = model.beautyTitle;
  165. if ([itemName isEqualToString:@"贴纸"]) {
  166. [self.stickersView clearStikerUI];
  167. }
  168. }
  169. }
  170. }else{
  171. //_beautyManager.isUseSticker = NO;
  172. }
  173. }
  174. //读取上次选中的贴纸
  175. -(void)getSavedStickerData{
  176. NSDictionary *info = [[NSUserDefaults standardUserDefaults] objectForKey:kMHSticker];
  177. if (IsDictionaryWithAnyKeyValue(info)) {
  178. NSNumber *level = [info objectForKey:@"kLevel"];
  179. [self.beautyManager setSticker:[info objectForKey:@"content"] withLevel:level.intValue];
  180. }
  181. }
  182. //读取滤镜效果
  183. - (void)getSavedFiltersData{
  184. NSDictionary *info = [[NSUserDefaults standardUserDefaults] objectForKey:kMHFilter];
  185. if (IsDictionaryWithAnyKeyValue(info)) {
  186. NSNumber *type = [info objectForKey:@"kFilterType"];
  187. NSString *name = [info objectForKey:@"kFilterName"];
  188. [self handleFiltersEffectWithType:type.integerValue withFilterName:name];
  189. }
  190. }
  191. //读取美妆效果
  192. -(void)getSavedMakeupData{
  193. if ([MHSDK shareInstance].makeupArray.count == 0) {
  194. return;
  195. }
  196. for (int i = 1; i < 4; i++) {
  197. NSString *makeUpKey = [NSString stringWithFormat:@"kMHMakeup_%d",i];
  198. BOOL isSelected = [[NSUserDefaults standardUserDefaults] boolForKey:makeUpKey];
  199. if (isSelected) {
  200. self.beautyManager.isUseMakeUp = YES;
  201. [self.beautyManager setBeautyManagerMakeUpType:i withOn:isSelected];
  202. }
  203. }
  204. }
  205. //读取上次选中的特效
  206. - (void)getSacedSpecialFilterData{
  207. NSNumber *type = [[NSUserDefaults standardUserDefaults] objectForKey:kMHSpecialFilter];
  208. [self handleSpecificWithType:type.integerValue];
  209. }
  210. - (instancetype)initWithTXBeautyFrame:(CGRect)frame superView:(UIView *)superView delegate:(id<MHMeiyanMenusViewDelegate>)delegate beautyManager:(MHBeautyManager *)manager{
  211. if (self = [super initWithFrame:frame]) {
  212. self.superView = superView;
  213. self.delegate = delegate;
  214. self.menuHidden = NO;
  215. self.isTX = YES;
  216. self.beautyManager = manager;
  217. self.beautyManager.delegate = self;
  218. [self configureInfo];
  219. }
  220. return self;
  221. }
  222. - (instancetype)initWithFrame:(CGRect)frame superView:(UIView *)superView beautyManager:(MHBeautyManager *)manager{
  223. if (self = [super initWithFrame:frame]) {
  224. self.superView = superView;
  225. self.menuHidden = NO;
  226. self.isTX = NO;
  227. self.beautyManager = manager;
  228. self.beautyManager.delegate = self;
  229. [self configureInfo];
  230. }
  231. return self;
  232. }
  233. - (instancetype)initWithFrame:(CGRect)frame superView:(UIView *)superView delegate:(id<MHMeiyanMenusViewDelegate>)delegate beautyManager:(MHBeautyManager *)manager isTXSDK:(BOOL)isTx{
  234. if (self = [super initWithFrame:frame]) {
  235. self.superView = superView;
  236. self.menuHidden = NO;
  237. self.isTX = isTx;
  238. self.beautyManager = manager;
  239. self.beautyManager.delegate = self;
  240. [self configureInfo];
  241. }
  242. return self;
  243. }
  244. - (void)configureInfo{
  245. [self addSubview:self.collectionView];
  246. self.lastIndex = -1;
  247. if ([MHSDK shareInstance].menuArray.count > 0) {
  248. for (MHBeautiesModel * model in self.array) {
  249. NSString * itemName = model.beautyTitle;
  250. if ([itemName isEqualToString:@"贴纸"]) {
  251. [self getSticks];
  252. }
  253. // else if ([itemName isEqualToString:@"特效"]){
  254. // [self.specificAssembleView getActionSource];
  255. // }
  256. }
  257. }
  258. [self.superView addSubview:self.statusLabel];
  259. [self configureBeautyData];
  260. [self configureFaceData];
  261. }
  262. #pragma mark - 处理美颜数据
  263. - (void)configureBeautyData{
  264. if (IsArrayWithAnyItem(self.beautiesArray)) {
  265. return;//保证只初始化加载一次
  266. }
  267. NSMutableArray * selectedItemArray = [MHSDK shareInstance].skinArray;
  268. NSString *path = [[NSBundle mainBundle] pathForResource:@"MHBeautyParams" ofType:@"plist"];
  269. NSArray *items = [NSArray arrayWithContentsOfFile:path];
  270. NSMutableArray * selectedItems = [NSMutableArray array];
  271. for (int i = 0; i < selectedItemArray.count; i ++) {
  272. NSDictionary * selectedItemDic = selectedItemArray[i];
  273. NSString * selectedName = selectedItemDic[@"name"];
  274. for (int j = 0; j < items.count; j++) {
  275. NSDictionary * itemDic = items[j];
  276. NSString * itemName = itemDic[@"name"];
  277. if ([selectedName isEqual:itemName]) {
  278. [selectedItems addObject:itemDic];
  279. }
  280. }
  281. }
  282. _beautiesArray = [NSMutableArray array];
  283. NSDictionary *indexDic = [[NSUserDefaults standardUserDefaults] objectForKey:kMHBeautyTitle];
  284. NSString *title = @"";
  285. if(IsDictionaryWithAnyKeyValue(indexDic)){
  286. title = indexDic.allKeys.firstObject;
  287. }
  288. BOOL hasValue = [[NSUserDefaults standardUserDefaults] boolForKey:@"HasDefaultValue_Beauty"];
  289. for (int i = 0; i<selectedItems.count; i++) {
  290. NSDictionary * itemDic = selectedItems[i];
  291. MHBeautiesModel *model = [[MHBeautiesModel alloc] init];
  292. model.imgName = itemDic[@"imageName"];
  293. model.beautyTitle = itemDic[@"name"];
  294. model.menuType = MHBeautyMenuType_Beauty;
  295. model.type = [itemDic[@"type"] integerValue];
  296. model.originalValue = itemDic[@"value"];
  297. model.isSelected = [model.beautyTitle isEqualToString:title];
  298. if(kDefaultValueFromLocal && !hasValue){
  299. NSString *beautKey = [NSString stringWithFormat:@"beauty_%ld",model.type];
  300. [[NSUserDefaults standardUserDefaults] setInteger:model.originalValue.integerValue forKey:beautKey];//存储默认数值
  301. }
  302. [_beautiesArray addObject:model];
  303. }
  304. [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasDefaultValue_Beauty"];
  305. }
  306. #pragma mark - 处理美型数据
  307. - (void)configureFaceData {
  308. NSMutableArray * selectedItemArray = [MHSDK shareInstance].faceArr;
  309. _facesArray = [NSMutableArray arrayWithCapacity:selectedItemArray.count];
  310. NSString *path = [[NSBundle mainBundle] pathForResource:@"MHFaceParams" ofType:@"plist"];
  311. NSArray *items = [NSArray arrayWithContentsOfFile:path];
  312. NSMutableArray * selectedItems = [NSMutableArray array];
  313. for (int i = 0; i < selectedItemArray.count; i ++) {
  314. NSDictionary * selectedItemDic = selectedItemArray[i];
  315. NSString * selectedName = selectedItemDic[@"name"];
  316. for (int j = 0; j < items.count; j++) {
  317. NSDictionary * itemDic = items[j];
  318. NSString * itemName = itemDic[@"name"];
  319. if ([selectedName isEqual:itemName]) {
  320. [selectedItems addObject:itemDic];
  321. }
  322. }
  323. }
  324. NSDictionary *indexDic = [[NSUserDefaults standardUserDefaults] objectForKey:kMHFaceTitle];
  325. NSString *selectTitle = @"";
  326. if(IsDictionaryWithAnyKeyValue(indexDic)){
  327. selectTitle = indexDic.allKeys.firstObject;
  328. }
  329. BOOL hasValue = [[NSUserDefaults standardUserDefaults] boolForKey:@"HasDefaultValue_Face"];
  330. for (int i = 0; i<selectedItems.count; i++) {
  331. NSDictionary * itemDic = items[i];
  332. MHBeautiesModel *model = [[MHBeautiesModel alloc] init];
  333. model.imgName = itemDic[@"imageName"];
  334. model.beautyTitle = itemDic[@"name"];
  335. model.menuType = MHBeautyMenuType_Face;
  336. model.type = [itemDic[@"type"] integerValue];
  337. model.originalValue = itemDic[@"value"];
  338. model.isSelected = [model.beautyTitle isEqual:selectTitle];
  339. if(kDefaultValueFromLocal && !hasValue){
  340. NSString *faceKey = [NSString stringWithFormat:@"face_%ld",model.type];
  341. [[NSUserDefaults standardUserDefaults] setInteger:model.originalValue.integerValue forKey:faceKey];//存储默认数值
  342. }
  343. [_facesArray addObject:model];
  344. }
  345. [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"HasDefaultValue_Face"];
  346. }
  347. //是否显示美颜界面
  348. - (void)showMenuView:(BOOL)show {
  349. if (self.currentView) {
  350. [UIView animateWithDuration:0.3 animations:^{
  351. self.currentView.frame = CGRectMake(0, window_height, window_width, self.currentView.frame.size.height);
  352. } completion:^(BOOL finished) {
  353. [self.currentView removeFromSuperview];
  354. self.show = YES;
  355. self.currentView = nil;
  356. self.hidden = NO;
  357. return;
  358. }];
  359. }
  360. if (show) {
  361. if (![self isDescendantOfView:self.superView]) {
  362. [self.superView addSubview:self];
  363. }
  364. } else {
  365. [self removeFromSuperview];
  366. }
  367. self.show = show;
  368. self.hidden = !show;
  369. }
  370. - (void)showMenusWithoutRecord:(BOOL)show {
  371. self.menuHidden = !show;
  372. [self.collectionView reloadData];
  373. }
  374. #pragma mark - 是否使用腾讯的美颜
  375. - (void)setIsTX:(BOOL)isTX {
  376. _isTX = isTX;
  377. self.beautyAssembleView.isTXSDK = isTX;
  378. }
  379. #pragma mark - delegate 处理美颜效果
  380. //美颜-需要实现代理方法,调用腾讯的美白磨皮红润方法,只适用于腾讯直播SDK
  381. - (void)beautyLevel:(NSInteger)beauty whitenessLevel:(NSInteger)white ruddinessLevel:(NSInteger)ruddiness brightnessLevel:(NSInteger)brightness{
  382. if ([self.delegate respondsToSelector:@selector(beautyEffectWithLevel:whitenessLevel:ruddinessLevel:)]) {
  383. [self.delegate beautyEffectWithLevel:beauty whitenessLevel:white ruddinessLevel:ruddiness];
  384. }
  385. [_beautyManager setBrightnessLift:(int)brightness];
  386. }
  387. //美颜-非腾讯直播SDK使用
  388. - (void)handleBeautyWithType:(NSInteger)type level:(CGFloat)beautyLevel {
  389. switch (type) {
  390. case MHBeautyType_Original:{
  391. [_beautyManager setRuddiness:0];
  392. [_beautyManager setSkinWhiting:0];
  393. [_beautyManager setBuffing:0.0];
  394. }
  395. break;
  396. case MHBeautyType_Mopi:
  397. [_beautyManager setBuffing:beautyLevel];
  398. break;
  399. case MHBeautyType_White:
  400. [_beautyManager setSkinWhiting:beautyLevel];
  401. break;
  402. case MHBeautyType_Ruddiess:
  403. [_beautyManager setRuddiness:beautyLevel];
  404. break;
  405. case MHBeautyType_Brightness:
  406. [_beautyManager setBrightnessLift:beautyLevel];
  407. break;
  408. default:
  409. break;
  410. }
  411. }
  412. //美型
  413. -(void)handleFaceBeautyWithType:(NSInteger)type sliderValue:(NSInteger)value {
  414. self.beautyManager.isUseFaceBeauty = YES;
  415. switch (type) {
  416. case MHBeautyFaceType_Original:{
  417. //原图-->人脸识别设置
  418. self.beautyManager.isUseFaceBeauty = NO;
  419. [self.beautyManager setFaceLift:0];
  420. [self.beautyManager setBigEye:0];
  421. [self.beautyManager setMouthLift:0];
  422. [self.beautyManager setNoseLift:0];
  423. [self.beautyManager setChinLift:50];
  424. [self.beautyManager setForeheadLift:50];
  425. [self.beautyManager setEyeBrownLift:50];
  426. [self.beautyManager setEyeAngleLift:50];
  427. [self.beautyManager setEyeAlaeLift:50];
  428. [self.beautyManager setShaveFaceLift:0];
  429. [self.beautyManager setEyeDistanceLift:50];
  430. }
  431. break;
  432. case MHBeautyFaceType_ThinFace:
  433. [self.beautyManager setFaceLift:(int)value];
  434. break;
  435. case MHBeautyFaceType_BigEyes:
  436. [self.beautyManager setBigEye:(int)value];
  437. break;
  438. case MHBeautyFaceType_Mouth:
  439. [self.beautyManager setMouthLift:(int)value];
  440. break;
  441. case MHBeautyFaceType_Nose:
  442. [self.beautyManager setNoseLift:(int)value];
  443. break;
  444. case MHBeautyFaceType_Chin:
  445. [self.beautyManager setChinLift:(int)value];
  446. break;
  447. case MHBeautyFaceType_Forehead:
  448. [self.beautyManager setForeheadLift:(int)value];
  449. break;
  450. case MHBeautyFaceType_Eyebrow:
  451. [self.beautyManager setEyeBrownLift:(int)value];
  452. break;
  453. case MHBeautyFaceType_Canthus:
  454. [self.beautyManager setEyeAngleLift:(int)value];
  455. break;
  456. case MHBeautyFaceType_EyeAlae:
  457. [self.beautyManager setEyeAlaeLift:(int)value];
  458. break;
  459. case MHBeautyFaceType_EyeDistance:
  460. [self.beautyManager setEyeDistanceLift:(int)value];
  461. break;
  462. case MHBeautyFaceType_ShaveFace:
  463. [self.beautyManager setShaveFaceLift:(int)value];
  464. break;
  465. case MHBeautyFaceType_LongNose:
  466. [self.beautyManager setLengthenNoseLift:(int)value];
  467. break;
  468. default:
  469. break;
  470. }
  471. }
  472. //一键美颜
  473. - (void)handleQuickBeautyValue:(MHBeautiesModel *)model {
  474. if (model.type == 0){
  475. self.beautyManager.isUseOneKey = NO;
  476. }else{
  477. self.beautyManager.isUseOneKey = YES;
  478. }
  479. [self.beautyManager setFaceLift:model.face_defaultValue.intValue];
  480. [self.beautyManager setBigEye:model.bigEye_defaultValue.intValue];
  481. [self.beautyManager setMouthLift:model.mouth_defaultValue.intValue];
  482. [self.beautyManager setNoseLift:model.nose_defaultValue.intValue];
  483. [self.beautyManager setChinLift:model.chin_defaultValue.intValue];
  484. [self.beautyManager setForeheadLift:model.forehead_defaultValue.intValue];
  485. [self.beautyManager setEyeBrownLift:model.eyeBrown_defaultValue.intValue];
  486. [self.beautyManager setEyeAngleLift:model.eyeAngle_defaultValue.intValue];
  487. [self.beautyManager setEyeAlaeLift:model.eyeAlae_defaultValue.intValue];
  488. [self.beautyManager setShaveFaceLift:model.shaveFace_defaultValue.intValue];
  489. [self.beautyManager setEyeDistanceLift:model.eyeDistance_defaultValue.intValue];
  490. if (self.isTX) {
  491. if ([self.delegate respondsToSelector:@selector(beautyEffectWithLevel:whitenessLevel:ruddinessLevel:)]) {
  492. [self.delegate beautyEffectWithLevel:model.buffingValue.integerValue whitenessLevel:model.whiteValue.integerValue ruddinessLevel:model.ruddinessValue.integerValue];
  493. }
  494. } else {
  495. [_beautyManager setRuddiness:(model.ruddinessValue.floatValue)/9.0];
  496. [_beautyManager setSkinWhiting:(model.whiteValue.floatValue)/9.0];
  497. [_beautyManager setBuffing:(model.buffingValue.floatValue)/9.0];
  498. }
  499. }
  500. - (void)handleQuickBeautyWithSliderValue:(NSInteger)value quickBeautyModel:(nonnull MHBeautiesModel *)model{
  501. if (!model) {
  502. return;
  503. }
  504. if (value >= model.bigEye_minValue.integerValue && value <= model.bigEye_maxValue.integerValue) {
  505. [self.beautyManager setBigEye:(int)value];
  506. }
  507. if (value >= model.face_minValue.integerValue && value <= model.face_minValue.integerValue) {
  508. [self.beautyManager setFaceLift:(int)value];
  509. }
  510. if (value >= model.mouth_minValue.integerValue && value <= model.mouth_maxValue.integerValue) {
  511. [self.beautyManager setMouthLift:(int)value];
  512. }
  513. if (value >= model.shaveFace_minValue.integerValue && value <= model.shaveFace_maxValue.integerValue) {
  514. [self.beautyManager setShaveFaceLift:(int)value];
  515. }
  516. if (value >= model.eyeAlae_minValue.integerValue && value <= model.eyeAlae_maxValue.integerValue) {
  517. [self.beautyManager setEyeAlaeLift:(int)value];
  518. }
  519. if (value >= model.eyeAngle_minValue.integerValue && value <= model.eyeAngle_maxValue.integerValue) {
  520. [self.beautyManager setEyeAngleLift:(int)value];
  521. }
  522. if (value >= model.eyeBrown_minValue.integerValue && value <= model.eyeBrown_maxValue.integerValue) {
  523. [self.beautyManager setEyeBrownLift:(int)value];
  524. }
  525. if (value >= model.forehead_minValue.integerValue && value <= model.forehead_maxValue.integerValue) {
  526. [self.beautyManager setForeheadLift:(int)value];
  527. }
  528. if (value >= model.chin_minValue.integerValue && value <= model.chin_maxValue.integerValue) {
  529. [self.beautyManager setChinLift:(int)value];
  530. }
  531. if (value >= model.nose_minValue.integerValue && value <= model.nose_maxValue.integerValue) {
  532. [self.beautyManager setNoseLift:(int)value];
  533. }
  534. if (value >= model.eyeDistance_minValue.integerValue && value <= model.eyeDistance_maxValue.integerValue) {
  535. [self.beautyManager setEyeDistanceLift:(int)value];
  536. }
  537. }
  538. //滤镜
  539. - (void)handleFiltersEffectWithType:(NSInteger)filter withFilterName:(nonnull NSString *)filterName{
  540. MHFilterModel *model = [MHFilterModel unzipFiltersFile:filterName];
  541. if (model) {
  542. NSDictionary *dic = @{@"kUniformList":model.uniformList,
  543. @"kUniformData":model.uniformData,
  544. @"kUnzipDesPath":model.unzipDesPath,
  545. @"kName":model.name,
  546. @"kFragmentShader":model.fragmentShader
  547. };
  548. [_beautyManager setFilterType:filter newFilterInfo:dic];
  549. } else {
  550. [_beautyManager setFilterType:filter newFilterInfo:[NSDictionary dictionary]];
  551. }
  552. }
  553. ///<照相
  554. - (void)takePhoto{
  555. if ([self.delegate respondsToSelector:@selector(cameraAction)]) {
  556. [self.delegate cameraAction];
  557. }
  558. }
  559. ///<隐藏
  560. - (void)clickPackUp{
  561. [self showMenuView:YES];
  562. }
  563. //水印
  564. - (void)handleWatermarkWithModel:(MHBeautiesModel *)model {
  565. [self.beautyManager setWatermark:model.imgName alignment:model.aliment];
  566. }
  567. //特效
  568. - (void)handleSpecificWithType:(NSInteger)type {
  569. [self.beautyManager setJitterType:type];
  570. }
  571. //动作识别
  572. - (void)handleSpecificStickerActionEffect:(NSString *)stickerContent sticker:(StickerDataListModel *)model action:(int)action{
  573. if (model == nil || action == 0){
  574. _beautyManager.isUseSticker = NO;
  575. }else{
  576. _beautyManager.isUseSticker = YES;
  577. }
  578. [self.beautyManager setSticker:stickerContent action:action];
  579. dispatch_async(dispatch_get_main_queue(), ^{
  580. switch (action) {
  581. case 0:
  582. {
  583. self.statusLabel.hidden = YES;
  584. self.statusLabel.text = @"";
  585. }
  586. break;
  587. case 1:
  588. {
  589. self.statusLabel.hidden = NO;
  590. self.statusLabel.text = @"请抬头";
  591. }
  592. break;
  593. case 2:
  594. {
  595. self.statusLabel.hidden = NO;
  596. self.statusLabel.text = @"请张嘴";
  597. }
  598. break;
  599. case 3:
  600. {
  601. self.statusLabel.hidden = NO;
  602. self.statusLabel.text = @"请眨眼";
  603. }
  604. break;
  605. default:
  606. break;
  607. }
  608. if ([MHSDK shareInstance].menuArray.count > 0) {
  609. for (MHBeautiesModel * model in self.array) {
  610. NSString * itemName = model.beautyTitle;
  611. if ([itemName isEqualToString:@"贴纸"]) {
  612. [self.stickersView clearStikerUI];
  613. }
  614. }
  615. }
  616. });
  617. }
  618. //美妆
  619. - (void)handleMakeUpType:(NSInteger)type withON:(BOOL)On{
  620. if (type == 0) {
  621. self.beautyManager.isUseMakeUp = NO;
  622. }else{
  623. self.beautyManager.isUseMakeUp = YES;
  624. }
  625. [self.beautyManager setBeautyManagerMakeUpType:type withOn:On];
  626. }
  627. - (void)getManagerActionStatus:(BOOL)hidden{
  628. dispatch_async(dispatch_get_main_queue(), ^{
  629. self.statusLabel.hidden = YES;
  630. self.statusLabel.text = @"";
  631. });
  632. }
  633. //特效里面的哈哈镜
  634. - (void)handleMagnityWithType:(NSInteger)type{
  635. [self handleMagnify:type withIsMenu:NO];
  636. }
  637. //哈哈镜
  638. -(void)handleMagnify:(NSInteger)type withIsMenu:(BOOL)isMenu{
  639. if (type == 0){
  640. _beautyManager.isUseHaha = NO;
  641. }else{
  642. _beautyManager.isUseHaha = YES;
  643. }
  644. [_beautyManager setDistortType:type withIsMenu:isMenu];
  645. }
  646. //贴纸
  647. - (void)handleStickerEffect:(NSString *)stickerContent sticker:(StickerDataListModel *)model withLevel:(NSInteger)level{
  648. if (model == nil){
  649. _beautyManager.isUseSticker = NO;
  650. }else{
  651. _beautyManager.isUseSticker = YES;
  652. }
  653. [self.beautyManager setSticker:stickerContent withLevel:level];
  654. if (_specificAssembleView) {
  655. dispatch_async(dispatch_get_main_queue(), ^{
  656. if (self.statusLabel.hidden == NO) {
  657. self.statusLabel.hidden = YES;
  658. self.statusLabel.text = @"";
  659. }
  660. [self->_specificAssembleView clearAllActionEffects];
  661. });
  662. }
  663. }
  664. - (BOOL)stickerIsExistWithStickerName:(NSString * )stickerName{
  665. NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"sticker"];
  666. NSString * path1 = [path stringByAppendingPathComponent:stickerName];
  667. if (![[NSFileManager defaultManager] fileExistsAtPath:path1]) {
  668. return NO;
  669. }
  670. return YES;
  671. }
  672. #pragma mark - 贴纸解析
  673. - (void)getSticks {
  674. __weak typeof(self) weakSelf = self;
  675. if ([MHSDK shareInstance].stickerArray.count == 0) {
  676. return;
  677. }
  678. NSDictionary * itemDic = [MHSDK shareInstance].stickerArray[0];
  679. NSString * oldStickerVersion = [[NSUserDefaults standardUserDefaults] objectForKey:OldStickerVesion];
  680. NSString * stickerVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"sticker_version"];
  681. NSArray * stickerArr = [[NSUserDefaults standardUserDefaults] objectForKey:itemDic[@"name"]];
  682. NSMutableArray * stickerMutArr = [NSMutableArray array];
  683. for (NSData * data in stickerArr) {
  684. StickerDataListModel * model = [NSKeyedUnarchiver unarchiveObjectWithData:data];
  685. model.is_downloaded = [self stickerIsExistWithStickerName:model.name]?@"1":@"0";
  686. [stickerMutArr addObject:model];
  687. }
  688. if ((oldStickerVersion && oldStickerVersion.length > 0) && (stickerMutArr && stickerMutArr.count > 0)&& ([oldStickerVersion isEqual:stickerVersion])) {
  689. [weakSelf.stickersView configureStickers:stickerMutArr];
  690. }else{
  691. NSString * urlString = [NSString stringWithFormat:@"%@%@",@"https://data.facegl.com",itemDic[@"mark"]];
  692. NSData *data = [urlString dataUsingEncoding:NSUTF8StringEncoding];
  693. urlString = [data base64EncodedStringWithOptions:0];
  694. dispatch_async(dispatch_queue_create("com.suory.stickers", DISPATCH_QUEUE_SERIAL), ^{
  695. [[StickerManager sharedManager] requestStickersListWithUrl:urlString Success:^(NSArray<StickerDataListModel *> * _Nonnull stickerArray) {
  696. dispatch_async(dispatch_get_main_queue(), ^{
  697. [weakSelf.stickersView configureStickers:stickerArray];
  698. NSMutableArray * dataArray = [NSMutableArray arrayWithCapacity:stickerArray.count];
  699. for (StickerDataListModel * model in stickerArray) {
  700. NSData * data = [NSKeyedArchiver archivedDataWithRootObject:model requiringSecureCoding:YES error:nil];
  701. [dataArray addObject:data];
  702. }
  703. [[NSUserDefaults standardUserDefaults] setObject:dataArray forKey:itemDic[@"name"]];
  704. [[NSUserDefaults standardUserDefaults] setObject:stickerVersion forKey:OldStickerVesion];
  705. });
  706. } Failed:^{
  707. }];
  708. });
  709. }
  710. }
  711. #pragma mark - collectionView
  712. - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
  713. return self.array.count;
  714. }
  715. - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
  716. MHBeautyMenuCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MHBeautyMenuCell" forIndexPath:indexPath];
  717. cell.isSimplification = self.sdkLevelTYpe==2?YES:NO;
  718. cell.menuModel = self.array[indexPath.row];
  719. if (![cell.menuModel.beautyTitle isEqualToString:@"单击拍"]){
  720. cell.hidden = self.menuHidden;
  721. }else{
  722. //短视频图片变化
  723. [cell changeRecordState:self.menuHidden];
  724. }
  725. return cell;
  726. }
  727. - (CGSize)collectionView:(UICollectionView *)collectionView
  728. layout:(UICollectionViewLayout *)collectionViewLayout
  729. sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
  730. return CGSizeMake((window_width-40)/self.array.count, MHMeiyanMenusCellHeight);
  731. }
  732. - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
  733. NSLog(@"点击了MHUI");
  734. if ([MHSDK shareInstance].menuArray.count == 0) {
  735. return;
  736. }
  737. MHBeautiesModel *currentModel = self.array[indexPath.row];
  738. if ([currentModel.beautyTitle isEqual:@""]) {
  739. if ([self.delegate respondsToSelector:@selector(cameraAction)]) {
  740. [self.delegate cameraAction];
  741. }
  742. return;
  743. }
  744. else if([currentModel.beautyTitle isEqual:@"单击拍"]){
  745. if ([self.delegate respondsToSelector:@selector(recordAction)]) {
  746. [self.delegate recordAction];
  747. }
  748. return;
  749. }else if ([currentModel.beautyTitle isEqual:@"特效"]){
  750. [self showBeautyViews:self.specificAssembleView];
  751. }else if ([currentModel.beautyTitle isEqual:@"贴纸"]){
  752. [self showBeautyViews:self.stickersView];
  753. }else if ([currentModel.beautyTitle isEqual:@"美颜"]){
  754. self.beautyAssembleView.facesArr = self.facesArray;
  755. self.beautyAssembleView.beautyArr = self.beautiesArray;
  756. [self.beautyAssembleView configureUI];
  757. [self showBeautyViews:self.beautyAssembleView];
  758. }else if ([currentModel.beautyTitle isEqual:@"哈哈镜"]){
  759. [self showBeautyViews:self.magnifiedView];
  760. }else if ([currentModel.beautyTitle isEqual:@"美妆"]){
  761. [self showBeautyViews:self.makeUpView];
  762. }
  763. currentModel.isSelected = YES;
  764. if (self.lastIndex >= 0) {
  765. MHBeautiesModel *lastModel = self.array[self.lastIndex];
  766. lastModel.isSelected = NO;
  767. }
  768. self.lastIndex = indexPath.row;
  769. [self.collectionView reloadData];
  770. }
  771. #pragma mark - 切换美颜效果分类
  772. - (void)showBeautyViews:(UIView *)currentView {
  773. [self.superView addSubview:currentView];
  774. CGRect rect = currentView.frame;
  775. rect.origin.y = window_height - currentView.frame.size.height - BottomIndicatorHeight;
  776. [currentView setFrame:rect];
  777. self.currentView = currentView;
  778. ///修改MHUI
  779. self.currentView.transform = CGAffineTransformMakeTranslation(0.00, currentView.frame.size.height);
  780. [UIView animateWithDuration:0.3 animations:^{
  781. self.currentView.transform = CGAffineTransformMakeTranslation(0.00, 0.00);
  782. }];
  783. if ([currentView isEqual:self.beautyAssembleView]) {
  784. self.beautyAssembleView.facesArr = self.facesArray;
  785. [self.beautyAssembleView configureUI];
  786. //[self.beautyAssembleView configureSlider];
  787. }
  788. self.hidden = YES;
  789. }
  790. - (void)animationOfTakingPhoto{
  791. MHBeautyMenuCell *cell = (MHBeautyMenuCell*)[self.collectionView cellForItemAtIndexPath:[NSIndexPath indexPathWithIndex:2]];
  792. [cell takePhotoAnimation];
  793. }
  794. #pragma mark - lazy
  795. - (MHBeautyAssembleView *)beautyAssembleView {
  796. if (!_beautyAssembleView) {
  797. _beautyAssembleView = [[MHBeautyAssembleView alloc] initWithFrame:CGRectMake(0, window_height-MHBeautyAssembleViewHeight-BottomIndicatorHeight, window_width, MHBeautyAssembleViewHeight)];
  798. _beautyAssembleView.delegate = self;
  799. }
  800. return _beautyAssembleView;
  801. }
  802. - (MHSpecificAssembleView *)specificAssembleView {
  803. if (!_specificAssembleView) {
  804. _specificAssembleView = [[MHSpecificAssembleView alloc] initWithFrame:CGRectMake(0, window_height-MHSpecificAssembleViewHeight-BottomIndicatorHeight, window_width, MHSpecificAssembleViewHeight)];
  805. _specificAssembleView.delegate = self;
  806. _specificAssembleView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:MHBlackAlpha];
  807. }
  808. return _specificAssembleView;
  809. }
  810. - (MHMagnifiedView *)magnifiedView {
  811. if (!_magnifiedView) {
  812. _magnifiedView = [[MHMagnifiedView alloc] initWithFrame:CGRectMake(0, window_height-MHMagnifyViewHeight-BottomIndicatorHeight, window_width, MHMagnifyViewHeight)];
  813. _magnifiedView.delegate = self;
  814. _magnifiedView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:MHBlackAlpha];
  815. }
  816. return _magnifiedView;
  817. }
  818. - (MHStickersView *)stickersView {
  819. if (!_stickersView) {
  820. _stickersView = [[MHStickersView alloc] initWithFrame:CGRectMake(0, window_height-MHStickersViewHeight-BottomIndicatorHeight , window_width, MHStickersViewHeight)];
  821. _stickersView.delegate = self;
  822. _stickersView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:MHBlackAlpha];
  823. }
  824. return _stickersView;
  825. }
  826. - (MHMakeUpView *)makeUpView {
  827. if (!_makeUpView) {
  828. _makeUpView = [[MHMakeUpView alloc] initWithFrame:CGRectMake(0, window_height-MHMagnifyViewHeight-BottomIndicatorHeight , window_width, MHMagnifyViewHeight)];
  829. _makeUpView.delegate = self;
  830. _makeUpView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:MHBlackAlpha];
  831. }
  832. return _makeUpView;
  833. }
  834. -(NSMutableArray *)array {
  835. if (!_array) {
  836. NSArray * itemArray = @[@{@"贴纸":StickerImg},@{@"美颜":BeautyImg},@{@"":CameraImg},@{@"特效":SpecificImg},@{@"美妆":MakeUpImg},@{@"哈哈镜":HahaImg}];
  837. NSMutableArray * selectedItem = [MHSDK shareInstance].menuArray;
  838. NSMutableArray * arr = [NSMutableArray array];
  839. for (int i = 0; i < selectedItem.count; i++) {
  840. NSString * name = selectedItem[i][@"name"];
  841. for (int j = 0; j < itemArray.count; j++) {
  842. NSDictionary * dic = itemArray[j];
  843. NSString * imageName = dic[name];
  844. if (imageName) {
  845. [arr addObject:dic];
  846. }
  847. }
  848. }
  849. // if (arr.count == 4) {
  850. // [arr insertObject:itemArray[2] atIndex:2];
  851. // }else if(arr.count == 2){
  852. // [arr insertObject:itemArray[2] atIndex:1];
  853. // }
  854. _array = [NSMutableArray array];
  855. for (int i = 0; i<arr.count; i++) {
  856. NSDictionary * dic = arr[i];
  857. MHBeautiesModel *model = [[MHBeautiesModel alloc] init];
  858. model.imgName = dic.allValues[0];
  859. model.beautyTitle = dic.allKeys[0];
  860. model.menuType = MHBeautyMenuType_Menu;
  861. [_array addObject:model];
  862. }
  863. if (_array.count == 0) {
  864. for (int i = 0; i<itemArray.count; i++) {
  865. NSDictionary * dic = itemArray[i];
  866. MHBeautiesModel *model = [[MHBeautiesModel alloc] init];
  867. model.imgName = dic.allValues[0];
  868. model.beautyTitle = dic.allKeys[0];
  869. model.menuType = MHBeautyMenuType_Menu;
  870. [_array addObject:model];
  871. }
  872. }
  873. }
  874. return _array;
  875. }
  876. - (UICollectionView *)collectionView {
  877. if (!_collectionView) {
  878. UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
  879. layout.minimumLineSpacing = 0;
  880. layout.minimumInteritemSpacing = 10;
  881. layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
  882. layout.sectionInset = UIEdgeInsetsMake(0, 20, 0,20);
  883. _collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, window_width, self.frame.size.height) collectionViewLayout:layout];
  884. _collectionView.backgroundColor = [UIColor clearColor];
  885. _collectionView.delegate = self;
  886. _collectionView.dataSource = self;
  887. [_collectionView registerClass:[MHBeautyMenuCell class] forCellWithReuseIdentifier:@"MHBeautyMenuCell"];
  888. }
  889. return _collectionView;
  890. }
  891. - (UILabel*)statusLabel{
  892. if (!_statusLabel) {
  893. _statusLabel = [[UILabel alloc] initWithFrame:CGRectMake((window_width - 60)/2, window_height - MHStickersViewHeight - BottomIndicatorHeight - 50, 60, 22)];
  894. // _statusLabel.backgroundColor = [UIColor redColor];
  895. _statusLabel.text = @"请张嘴";
  896. _statusLabel.hidden = YES;
  897. }
  898. return _statusLabel;
  899. }
  900. - (int)sdkLevelTYpe{
  901. return [[MHSDK shareInstance] getSDKLevel];
  902. }
  903. - (void)getFaceBoundRects:(NSMutableArray *)boundRects{
  904. // for (NSValue * value in boundRects) {
  905. // CGRect rect = [value CGRectValue];
  906. //// NSLog(@"face rect x= %lf, y = %lf,width = %lf,height = %lf",rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);
  907. // }
  908. //
  909. }
  910. @end