TCEditUserInfoViewController.m 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. //
  2. // TCEditUserInfoController.m
  3. // TCLVBIMDemo
  4. //
  5. // Created by jemilyzhou on 16/8/1.
  6. // Copyright © 2016年 tencent. All rights reserved.
  7. //
  8. #import "TCEditUserInfoViewController.h"
  9. #import "TCUserInfoCell.h"
  10. #import "TCUserInfoModel.h"
  11. //#import "TCLoginModel.h"
  12. #import "TCUploadHelper.h"
  13. #import <UIKit/UIKit.h>
  14. #import <mach/mach.h>
  15. #import <Foundation/Foundation.h>
  16. #import <AVFoundation/AVFoundation.h>
  17. #import "UIActionSheet+BlocksKit.h"
  18. #define OPEN_CAMERA 0
  19. #define OPEN_PHOTO 1
  20. @implementation TCEditUserInfoViewController
  21. - (void)viewDidLoad
  22. {
  23. [super viewDidLoad];
  24. UIColor *textColour = [UIColor colorWithRed:36/255.0 green:203/255.0 blue:173/255.0 alpha:1];
  25. self.navigationController.navigationBar.tintColor = textColour;
  26. self.navigationItem.title = NSLocalizedString(@"TCEditUserInfoView.EditProfile", nil);
  27. [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:18],NSForegroundColorAttributeName:[UIColor blackColor]}] ;
  28. self.view.backgroundColor = RGB(0xF3,0xF3,0xF3);
  29. __weak typeof(self) ws = self;
  30. TCUserInfoData *_profile = [[TCUserInfoModel sharedInstance] getUserProfile ];
  31. TCUserInfoCellItem *faceItem = [[TCUserInfoCellItem alloc] initWith:NSLocalizedString(@"TCEditUserInfoView.ItemFace", nil) value:nil type:TCUserInfo_EditFace action:^(TCUserInfoCellItem *menu, TCEditUserInfoTableViewCell *cell) {
  32. [ws modifyUserInfoFaceImage:menu cell:cell]; } ];
  33. TCUserInfoCellItem *nickItem = [[TCUserInfoCellItem alloc] initWith:NSLocalizedString(@"TCEditUserInfoView.ItemNick", nil) value:_profile.nickName type:TCUserInfo_EditNick action:^(TCUserInfoCellItem *menu, TCEditUserInfoTableViewCell *cell) {
  34. nil; }];
  35. TCUserInfoCellItem *genderItem = [[TCUserInfoCellItem alloc] initWith:NSLocalizedString(@"TCEditUserInfoView.ItemSex", nil) value:(USERINFO_MALE == _profile.gender ? NSLocalizedString(@"TCEditUserInfoView.SexMale", nil):NSLocalizedString(@"TCEditUserInfoView.SexFemale", nil)) type:TCUserInfo_EditGender action:^(TCUserInfoCellItem *menu, TCEditUserInfoTableViewCell *cell) {
  36. [ws modifyUserInfoGender:menu cell:cell]; }];
  37. _userInfoArry = [NSMutableArray arrayWithArray:@[faceItem, nickItem, genderItem]];
  38. NSInteger nHeighNavigationBar = self.navigationController.navigationBar.frame.size.height;
  39. NSInteger nStatusBarFrame =[[UIApplication sharedApplication] statusBarFrame].size.height;
  40. CGRect tableViewFrame = CGRectMake(0, nHeighNavigationBar+nStatusBarFrame+20, self.view.frame.size.width, 155);
  41. _tableView = [[UITableView alloc] initWithFrame:tableViewFrame style:UITableViewStylePlain];
  42. _tableView.dataSource = self;
  43. _tableView.delegate = self;
  44. [_tableView setSeparatorColor:RGB(0xD8,0xD8,0xD8)];
  45. //设置tableView不能滚动
  46. [self.tableView setScrollEnabled:NO];
  47. //去掉多余的分割线
  48. [self setExtraCellLineHidden:self.tableView];
  49. [self.view addSubview:_tableView];
  50. self.automaticallyAdjustsScrollViewInsets = NO;
  51. // 点击空白处键盘消失
  52. self.view.userInteractionEnabled = YES;
  53. UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];
  54. singleTap.cancelsTouchesInView = NO;
  55. [self.view addGestureRecognizer:singleTap];
  56. return;
  57. }
  58. -(void)viewWillAppear:(BOOL)animated
  59. {
  60. [super viewWillAppear:animated];
  61. [self.navigationController setNavigationBarHidden:NO];
  62. }
  63. #pragma mark 绘制view
  64. /**
  65. * 用于去掉界面上多余的横线
  66. *
  67. * @param tableView 无意义
  68. */
  69. -(void)setExtraCellLineHidden: (UITableView *)tableView
  70. {
  71. UIView *view = [UIView new];
  72. view.backgroundColor = [UIColor clearColor];
  73. [_tableView setTableFooterView:view];
  74. }
  75. //获取需要绘制的cell数目
  76. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  77. {
  78. return _userInfoArry.count;
  79. }
  80. //获取需要绘制的cell高度
  81. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
  82. {
  83. TCUserInfoCellItem *item = _userInfoArry[indexPath.row];
  84. return [TCUserInfoCellItem heightOf:item];
  85. }
  86. //绘制cell
  87. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  88. {
  89. TCEditUserInfoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
  90. TCUserInfoCellItem *item = _userInfoArry[indexPath.row];
  91. if (!cell)
  92. {
  93. cell = [[TCEditUserInfoTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
  94. [cell initUserinfoViewCellData:item];
  95. }
  96. [cell drawRichCell:item delegate:self];
  97. return cell;
  98. }
  99. #pragma mark 响应用户点击消息以及对应处理
  100. /**
  101. * 点击空白处回调,主要用户编辑昵称时,不点击键盘上的完成按钮而点击空白处关闭键盘后保存昵称
  102. *
  103. * @param gestureRecognizer 无意义
  104. */
  105. -(void)closeKeyboard:(UITapGestureRecognizer *)gestureRecognizer
  106. {
  107. [self modifyUserInfoNick];
  108. }
  109. /**
  110. * 打开键盘编辑后,点击完成后的回调--这里暂时只保存昵称
  111. *
  112. * @param textField 在编辑的控件
  113. *
  114. * @return 返回YES关闭键盘
  115. */
  116. - (BOOL)textFieldShouldReturn:(UITextField *)textField
  117. {
  118. [self modifyUserInfoNick];
  119. [textField resignFirstResponder];
  120. return YES;
  121. }
  122. /**
  123. * 用户点击tableview上的cell后,找到对应的回到函数并执行
  124. *
  125. * @param tableView 对应的tableview
  126. * @param indexPath 对应的cell索引
  127. */
  128. -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  129. {
  130. TCUserInfoCellItem *item = _userInfoArry[indexPath.row];
  131. UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
  132. if (item.action)
  133. {
  134. item.action(item, cell);
  135. }
  136. [tableView deselectRowAtIndexPath:indexPath animated:NO];
  137. }
  138. /**
  139. * 用于修改用户昵称
  140. */
  141. -(void)modifyUserInfoNick
  142. {
  143. NSInteger sections = _tableView.numberOfSections;
  144. for (int section = 0; section < sections; section++)
  145. {
  146. NSInteger rows = [_tableView numberOfRowsInSection:section];
  147. for (int row = 0; row < rows; row++)
  148. {
  149. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
  150. TCEditUserInfoTableViewCell *cell = [_tableView cellForRowAtIndexPath:indexPath];
  151. if (TCUserInfo_EditNick == cell.item.type)
  152. {
  153. [self uploadUserInfoNick:cell];
  154. break;
  155. }
  156. }
  157. }
  158. [self.view endEditing:YES];
  159. }
  160. /**
  161. * 用于点击 编辑个人信息 界面上的头像栏后弹出alert选择栏,显示选择相机or相册,然后执行相应的毁掉
  162. *
  163. * @param menu 无意义
  164. * @param cell 无意义
  165. */
  166. - (void)modifyUserInfoFaceImage:(TCUserInfoCellItem *)menu cell:(TCEditUserInfoTableViewCell *)cell
  167. {
  168. __weak typeof(self) ws = self;
  169. UIActionSheet *testSheet = [[UIActionSheet alloc] init];
  170. [testSheet bk_addButtonWithTitle:NSLocalizedString(@"TCEditUserInfoView.FaceCamera", nil) handler:^{[ws openCameraPhoto:OPEN_CAMERA];}];
  171. [testSheet bk_addButtonWithTitle:NSLocalizedString(@"TCEditUserInfoView.FaceAlbum", nil) handler:^{[ws openCameraPhoto:OPEN_PHOTO];}];
  172. [testSheet bk_setCancelButtonWithTitle:NSLocalizedString(@"Common.Cancel", nil) handler:nil];
  173. [testSheet showInView:self.view];
  174. }
  175. /**
  176. * 用于点击 编辑个人信息 界面上的性别栏后弹出alert选择栏,选中后在block中响应回调并判断设置信息
  177. *
  178. * @param menu 无意义
  179. * @param cell cell指针,用于获取和设置值
  180. */
  181. - (void)modifyUserInfoGender:(TCUserInfoCellItem *)menu cell:(TCEditUserInfoTableViewCell *)cell
  182. {
  183. __weak typeof(self) ws = self;
  184. UIActionSheet *testSheet = [[UIActionSheet alloc] init];
  185. [testSheet bk_addButtonWithTitle:NSLocalizedString(@"TCEditUserInfoView.SexMale", nil) handler:^{
  186. cell->genderText.text = NSLocalizedString(@"TCEditUserInfoView.SexMale", nil);
  187. [ws uploadUserGenderInfo:cell->genderText.text];
  188. }];
  189. [testSheet bk_addButtonWithTitle:NSLocalizedString(@"TCEditUserInfoView.SexFemale", nil) handler:^{
  190. cell->genderText.text = NSLocalizedString(@"TCEditUserInfoView.SexFemale", nil);
  191. [ws uploadUserGenderInfo:cell->genderText.text];
  192. }];
  193. [testSheet bk_setCancelButtonWithTitle:NSLocalizedString(@"Common.Cancel", nil) handler:nil];
  194. [testSheet showInView:self.view];
  195. }
  196. #pragma mark 上传更改后的用户信息
  197. /**
  198. * 修改用户性别信息外层封装,包括调用用户信息管理模块更新信息到服务器,并且包含结果回调
  199. *
  200. * @param strSexText 用户性别Text
  201. */
  202. - (void)uploadUserGenderInfo:(NSString*)strSexText
  203. {
  204. int gender = USERINFO_FEMALE;
  205. if ([strSexText isEqualToString:NSLocalizedString(@"TCEditUserInfoView.SexMale", nil)])
  206. {
  207. gender = USERINFO_MALE;
  208. }
  209. //先判断值是否发生改变
  210. TCUserInfoData *_profile = [[TCUserInfoModel sharedInstance] getUserProfile ];
  211. if (gender != _profile.gender)
  212. {
  213. [[TCUserInfoModel sharedInstance] saveUserGender:gender handler:^(int code, NSString *msg)
  214. {
  215. if (ERROR_SUCESS != code)
  216. {
  217. //[[HUDHelper sharedInstance] tipMessage:NSLocalizedString(@"TCEditUserInfoView.ErrorUploadingSex", nil)];
  218. }
  219. }];
  220. }
  221. }
  222. /**
  223. * 上传用户头像到服务器,并且返回用户头像url,拿到url后再将url上传到服务器,并且包含结果回调
  224. * 上传成功后会发送通知,使得用户信息界面更新头像信息
  225. *
  226. * @param image 图片信息
  227. *
  228. */
  229. - (void)uploadUserFaceImage:(UIImage*)image
  230. {
  231. TCUserInfoData *profile = [[TCUserInfoModel sharedInstance] getUserProfile ];
  232. [[TCUploadHelper shareInstance] upload:profile.identifier image:image completion:^(NSInteger errCode, NSString *imageSaveUrl)
  233. {
  234. if (ERROR_SUCESS == errCode)
  235. {
  236. [[TCUserInfoModel sharedInstance] saveUserFace:imageSaveUrl handler:^(int code, NSString *msg)
  237. {
  238. if (ERROR_SUCESS != errCode)
  239. {
  240. //[[HUDHelper sharedInstance] tipMessage:NSLocalizedString(@"TCEditUserInfoView.ErrorUploadingFace", nil)];
  241. }
  242. else
  243. {
  244. //将图片同步到用户主界面显示
  245. [[NSNotificationCenter defaultCenter] postNotificationName:KReloadUserInfoNotification object:nil];
  246. //NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
  247. //NSString *documentsDirectory=[paths objectAtIndex:0];
  248. //NSString *savedImagePath=[documentsDirectory stringByAppendingPathComponent:@"saveFore.png"];
  249. //[UIImagePNGRepresentation(image) writeToFile:savedImagePath atomically:YES];
  250. }
  251. }];
  252. }
  253. else
  254. {
  255. //[[HUDHelper sharedInstance] tipMessage:NSLocalizedString(@"TCEditUserInfoView.ErrorUploadingFace", nil)];
  256. }
  257. }];
  258. }
  259. /**
  260. * 用户保存用户昵称外层封装,保存到服务器后的结果回调
  261. *
  262. * @param cell 包含用户昵称的tableview的cell项目,从中取得昵称Text
  263. */
  264. - (void)uploadUserInfoNick:(TCEditUserInfoTableViewCell*)cell
  265. {
  266. TCUserInfoData *_profile = [[TCUserInfoModel sharedInstance] getUserProfile ];
  267. if (0 == cell->nickText.text.length)
  268. {
  269. //[[HUDHelper sharedInstance] tipMessage:NSLocalizedString(@"TCEditUserInfoView.ErrorNickEmpty", nil)];
  270. cell->nickText.text = _profile.nickName;
  271. return;
  272. }
  273. //先判断值是否发生改变
  274. if (![cell->nickText.text isEqualToString:_profile.nickName])
  275. {
  276. [[TCUserInfoModel sharedInstance] saveUserNickName:cell->nickText.text handler:^(int code, NSString *msg)
  277. {
  278. if (ERROR_SUCESS != code)
  279. {
  280. //[[HUDHelper sharedInstance] tipMessage:NSLocalizedString(@"TCEditUserInfoView.ErrorUploadingNick", nil)];
  281. }
  282. else
  283. {
  284. //将信息同步到用户主界面显示
  285. [[NSNotificationCenter defaultCenter] postNotificationName:KReloadUserInfoNotification object:nil];
  286. }
  287. }];
  288. }
  289. }
  290. #pragma mark 与选择相机or相册以及处理了图片相关
  291. /**
  292. * 根据用户选择打开相机or相册
  293. *
  294. * @param Picker 用户选择宏
  295. */
  296. -(void)openCameraPhoto:(NSInteger)Picker
  297. {
  298. UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
  299. imagePicker.delegate = self;
  300. imagePicker.allowsEditing = YES;
  301. imagePicker.navigationBar.translucent = NO;
  302. if (OPEN_CAMERA == Picker && [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
  303. {
  304. imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
  305. }
  306. else if (OPEN_PHOTO == Picker && [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
  307. {
  308. imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  309. }
  310. [self presentViewController:imagePicker animated:YES completion:nil];
  311. }
  312. - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
  313. {
  314. [picker dismissViewControllerAnimated:YES completion:nil];
  315. }
  316. - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
  317. {
  318. UIImage *image = info[UIImagePickerControllerEditedImage];
  319. UIImage *cutImage = [TCEditUserInfoViewController cutImage:image];
  320. [picker dismissViewControllerAnimated:YES completion:nil];
  321. NSInteger sections = _tableView.numberOfSections;
  322. for (int section = 0; section < sections; section++)
  323. {
  324. NSInteger rows = [_tableView numberOfRowsInSection:section];
  325. for (int row = 0; row < rows; row++)
  326. {
  327. NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section];
  328. TCEditUserInfoTableViewCell *cell = [_tableView cellForRowAtIndexPath:indexPath];
  329. if (TCUserInfo_EditFace == cell.item.type)
  330. {
  331. // 首先将突破同步到tableview上,然后上传,上传成功后同步到用户信息界面
  332. cell->faceImage.image = cutImage;
  333. [self uploadUserFaceImage:cutImage];
  334. break;
  335. }
  336. }
  337. }
  338. }
  339. #pragma mark 裁剪照片
  340. +(UIImage *)scaleToSize:(UIImage *)image size:(CGSize)size
  341. {
  342. UIGraphicsBeginImageContext(size);
  343. [image drawInRect:CGRectMake(0, 0, size.width,size.height)];
  344. UIImage *endImage=UIGraphicsGetImageFromCurrentImageContext();
  345. UIGraphicsEndImageContext();
  346. return endImage;
  347. }
  348. + (UIImage *)cutImage:(UIImage *)image
  349. {
  350. CGSize pubSize = CGSizeMake(200, 200);
  351. if (image)
  352. {
  353. CGSize imgSize = image.size;
  354. CGFloat pubRation = pubSize.height / pubSize.width;
  355. CGFloat imgRatio = imgSize.height / imgSize.width;
  356. if (fabs(imgRatio - pubRation) < 0.01)
  357. {
  358. // 直接上传
  359. image = [TCEditUserInfoViewController scaleToSize:image size:pubSize];
  360. return image;
  361. }
  362. else
  363. {
  364. if (imgRatio > 1)
  365. {
  366. // 长图,截正中间部份
  367. CGSize upSize = CGSizeMake(imgSize.width, (NSInteger)(imgSize.width * pubRation));
  368. UIImage *upimg = [TCEditUserInfoViewController cropImage:image inRect:CGRectMake(0, (image.size.height - upSize.height)/2, upSize.width, upSize.height)];
  369. upimg = [TCEditUserInfoViewController scaleToSize:upimg size:pubSize];
  370. return upimg;
  371. }
  372. else
  373. {
  374. // 宽图,截正中间部份
  375. CGSize upSize = CGSizeMake(imgSize.height, (NSInteger)(imgSize.height * pubRation));
  376. UIImage *upimg = [TCEditUserInfoViewController cropImage:image inRect:CGRectMake((image.size.width - upSize.width)/2, 0, upSize.width, upSize.height)];
  377. upimg = [TCEditUserInfoViewController scaleToSize:upimg size:pubSize];
  378. return upimg;
  379. }
  380. }
  381. }
  382. return image;
  383. }
  384. + (UIImage *)cropImage:(UIImage *)image inRect:(CGRect)rect
  385. {
  386. UIGraphicsBeginImageContext(rect.size);
  387. CGContextRef context = UIGraphicsGetCurrentContext();
  388. // translated rectangle for drawing sub image
  389. CGRect drawRect = CGRectMake(-rect.origin.x, -rect.origin.y, image.size.width, image.size.height);
  390. // clip to the bounds of the image context
  391. // not strictly necessary as it will get clipped anyway?
  392. CGContextClipToRect(context, CGRectMake(0, 0, rect.size.width, rect.size.height));
  393. // draw image
  394. [image drawInRect:drawRect];
  395. // grab image
  396. UIImage* croppedImage = UIGraphicsGetImageFromCurrentImageContext();
  397. UIGraphicsEndImageContext();
  398. return croppedImage;
  399. }
  400. @end