BGSettingBeautyView.m 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. //
  2. // BGSettingBeautyView.m
  3. // BuguLive
  4. //
  5. // Created by xfg on 2017/2/17.
  6. // Copyright © 2017年 xfg. All rights reserved.
  7. //
  8. #import "BGSettingBeautyView.h"
  9. #define kBeautyBtnLineNum 3 // 一排n个
  10. #define kBeautyBtnSpace_X 20 // 横向间隔
  11. #define kBeautyBtnSpace_Y 8 // 纵向间隔
  12. #define kBeautyBtnHeight 30 // 按钮高度
  13. @interface BGSettingBeautyView()<UIPickerViewDataSource,UIPickerViewDelegate,UIGestureRecognizerDelegate>
  14. {
  15. NSInteger _curEffectIdx;
  16. NSArray *_effectNames;
  17. NSMutableArray *_beautyBtnArray;
  18. NSArray *_beautyBtnNameArray;
  19. float _beautyBtnWidth;
  20. float _beautyBtnContrianerViewHeight;
  21. NSString *_currentBeautyBtnNameStr;
  22. }
  23. @end
  24. @implementation BGSettingBeautyView
  25. - (id)initWithFrame:(CGRect)frame
  26. {
  27. self = [super initWithFrame:frame];
  28. if (self)
  29. {
  30. _beautyBtnWidth = (frame.size.width - (kBeautyBtnLineNum+1)*kBeautyBtnSpace_X) / kBeautyBtnLineNum;
  31. _beautyBgView = [[UIView alloc]init];
  32. _beautyBgView.backgroundColor = kWhiteColor;
  33. [self addSubview:_beautyBgView];
  34. _beautyBtnContrianerView = [[UIView alloc]init];
  35. _beautyBtnContrianerView.backgroundColor = kWhiteColor;
  36. [_beautyBgView addSubview:_beautyBtnContrianerView];
  37. _beautyBtnArray = [NSMutableArray array];
  38. _beautyBtnNameArray = [NSArray arrayWithObjects:ASLocalizedString(@"关闭美颜"),
  39. ASLocalizedString(@"嫩肤"),
  40. ASLocalizedString(@"白肤"),
  41. ASLocalizedString(@"自然"),
  42. ASLocalizedString(@"柔肤"),
  43. ASLocalizedString(@"白皙"),
  44. ASLocalizedString(@"粉嫩"),
  45. nil];
  46. _beautyBtnContrianerViewHeight = [self createBtn:_beautyBtnNameArray];
  47. _currentBeautyBtnNameStr = [_beautyBtnNameArray firstObject];
  48. _effectNames = [NSArray arrayWithObjects: ASLocalizedString(@"1 小清新"),
  49. ASLocalizedString(@"2 靓丽"),
  50. ASLocalizedString(@"3 甜美可人"),
  51. ASLocalizedString(@"4 怀旧"),
  52. ASLocalizedString(@"5 蓝调"),
  53. ASLocalizedString(@"6 老照片"),
  54. nil];
  55. _curEffectIdx = 1;
  56. // 修改美颜参数
  57. _filterParam1 = [self addSliderName:ASLocalizedString(@"磨皮")From:0 To:100 Init:50];
  58. _filterParam2 = [self addSliderName:ASLocalizedString(@"美白")From:0 To:100 Init:50];
  59. _filterParam3 = [self addSliderName:ASLocalizedString(@"红润")From:0 To:100 Init:50];
  60. _filterParam4 = [self addSliderName:ASLocalizedString(@"参数")From:0 To:100 Init:50];
  61. _filterParam1.hidden = YES;
  62. _filterParam2.hidden = YES;
  63. _filterParam3.hidden = YES;
  64. _filterParam4.hidden = YES;
  65. _effectPicker = [[UIPickerView alloc] init];
  66. [_beautyBgView addSubview:_effectPicker];
  67. _effectPicker.hidden = YES;
  68. _effectPicker.delegate = self;
  69. _effectPicker.dataSource = self;
  70. _effectPicker.showsSelectionIndicator= YES;
  71. UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  72. button.tag = 1;
  73. [self onBtnClick:button];
  74. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapClick:)];
  75. tap.delegate = self;
  76. [self addGestureRecognizer:tap];
  77. }
  78. return self;
  79. }
  80. - (void)layoutUI
  81. {
  82. _beautyBgView.frame = CGRectMake(0, self.frame.size.height-_beautyBtnContrianerViewHeight, self.frame.size.width, _beautyBtnContrianerViewHeight);
  83. [self layoutMyCommponent];
  84. }
  85. - (void)layoutMyCommponent
  86. {
  87. _beautyBtnContrianerView.frame = CGRectMake(0, _beautyBgView.frame.size.height - _beautyBtnContrianerViewHeight, _beautyBgView.frame.size.width, _beautyBtnContrianerViewHeight);
  88. CGRect comFrame = _beautyBgView.frame;
  89. _filterParam4.frame = CGRectMake(kDefaultMargin, CGRectGetMinY(_beautyBtnContrianerView.frame)-40, comFrame.size.width-kDefaultMargin*2, 35);
  90. _filterParam3.frame = CGRectMake(kDefaultMargin, CGRectGetMinY(_beautyBtnContrianerView.frame)-40, comFrame.size.width-kDefaultMargin*2, 35);
  91. _filterParam2.frame = CGRectMake(kDefaultMargin, CGRectGetMinY(_filterParam3.frame)-40, comFrame.size.width-kDefaultMargin*2, 35);
  92. _filterParam1.frame = CGRectMake(kDefaultMargin, CGRectGetMinY(_filterParam2.frame)-40, comFrame.size.width-kDefaultMargin*2, 35);
  93. _effectPicker.frame = CGRectMake(kDefaultMargin, CGRectGetMinY(_filterParam1.frame)-170, comFrame.size.width-kDefaultMargin*2, 160);
  94. }
  95. #pragma mark - ----------------------- 切换美颜 -----------------------
  96. - (void)onBtnClick:(id)sender
  97. {
  98. UIButton *btn = (UIButton *)sender;
  99. _currentBeautyBtnNameStr = _beautyBtnNameArray[btn.tag];
  100. [self setCurrentBeautyBtnColor:btn.tag];
  101. _filterParam1.hidden = YES;
  102. _filterParam2.hidden = YES;
  103. _filterParam3.hidden = YES;
  104. _filterParam4.hidden = YES;
  105. _effectPicker.hidden = YES;
  106. if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"关闭美颜")])
  107. {
  108. _curFilter = nil;
  109. [self layoutUI];
  110. }
  111. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"嫩肤")])
  112. {
  113. _filterParam4.nameL.text = ASLocalizedString(@"嫩肤");
  114. _filterParam4.hidden = NO;
  115. // 构造美颜滤镜
  116. KSYGPUBeautifyExtFilter *currentFilter = [[KSYGPUBeautifyExtFilter alloc] init];
  117. [currentFilter setBeautylevel:_filterParam4.normalValue * 5];
  118. _curFilter = currentFilter;
  119. _beautyBgView.frame = CGRectMake(0, self.frame.size.height-(_beautyBtnContrianerViewHeight+40), self.frame.size.width, _beautyBtnContrianerViewHeight+40);
  120. [self layoutMyCommponent];
  121. }
  122. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"白肤")])
  123. {
  124. _filterParam4.nameL.text = ASLocalizedString(@"白肤");
  125. _filterParam4.hidden = NO;
  126. // 构造美颜滤镜
  127. KSYGPUBeautifyFilter *currentFilter = [[KSYGPUBeautifyFilter alloc] init];
  128. [currentFilter setBeautylevel:_filterParam4.normalValue * 5];
  129. _curFilter = currentFilter;
  130. _beautyBgView.frame = CGRectMake(0, self.frame.size.height-(_beautyBtnContrianerViewHeight+40), self.frame.size.width, _beautyBtnContrianerViewHeight+40);
  131. [self layoutMyCommponent];
  132. }
  133. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"自然")])
  134. {
  135. // 构造美颜滤镜
  136. KSYGPUDnoiseFilter *currentFilter = [[KSYGPUDnoiseFilter alloc] init];
  137. _curFilter = currentFilter;
  138. [self layoutUI];
  139. }
  140. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"柔肤")])
  141. {
  142. _filterParam4.nameL.text = ASLocalizedString(@"柔肤");
  143. _filterParam4.hidden = NO;
  144. // 构造美颜滤镜
  145. KSYGPUBeautifyPlusFilter *currentFilter = [[KSYGPUBeautifyPlusFilter alloc] init];
  146. [currentFilter setBeautylevel:_filterParam4.normalValue * 5];
  147. _curFilter = currentFilter;
  148. _beautyBgView.frame = CGRectMake(0, self.frame.size.height-(_beautyBtnContrianerViewHeight+40), self.frame.size.width, _beautyBtnContrianerViewHeight+40);
  149. [self layoutMyCommponent];
  150. }
  151. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"白皙")])
  152. {
  153. _filterParam2.nameL.text = ASLocalizedString(@"磨皮");
  154. _filterParam2.hidden = NO;
  155. _filterParam3.nameL.text = ASLocalizedString(@"美白");
  156. _filterParam3.hidden = NO;
  157. // 构造美颜滤镜
  158. KSYBeautifyFaceFilter *currentFilter = [[KSYBeautifyFaceFilter alloc] init];
  159. currentFilter.grindRatio = _filterParam2.normalValue;
  160. currentFilter.whitenRatio = _filterParam3.normalValue;
  161. _curFilter = currentFilter;
  162. _beautyBgView.frame = CGRectMake(0, self.frame.size.height-(_beautyBtnContrianerViewHeight+80), self.frame.size.width, _beautyBtnContrianerViewHeight+80);
  163. [self layoutMyCommponent];
  164. }
  165. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"粉嫩")])
  166. {
  167. _filterParam1.nameL.text = ASLocalizedString(@"磨皮");
  168. _filterParam1.hidden = NO;
  169. _filterParam2.nameL.text = ASLocalizedString(@"美白");
  170. _filterParam2.hidden = NO;
  171. _filterParam3.nameL.text = ASLocalizedString(@"红润");
  172. _filterParam3.hidden = NO;
  173. // 构造美颜滤镜
  174. KSYBeautifyProFilter *currentFilter = [[KSYBeautifyProFilter alloc] init];
  175. currentFilter.grindRatio = _filterParam1.normalValue;
  176. currentFilter.whitenRatio = _filterParam2.normalValue;
  177. currentFilter.ruddyRatio = _filterParam3.normalValue;
  178. _curFilter = currentFilter;
  179. _beautyBgView.frame = CGRectMake(0, self.frame.size.height-(_beautyBtnContrianerViewHeight+120), self.frame.size.width, _beautyBtnContrianerViewHeight+120);
  180. [self layoutMyCommponent];
  181. }
  182. if (_onBtnBlock)
  183. {
  184. _onBtnBlock(sender);
  185. }
  186. }
  187. - (void)onSlider:(id)sender
  188. {
  189. if (sender != _filterParam1 &&
  190. sender != _filterParam2 &&
  191. sender != _filterParam3 &&
  192. sender != _filterParam4 )
  193. {
  194. return;
  195. }
  196. float filterVal1 = _filterParam1.slider.value;
  197. float filterVal2 = _filterParam2.slider.value;
  198. float filterVal3 = _filterParam3.slider.value;
  199. float filterVal4 = _filterParam4.slider.value;
  200. if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"关闭美颜")])
  201. {
  202. _filterParam1.slider.value = 0;
  203. _filterParam2.slider.value = 0;
  204. _filterParam3.slider.value = 0;
  205. _filterParam4.slider.value = 0;
  206. }
  207. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"嫩肤")])
  208. {
  209. int val = filterVal4/20; // level 1~5
  210. [(KSYGPUBeautifyExtFilter *)_curFilter setBeautylevel:val];
  211. }
  212. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"白肤")])
  213. {
  214. int val = filterVal4/20; // level 1~5
  215. [(KSYGPUBeautifyFilter *)_curFilter setBeautylevel:val];
  216. }
  217. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"自然")])
  218. {
  219. }
  220. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"柔肤")])
  221. {
  222. int val = filterVal4/20; // level 1~5
  223. [(KSYGPUBeautifyPlusFilter *)_curFilter setBeautylevel:val];
  224. }
  225. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"白皙")])
  226. {
  227. // 对于美白滤镜可以调节磨皮、白皙的等级
  228. KSYBeautifyFaceFilter *filter = (KSYBeautifyFaceFilter *)_curFilter;
  229. if (sender == _filterParam2 )
  230. {
  231. filter.grindRatio = filterVal2/100; //0.0 ~ 0.8 0.7为默认等级
  232. }
  233. if (sender == _filterParam3 )
  234. {
  235. filter.whitenRatio = filterVal3/100;//0.0 ~ 1.0 0.5为默认等级
  236. }
  237. }
  238. else if ([_currentBeautyBtnNameStr isEqualToString:ASLocalizedString(@"粉嫩")])
  239. {
  240. KSYBeautifyProFilter *filter = (KSYBeautifyProFilter *)_curFilter;
  241. if (sender == _filterParam1 )
  242. {
  243. filter.grindRatio = filterVal1/100; // grindRatio ranges from 0.0 to 1.0, with 0.5 as the normal level
  244. }
  245. if (sender == _filterParam2 )
  246. {
  247. filter.whitenRatio = filterVal2/100; // whitenRatio ranges from 0.0 to 1.0, with 0.3 as the normal level
  248. }
  249. if (sender == _filterParam3 )
  250. {
  251. filter.ruddyRatio = filterVal3/100; // ruddyRatio ranges from -1.0 to 1.0, with -0.3 as the normal level
  252. }
  253. }
  254. if (_onBtnBlock)
  255. {
  256. _onBtnBlock(sender);
  257. }
  258. }
  259. #pragma mark - ----------------------- effect picker -----------------------
  260. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView
  261. {
  262. return 1; // 单列
  263. }
  264. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
  265. {
  266. return _effectNames.count;//
  267. }
  268. - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
  269. {
  270. return [_effectNames objectAtIndex:row];
  271. }
  272. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
  273. {
  274. _curEffectIdx = row+1;
  275. if ( [_curFilter isMemberOfClass:[GPUImageFilterGroup class]])
  276. {
  277. GPUImageFilterGroup * fg = (GPUImageFilterGroup *)_curFilter;
  278. KSYBuildInSpecialEffects * sf = (KSYBuildInSpecialEffects *)[fg filterAtIndex:1];
  279. [sf setSpecialEffectsIdx: _curEffectIdx];
  280. }
  281. }
  282. #pragma mark - ----------------------- UI -----------------------
  283. - (float)createBtn:(NSArray *)arrayList
  284. {
  285. CGFloat btn_x = kBeautyBtnSpace_X;
  286. CGFloat btn_y = kBeautyBtnSpace_Y;
  287. for(int i=0; i < [arrayList count]; i ++)
  288. {
  289. UIButton *btn = [self addButton:arrayList[i]];
  290. btn.tag = i;
  291. btn.frame = CGRectMake(btn_x, btn_y, _beautyBtnWidth, kBeautyBtnHeight);
  292. //计算下一个按钮的位置
  293. if (i < [arrayList count]-1)
  294. { //判断是否有下一个按钮
  295. //列
  296. if (self.frame.size.width - (btn_x + _beautyBtnWidth) < _beautyBtnWidth)
  297. {
  298. //换行
  299. btn_x = kBeautyBtnSpace_X;
  300. btn_y = btn_y + kBeautyBtnHeight + kBeautyBtnSpace_Y;
  301. }
  302. else
  303. {
  304. btn_x = btn_x + _beautyBtnWidth + kBeautyBtnSpace_X;
  305. }
  306. }
  307. [_beautyBtnArray addObject:btn];
  308. }
  309. return btn_y + kBeautyBtnHeight + kBeautyBtnSpace_Y;
  310. }
  311. #pragma mark 设置选中btn的颜色
  312. - (void)setCurrentBeautyBtnColor:(NSInteger)btnTag
  313. {
  314. for (UIButton *tmpBtn in _beautyBtnArray)
  315. {
  316. if (tmpBtn.tag == btnTag)
  317. {
  318. [tmpBtn setTitleColor:kAppGrayColor1 forState:UIControlStateNormal];
  319. tmpBtn.layer.borderColor = [kAppGrayColor1 CGColor];
  320. }
  321. else
  322. {
  323. [tmpBtn setTitleColor:kAppGrayColor3 forState:UIControlStateNormal];
  324. tmpBtn.layer.borderColor = [kAppGrayColor3 CGColor];
  325. }
  326. }
  327. }
  328. - (BGNameSlider *)addSliderName: (NSString*) name
  329. From: (float) minV
  330. To: (float) maxV
  331. Init: (float) iniV {
  332. BGNameSlider *sl = [[BGNameSlider alloc] init];
  333. [_beautyBgView addSubview:sl];
  334. sl.slider.minimumValue = minV;
  335. sl.slider.maximumValue = maxV;
  336. sl.slider.value = iniV;
  337. sl.nameL.text = name;
  338. sl.normalValue = (iniV -minV)/maxV;
  339. sl.valueL.text = [NSString stringWithFormat:@"%d", (int)iniV];
  340. if (iniV <2){
  341. sl.precision = 2;
  342. }
  343. [sl.slider addTarget:self action:@selector(onSlider:) forControlEvents:UIControlEventValueChanged ];
  344. __weak typeof(self) ws = self;
  345. sl.onSliderBlock = ^(id sender){
  346. [ws onSlider:sender];
  347. };
  348. return sl;
  349. }
  350. - (UILabel *)addLable:(NSString*)title
  351. {
  352. UILabel * lbl = [[UILabel alloc] init];
  353. lbl.text = title;
  354. [_beautyBgView addSubview:lbl];
  355. lbl.backgroundColor = [UIColor colorWithWhite:0.8 alpha:0.3];
  356. return lbl;
  357. }
  358. - (UIButton *)newButton:(NSString*)title
  359. {
  360. UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  361. [button setTitle: title forState: UIControlStateNormal];
  362. [button setTitleColor:kAppGrayColor2 forState:UIControlStateNormal];
  363. button.titleLabel.font = kAppMiddleTextFont;
  364. button.backgroundColor = kClearColor;
  365. button.layer.cornerRadius = 5;
  366. button.clipsToBounds = YES;
  367. button.layer.borderWidth = kBorderWidth;
  368. button.layer.borderColor = [kAppGrayColor2 CGColor];
  369. [_beautyBtnContrianerView addSubview:button];
  370. return button;
  371. }
  372. - (UIButton *)addButton:(NSString*)title
  373. {
  374. UIButton * button = [self newButton: title];
  375. [button addTarget:self action:@selector(onBtnClick:) forControlEvents:UIControlEventTouchUpInside];
  376. return button;
  377. }
  378. #pragma mark - load resource from resource bundle
  379. + (NSBundle*)KSYGPUResourceBundle
  380. {
  381. static dispatch_once_t onceToken;
  382. static NSBundle *resBundle = nil;
  383. dispatch_once(&onceToken, ^{
  384. resBundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"KSYGPUResource" withExtension:@"bundle"]];
  385. });
  386. return resBundle;
  387. }
  388. + (UIImage*)KSYGPUImageNamed:(NSString*)name
  389. {
  390. UIImage *imageFromMainBundle = [UIImage imageNamed:name];
  391. if (imageFromMainBundle)
  392. {
  393. return imageFromMainBundle;
  394. }
  395. UIImage *imageFromKSYBundle = [UIImage imageWithContentsOfFile:[[[BGSettingBeautyView KSYGPUResourceBundle] resourcePath] stringByAppendingPathComponent:name]];
  396. return imageFromKSYBundle;
  397. }
  398. #pragma mark - ----------------------- 手势 -----------------------
  399. - (void)tapClick:(UITapGestureRecognizer *)tap
  400. {
  401. self.hidden = YES;
  402. }
  403. - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
  404. {
  405. if ([touch.view isDescendantOfView:_beautyBgView])
  406. {
  407. return NO;
  408. }
  409. return YES;
  410. }
  411. @end