TCUserInfoCell.m 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. //
  2. // TCUserInfoCell.m
  3. // TCLVBIMDemo
  4. //
  5. // Created by jemilyzhou on 16/8/1.
  6. // Copyright © 2016年 tencent. All rights reserved.
  7. //
  8. #import "TCUserInfoCell.h"
  9. #import "TCUserInfoModel.h"
  10. #import "TCEditUserInfoViewController.h"
  11. #import "TCUtil.h"
  12. //#import "TCLoginParam.h"
  13. #import <UIKit/UIKit.h>
  14. #import <mach/mach.h>
  15. #import <Foundation/Foundation.h>
  16. #import <AVFoundation/AVFoundation.h>
  17. #import <UIImageView+WebCache.h>
  18. #pragma mark 存储用户个人信息item
  19. @implementation TCUserInfoCellItem
  20. - (instancetype)init
  21. {
  22. if (self = [super init])
  23. {
  24. }
  25. return self;
  26. }
  27. - (instancetype)initWith:(NSString *)key value:(NSString *)value type:(TCUserInfoCellType)type action:(TCUserInfoCellAction)action
  28. {
  29. if (self = [self init])
  30. {
  31. _tip = key;
  32. _type = type;
  33. _value = value;
  34. _action = action;
  35. }
  36. return self;
  37. }
  38. /**
  39. * 在绘制cell的时候获取cell的高度,在用户信息界面第一个cell取275,编辑个人信息 界面第一个cell取65,其他都是45
  40. *
  41. * @param item 用于cell数据结构体
  42. *
  43. * @return cell的高度
  44. */
  45. + (NSInteger)heightOf:(TCUserInfoCellItem *)item
  46. {
  47. if (TCUserInfo_EditFace == item.type )
  48. {
  49. return 65;
  50. }
  51. else if (TCUserInfo_View == item.type)
  52. {
  53. return 275;
  54. }
  55. return 45;
  56. }
  57. @end
  58. #pragma mark 点击个人信息页面,显示在个人页面上的tableview
  59. @implementation TCUserInfoTableViewCell
  60. - (instancetype)init
  61. {
  62. if (self = [super init])
  63. {
  64. }
  65. return self;
  66. }
  67. - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  68. {
  69. if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
  70. {
  71. }
  72. return self;
  73. }
  74. - (void)prepareForReuse {
  75. [super prepareForReuse];
  76. [faceImage sd_setImageWithURL:nil];
  77. }
  78. /**
  79. * 用于初始化数据 目前只用于当在 用户信息界面 上的第一个组合cell
  80. *
  81. * @param item cell信息结构体指针
  82. */
  83. - (void)initUserinfoViewCellData:(TCUserInfoCellItem *)item
  84. {
  85. if (TCUserInfo_View == item.type)
  86. {
  87. UIView* bgview = [[UIView alloc] init];
  88. bgview.opaque = YES;
  89. bgview.backgroundColor = RGB(239,100,85);
  90. [self setBackgroundView:bgview];
  91. UIColor *uiBorderColor = RGB(239,100,85);
  92. faceImage = [[UIImageView alloc ] init];
  93. faceImage.layer.masksToBounds = YES;
  94. faceImage.layer.borderWidth = 2;
  95. faceImage.layer.borderColor = uiBorderColor.CGColor;
  96. nickText = [[UILabel alloc] init];
  97. nickText.textAlignment = NSTextAlignmentCenter;
  98. nickText.textColor = [UIColor whiteColor];
  99. nickText.font = [UIFont systemFontOfSize:18];
  100. nickText.lineBreakMode = NSLineBreakByWordWrapping;
  101. identifierText = [[UILabel alloc] init];
  102. identifierText.textColor = [UIColor whiteColor];
  103. identifierText.font = [UIFont systemFontOfSize:14];
  104. identifierText.textAlignment = NSTextAlignmentCenter;
  105. identifierText.lineBreakMode = NSLineBreakByWordWrapping;
  106. [self addSubview:nickText];
  107. [self addSubview:identifierText];
  108. [self addSubview:faceImage];
  109. }
  110. }
  111. //绘制 用于信息界面 中的tableview的cell
  112. - (void)drawRichCell:(TCUserInfoCellItem *)item
  113. {
  114. _item = item;
  115. switch (item.type)
  116. {
  117. case TCUserInfo_View:
  118. {
  119. self.textLabel.text = nil;
  120. // self.userInteractionEnabled = NO;
  121. self.accessoryType = UITableViewCellAccessoryNone;
  122. // NSString *nickName = [TCLoginParam shareInstance].identifier;
  123. // CGRect mainScreenSize = [ UIScreen mainScreen ].applicationFrame;
  124. // NSStringCheck(nickName);
  125. // CGSize titleTextSize = [nickName sizeWithAttributes:@{NSFontAttributeName:nickText.font}];
  126. // [faceImage sd_setImageWithURL:nil placeholderImage:[UIImage imageNamed:@"default_user"]];
  127. // faceImage.frame = CGRectMake((mainScreenSize.size.width-100)/2, 50,100, 100);
  128. // faceImage.layer.cornerRadius = 50;
  129. // nickText.text = nickName;
  130. // nickText.frame = CGRectMake(0, 175,mainScreenSize.size.width,titleTextSize.height);
  131. // identifierText.text = [NSString stringWithFormat:@"ID:%@",nickName];
  132. // identifierText.frame = CGRectMake(0, 175+10+titleTextSize.height,mainScreenSize.size.width, titleTextSize.height);
  133. }
  134. break;
  135. case TCUserInfo_About:
  136. case TCUserInfo_Edit:
  137. case TCUserInfo_Authenticate:
  138. {
  139. self.textLabel.text = item.tip;
  140. self.textLabel.textColor = [UIColor whiteColor];
  141. self.textLabel.font = [UIFont systemFontOfSize:16];
  142. self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  143. }
  144. break;
  145. default:
  146. break;
  147. }
  148. self.backgroundColor = RGB(0x1F, 0x25, 0x31);
  149. }
  150. @end
  151. #pragma mark 点击编辑个人信息 弹出来的页面上显示的tableview
  152. @implementation TCEditUserInfoTableViewCell
  153. - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
  154. {
  155. if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])
  156. {
  157. }
  158. return self;
  159. }
  160. -(void)dealloc
  161. {
  162. if (TCUserInfo_EditNick == _item.type)
  163. {
  164. [[NSNotificationCenter defaultCenter]removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:nickText];
  165. }
  166. }
  167. /**
  168. * 用户初始化 编辑个人信息 界面上的tableview空间属性,优化滑动刷新时的性能
  169. *
  170. * @param item cell信息结构体指针
  171. */
  172. - (void)initUserinfoViewCellData:(TCUserInfoCellItem *)item
  173. {
  174. switch (item.type)
  175. {
  176. case TCUserInfo_EditFace:
  177. {
  178. faceImage = [[UIImageView alloc ] init];
  179. faceImage.layer.masksToBounds = YES;
  180. faceImage.layer.cornerRadius = 25;
  181. [self addSubview:faceImage];
  182. }
  183. break;
  184. case TCUserInfo_EditGender:
  185. {
  186. genderText = [[UILabel alloc] init];
  187. genderText.numberOfLines = 0;
  188. genderText.textColor = RGB(0x77,0x77,0x77);
  189. genderText.font = [UIFont systemFontOfSize:16];
  190. genderText.lineBreakMode = NSLineBreakByWordWrapping;
  191. genderText.textAlignment = NSTextAlignmentRight;
  192. [self addSubview:genderText];
  193. }
  194. break;
  195. case TCUserInfo_EditNick:
  196. {
  197. nickText = [[UITextField alloc] init];
  198. nickText.text = item.value;
  199. nickText.textColor = RGB(0x77,0x77,0x77);
  200. nickText.returnKeyType = UIReturnKeyDone;
  201. nickText.font = [UIFont systemFontOfSize:16];
  202. nickText.textAlignment = NSTextAlignmentRight;
  203. [[NSNotificationCenter defaultCenter]removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:nickText];
  204. [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:)
  205. name:@"UITextFieldTextDidChangeNotification"
  206. object:nickText];
  207. [self addSubview:nickText];
  208. }
  209. break;
  210. default:
  211. break;
  212. }
  213. }
  214. /**
  215. * 绘制 编辑个人信息 界面上的tableview
  216. *
  217. * @param item cell信息结构体指针
  218. * @param view 主界面的self指针
  219. */
  220. - (void)drawRichCell:(TCUserInfoCellItem *)item delegate:(id)view
  221. {
  222. _item = item;
  223. self.textLabel.text = item.tip;
  224. self.textLabel.textColor = [UIColor blackColor];
  225. self.textLabel.font = [UIFont systemFontOfSize:16];
  226. CGRect mainScreenSize = [ UIScreen mainScreen ].applicationFrame;
  227. CGSize size = [self.textLabel.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]}];
  228. self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
  229. switch (item.type)
  230. {
  231. case TCUserInfo_EditFace:
  232. {
  233. int xPos = self.frame.origin.x + mainScreenSize.size.width - mainScreenSize.size.width/10 - 50;
  234. TCUserInfoData *_profile = [[TCUserInfoModel sharedInstance] getUserProfile ];
  235. faceImage.frame = CGRectMake(xPos, self.frame.origin.y+7,50, 50);
  236. [faceImage sd_setImageWithURL:[NSURL URLWithString:[TCUtil transImageURL2HttpsURL:_profile.faceURL]] placeholderImage:[UIImage imageNamed:@"default_user"]];
  237. self.accessoryType = UITableViewCellAccessoryNone;
  238. }
  239. break;
  240. case TCUserInfo_EditGender:
  241. {
  242. genderText.text = item.value;
  243. genderText.frame = CGRectMake(self.frame.origin.x + size.width, self.frame.origin.y,mainScreenSize.size.width - size.width - mainScreenSize.size.width/10, self.frame.size.height);
  244. }
  245. break;
  246. case TCUserInfo_EditNick:
  247. {
  248. nickText.text = item.value;
  249. nickText.delegate = view;
  250. nickText.frame = CGRectMake(self.frame.origin.x + size.width, self.frame.origin.y,mainScreenSize.size.width - size.width - mainScreenSize.size.width/10, self.frame.size.height);
  251. self.accessoryType = UITableViewCellAccessoryNone;
  252. }
  253. break;
  254. default:
  255. break;
  256. }
  257. }
  258. /**
  259. * 当用户通过高亮输入大量字母汉子等信息时,由于长度不能超过20字节,此函数用户计算截断位置
  260. *
  261. * @param string 用于输入的高长度昵称
  262. *
  263. * @return 需要截断的位置索引
  264. */
  265. - (NSUInteger)getNickIndex:(NSString*)string
  266. {
  267. size_t inIndex = 0;
  268. size_t length = 0;
  269. for (int i = 0; i < [string length]; i++)
  270. {
  271. unichar ch = [string characterAtIndex:i];
  272. if (0x4e00 < ch && ch < 0x9fff)
  273. {
  274. length += 2;
  275. }
  276. else
  277. {
  278. length++;
  279. }
  280. if (length >= kNicknameMaxLength)
  281. {
  282. break;
  283. }
  284. inIndex++;
  285. }
  286. return inIndex;
  287. }
  288. /**
  289. * 编辑昵称时每一次按键后的回调,每次回调都会检查输入的昵称长度是否适中
  290. *
  291. * @param obj 用于获取输入的控件指针
  292. */
  293. -(void)textFiledEditChanged:(NSNotification *)obj
  294. {
  295. UITextField *textField = (UITextField *)obj.object;
  296. NSString *toBeString = textField.text;
  297. NSString *lang = textField.textInputMode.primaryLanguage; // 键盘输入模式
  298. if ([lang isEqualToString:@"zh-Hans"])
  299. {
  300. // 简体中文输入,包括简体拼音,健体五笔,简体手写
  301. UITextRange *selectedRange = [textField markedTextRange];
  302. // 获取高亮部分
  303. UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
  304. if (!position) // 没有高亮选择的字,则对已输入的文字进行字数统计和限制
  305. {
  306. if ([TCUtil getContentLength:toBeString] > kNicknameMaxLength)
  307. {
  308. // [[HUDHelper sharedInstance] tipMessage:[NSString stringWithFormat:@"%@%d",NSLocalizedString(@"TCUserInfoCell.ErrorNickLength", nil), kNicknameMaxLength/2]];
  309. textField.text = [toBeString substringToIndex:[self getNickIndex:textField.text]];
  310. }
  311. }
  312. }
  313. else
  314. {
  315. // 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
  316. if ([TCUtil getContentLength:toBeString] > kNicknameMaxLength)
  317. {
  318. // [[HUDHelper sharedInstance] tipMessage:[NSString stringWithFormat:@"%@%d",NSLocalizedString(@"TCUserInfoCell.ErrorNickLength", nil), kNicknameMaxLength/2]];
  319. textField.text = [toBeString substringToIndex:[self getNickIndex:textField.text]];
  320. }
  321. }
  322. }
  323. @end