YOUPAIEyeCatchingWaiterCell.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. //
  2. // YOUPAIEyeCatchingWaiterCell.m
  3. // 4.看视频
  4. //
  5. // Created by apple on 2020/7/28.
  6. // Copyright © 2020 apple. All rights reserved.
  7. //
  8. #import "YOUPAIEyeCatchingWaiterCell.h"
  9. #import "YYAnimatedImageView.h"
  10. #import "YYImage.h"
  11. #import "RippleAnimationView.h"
  12. @interface YOUPAIEyeCatchingWaiterCell ()
  13. @property (nonatomic, strong) UIImageView *coverImageView; // 封面
  14. @property (nonatomic, strong) UILabel *nickNameLabel; // 昵称
  15. @property (nonatomic,strong)UIImageView *vipV; // Vip
  16. @property (nonatomic, strong) UILabel *desLabel; // 描述label
  17. @property (nonatomic, strong) UIButton *callVideoBtn; // 拨打视频
  18. @property (nonatomic, strong) UIButton *viewersBtn; // 浏览数
  19. @property (nonatomic, strong) UIButton *likeBtn; // 点赞
  20. @property (nonatomic, strong) UIButton *giftBtn; // 送礼物
  21. @property (nonatomic, strong) RippleAnimationView *avatorBgAnimationV; // 头像背景动画
  22. @property (nonatomic, strong) UIButton *avatarBtn; // 头像
  23. @property (nonatomic, strong) UIButton *liveBtn; // 直播
  24. //
  25. ////头像
  26. //@property (nonatomic, strong) UIImageView *avatarImgView;
  27. ////关注按钮
  28. //@property (nonatomic, strong) UIButton *followBtn;
  29. //// 赞
  30. //@property (nonatomic, strong) UIButton *supportBtn;
  31. //// 点赞数
  32. //@property (nonatomic, strong) UILabel *supportLab;
  33. //
  34. //// 浏览数
  35. //@property (nonatomic, strong) UIButton *viewersBtn;
  36. //// 浏览数
  37. //@property (nonatomic, strong) UILabel *viewersLab;
  38. ////// 打视频
  39. ////@property (nonatomic, strong) UIButton *videoBtn;
  40. //// 比心
  41. //@property (nonatomic, strong) UIButton *bixinBtn;
  42. //
  43. ////比心数
  44. //@property (nonatomic, strong) UILabel *bixinLab;
  45. //
  46. @end
  47. @implementation YOUPAIEyeCatchingWaiterCell
  48. - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
  49. self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  50. if (self) {
  51. [self youpaifinitSubviews];
  52. }
  53. return self;
  54. }
  55. - (void)youpaifinitSubviews{
  56. UIImageView *coverImageView = [[UIImageView alloc] init];
  57. coverImageView.userInteractionEnabled = YES;
  58. coverImageView.contentMode = UIViewContentModeScaleAspectFit;
  59. coverImageView.clipsToBounds = YES;
  60. coverImageView.tag = 100;
  61. [self.contentView addSubview:coverImageView];
  62. self.coverImageView = coverImageView;
  63. [coverImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  64. make.left.right.top.bottom.offset(0.0f);
  65. }];
  66. UIView *footerV = [[UIView alloc] init];
  67. CAGradientLayer *gradientLayerBot = [LCTools getGradientLayerWithSize:footerV.mj_size twoColors:@[[[UIColor blackColor] colorWithAlphaComponent:0.0f],[[UIColor blackColor] colorWithAlphaComponent:0.41f]] gradientType:GradientTopToBottom];
  68. [footerV.layer addSublayer:gradientLayerBot];
  69. [self.contentView addSubview:footerV];
  70. [footerV mas_makeConstraints:^(MASConstraintMaker *make) {
  71. make.left.right.offset(0.0f);
  72. make.bottom.mas_equalTo(-10);
  73. make.height.offset(120.0f);
  74. }];
  75. UILabel *desLabel = [[UILabel alloc]init];
  76. desLabel.textColor = HexColorFromRGB(0xFFFFFF);
  77. desLabel.font = LCFont14;
  78. desLabel.numberOfLines = 0;
  79. [self.contentView addSubview:desLabel];
  80. self.desLabel = desLabel;
  81. [desLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  82. make.left.offset(14.0f);
  83. make.right.offset(-14.0f);
  84. make.bottom.offset(-25.0f-SafeHeight);
  85. }];
  86. UILabel *nickNameLabel = [[UILabel alloc]init];
  87. nickNameLabel.textColor = HexColorFromRGB(0xFFFFFF);
  88. nickNameLabel.font = LCBoldFont(16);
  89. nickNameLabel.userInteractionEnabled = YES;
  90. UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickNickNameAction)];
  91. [nickNameLabel addGestureRecognizer:tap];
  92. [self.contentView addSubview:nickNameLabel];
  93. self.nickNameLabel = nickNameLabel;
  94. [nickNameLabel makeConstraints:^(MASConstraintMaker *make) {
  95. make.left.offset(14);
  96. make.bottom.equalTo(desLabel.mas_top).offset(-10);
  97. }];
  98. UIImageView *vipV = [[UIImageView alloc] init];
  99. [self.contentView addSubview:vipV];
  100. self.vipV = vipV;
  101. [vipV makeConstraints:^(MASConstraintMaker *make) {
  102. make.left.equalTo(self.nickNameLabel.right).offset(5);
  103. make.centerY.equalTo(self.nickNameLabel);
  104. make.size.mas_offset(CGSizeMake(30.0f, 19.0f));
  105. }];
  106. UIButton *callVideoBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  107. [callVideoBtn setImage:[UIImage imageNamed:@"vqu_images_D_dynamic_call_video"] forState:UIControlStateNormal];
  108. [callVideoBtn setTitle:@"与TA视频" forState:UIControlStateNormal];
  109. [callVideoBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  110. callVideoBtn.titleLabel.font = LCFont12;
  111. callVideoBtn.frame = CGRectMake(0.0f, 0.0f, 55.0f, 69.0f);
  112. [callVideoBtn addTarget:self action:@selector(youpaifvideoBtn:) forControlEvents:UIControlEventTouchUpInside];
  113. [self initButton:callVideoBtn imageSize:CGSizeMake(39.0f, 39.0f) spacing:8.0f];
  114. [self.contentView addSubview:callVideoBtn];
  115. self.callVideoBtn = callVideoBtn;
  116. [callVideoBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  117. make.right.offset(-6.0f);
  118. make.bottom.equalTo(nickNameLabel.mas_top).offset(-40.0f);
  119. make.size.mas_offset(CGSizeMake(55.0f, 69.0f));
  120. }];
  121. UIButton *viewersBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  122. [viewersBtn setImage:[UIImage imageNamed:@"vqu_images_D_dynamic_viewers"] forState:UIControlStateNormal];
  123. [viewersBtn setTitle:@"0" forState:UIControlStateNormal];
  124. [viewersBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  125. viewersBtn.titleLabel.font = LCFont12;
  126. viewersBtn.frame = CGRectMake(0.0f, 0.0f, 55.0f, 61.0f);
  127. [self initButton:viewersBtn imageSize:CGSizeMake(39.0f, 39.0f) spacing:0.0f];
  128. UIEdgeInsets imageEdgeInsets = viewersBtn.imageEdgeInsets;
  129. imageEdgeInsets.left = 8.0f;
  130. viewersBtn.imageEdgeInsets = imageEdgeInsets;
  131. [self.contentView addSubview:viewersBtn];
  132. self.viewersBtn = viewersBtn;
  133. [viewersBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  134. make.right.offset(-6.0f);
  135. make.bottom.equalTo(callVideoBtn.mas_top).offset(-19.0f);
  136. make.size.mas_offset(CGSizeMake(55.0f, 61.0f));
  137. }];
  138. UIButton *likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  139. [likeBtn setImage:[UIImage imageNamed:@"vqu_images_D_dynamic_like_none"] forState:UIControlStateNormal];
  140. [likeBtn setImage:[UIImage imageNamed:@"vqu_images_D_dynamic_like_selected"] forState:UIControlStateSelected];
  141. [likeBtn setTitle:@"0" forState:UIControlStateNormal];
  142. [likeBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  143. likeBtn.titleLabel.font = LCFont12;
  144. likeBtn.frame = CGRectMake(0.0f, 0.0f, 55.0f, 61.0f);
  145. [likeBtn addTarget:self action:@selector(supportBtn:) forControlEvents:UIControlEventTouchUpInside];
  146. [self initButton:likeBtn imageSize:CGSizeMake(39.0f, 39.0f) spacing:0.0f];
  147. [self.contentView addSubview:likeBtn];
  148. self.likeBtn = likeBtn;
  149. [likeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  150. make.right.offset(-6.0f);
  151. make.bottom.equalTo(viewersBtn.mas_top).offset(-19.0f);
  152. make.size.mas_offset(CGSizeMake(55.0f, 61.0f));
  153. }];
  154. UIButton *giftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  155. [giftBtn setImage:[UIImage imageNamed:@"vqu_images_D_dynamic_gift_send"] forState:UIControlStateNormal];
  156. [giftBtn setTitle:@"送礼物" forState:UIControlStateNormal];
  157. [giftBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
  158. giftBtn.titleLabel.font = LCFont12;
  159. giftBtn.frame = CGRectMake(0.0f, 0.0f, 55.0f, 61.0f);
  160. [self initButton:giftBtn imageSize:CGSizeMake(39.0f, 39.0f) spacing:0.0f];
  161. [giftBtn addTarget:self action:@selector(youpaifgiftBtnClick) forControlEvents:UIControlEventTouchUpInside];
  162. [self.contentView addSubview:giftBtn];
  163. self.giftBtn = giftBtn;
  164. [giftBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  165. make.right.offset(-6.0f);
  166. make.bottom.equalTo(likeBtn.mas_top).offset(-19.0f);
  167. make.size.mas_offset(CGSizeMake(55.0f, 61.0f));
  168. }];
  169. // YYAnimatedImageView *avatorBgAnimationV = [[YYAnimatedImageView alloc] init];
  170. // avatorBgAnimationV.image = self.icLiveUserHeader;
  171. // avatorBgAnimationV.contentMode = UIViewContentModeScaleAspectFit;
  172. // [self.contentView addSubview:avatorBgAnimationV];
  173. // self.avatorBgAnimationV = avatorBgAnimationV;
  174. // [avatorBgAnimationV mas_makeConstraints:^(MASConstraintMaker *make) {
  175. // make.centerX.equalTo(callVideoBtn.mas_centerX);
  176. // make.bottom.equalTo(giftBtn.mas_top).offset(-19.0f);
  177. // make.size.mas_offset(CGSizeMake(48.0f, 48.0f));
  178. // }];
  179. UIButton *avatarBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  180. avatarBtn.layer.cornerRadius = 20.0f;
  181. avatarBtn.clipsToBounds = YES;
  182. avatarBtn.imageView.contentMode = UIViewContentModeScaleAspectFill;
  183. avatarBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
  184. avatarBtn.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
  185. avatarBtn.layer.borderColor = HexColorFromRGB(0xFF3A00).CGColor;
  186. avatarBtn.layer.borderWidth = 1.0f;
  187. [avatarBtn addTarget:self action:@selector(youpaifclickAvatarImgView) forControlEvents:UIControlEventTouchUpInside];
  188. [self.contentView addSubview:avatarBtn];
  189. self.avatarBtn = avatarBtn;
  190. [avatarBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  191. make.centerX.equalTo(callVideoBtn.mas_centerX);
  192. make.bottom.equalTo(giftBtn.mas_top).offset(-19.0f);
  193. make.size.mas_offset(CGSizeMake(40.0f, 40.0f));
  194. }];
  195. RippleAnimationView *viewB = [[RippleAnimationView alloc] initWithFrame:CGRectMake(0, 0, 40, 40) animationType:AnimationTypeWithoutBackground];
  196. viewB.center = avatarBtn.center;
  197. self.avatorBgAnimationV = viewB;
  198. [self.contentView addSubview:viewB];
  199. [viewB mas_makeConstraints:^(MASConstraintMaker *make) {
  200. make.centerX.equalTo(callVideoBtn.mas_centerX);
  201. make.bottom.equalTo(giftBtn.mas_top).offset(-19.0f);
  202. make.size.mas_offset(CGSizeMake(40.0f, 40.0f));
  203. }];
  204. UITapGestureRecognizer *viewBTouch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(youpaifclickAvatarImgView)];
  205. [viewB addGestureRecognizer:viewBTouch];
  206. UIButton *liveBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  207. [liveBtn setBackgroundImage:[UIImage imageNamed:@"vqu_images_D_dynamic_live_tag"] forState:UIControlStateNormal];
  208. [liveBtn setBackgroundImage:[UIImage imageNamed:@"vqu_images_D_dynamic_live_tag"] forState:UIControlStateHighlighted];
  209. liveBtn.userInteractionEnabled = NO;
  210. [avatarBtn addSubview:liveBtn];
  211. self.liveBtn = liveBtn;
  212. [liveBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  213. make.centerX.equalTo(0.0f);
  214. make.top.offset(0.0f);
  215. make.size.mas_offset(CGSizeMake(40.0f, 40.0f));
  216. }];
  217. UIButton *followBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  218. [followBtn setBackgroundImage:[UIImage imageNamed:@"vqu_images_ic_user_show_follow"] forState:UIControlStateNormal];
  219. [followBtn setBackgroundImage:[UIImage imageNamed:@"vqu_images_ic_user_show_follow"] forState:UIControlStateHighlighted];
  220. [followBtn addTarget:self action:@selector(followBtnAction:) forControlEvents:UIControlEventTouchUpInside];
  221. [self.contentView addSubview:followBtn];
  222. self.followBtn = followBtn;
  223. [followBtn mas_makeConstraints:^(MASConstraintMaker *make) {
  224. make.centerX.equalTo(callVideoBtn.mas_centerX);
  225. make.top.equalTo(avatarBtn.mas_bottom).offset(-7.0f);
  226. make.size.mas_offset(CGSizeMake(14.0f, 14.0f));
  227. }];
  228. }
  229. //将按钮设置为图片在上,文字在下
  230. -(void)initButton:(UIButton*)btn imageSize:(CGSize)size spacing:(CGFloat)spacing{
  231. CGSize imageSize = size;
  232. CGSize titleSize = btn.titleLabel.frame.size;
  233. CGSize textSize = [btn.titleLabel.text sizeWithAttributes:@{NSFontAttributeName : btn.titleLabel.font}];
  234. CGSize frameSize = CGSizeMake(ceilf(textSize.width), ceilf(textSize.height));
  235. if (titleSize.width + 0.5 < frameSize.width) {
  236. titleSize.width = frameSize.width;
  237. }
  238. CGFloat totalHeight = (imageSize.height + titleSize.height + spacing);
  239. btn.imageEdgeInsets = UIEdgeInsetsMake(- (totalHeight - imageSize.height), 0.0, 0.0, - titleSize.width);
  240. btn.titleEdgeInsets = UIEdgeInsetsMake(0, - imageSize.width, - (totalHeight - titleSize.height), 0);
  241. }
  242. - (void)setHidesBottomBar:(BOOL)hidesBottomBar {
  243. _hidesBottomBar = hidesBottomBar;
  244. if (hidesBottomBar) {
  245. [self.desLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
  246. make.left.offset(14.0f);
  247. make.right.offset(-14.0f);
  248. make.bottom.offset(-25.0f-SafeHeight);
  249. }];
  250. }else{
  251. [self.desLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
  252. make.left.offset(14.0f);
  253. make.right.offset(-14.0f);
  254. make.bottom.offset(-25.0f);
  255. }];
  256. }
  257. }
  258. -(void)setModel:(YOUPAIZYVideoModel *)model
  259. {
  260. _model = model;
  261. [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:model.youpaipcover_url] options:SDWebImageDownloaderUseNSURLCache progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {} completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
  262. if (image.size.width >= image.size.height) {
  263. self->_coverImageView.contentMode = UIViewContentModeScaleAspectFit;
  264. }else{
  265. self->_coverImageView.contentMode = UIViewContentModeScaleAspectFill;
  266. }
  267. self.model.youpaipmode = self.coverImageView.contentMode;
  268. }];
  269. [_coverImageView sd_setImageWithURL:[NSURL URLWithString:model.youpaipcover_url]];
  270. [self.avatarBtn sd_setImageWithURL:[NSURL URLWithString:model.youpaipavatar] forState:UIControlStateNormal];
  271. self.likeBtn.selected = model.youpaipis_like;
  272. [self.likeBtn setTitle:[NSString stringWithFormat:@"%ld",model.youpaiplike_count] forState:UIControlStateNormal];;
  273. self.followBtn.hidden = model.youpaipis_follow;
  274. [self.viewersBtn setTitle:[NSString stringWithFormat:@"%ld",model.youpaipview_count] forState:UIControlStateNormal];
  275. self.nickNameLabel.text = [NSString stringWithFormat:@"%@%@",@"@",model.youpaipnickname];
  276. self.desLabel.text = [NSString stringWithFormat:@"%@",model.youpaipcontent];
  277. self.vipV.hidden = YES;
  278. if (model.youpaipvip_icon.length != 0) {
  279. self.vipV.hidden = NO;
  280. [self.vipV sd_setImageWithURL:[LCTools getImageUrlWithAddress:model.youpaipvip_icon]];
  281. }
  282. self.callVideoBtn.hidden = NO;
  283. if ([[LCSaveModel getUserModel].youpaipuserinfo.youpaipuser_id isEqualToString:model.youpaipuser_id] || model.youpaipis_anchor == 0) {
  284. self.callVideoBtn.hidden = YES;
  285. [self.viewersBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
  286. make.right.offset(-6.0f);
  287. make.bottom.equalTo(self.nickNameLabel.mas_top).offset(-40.0f);
  288. make.size.mas_offset(CGSizeMake(55.0f, 61.0f));
  289. }];
  290. }else{
  291. [self.viewersBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
  292. make.right.offset(-6.0f);
  293. make.bottom.equalTo(self.callVideoBtn.mas_top).offset(-19.0f);
  294. make.size.mas_offset(CGSizeMake(55.0f, 61.0f));
  295. }];
  296. }
  297. if(model.youpaipis_liveing == 0){
  298. self.liveBtn.hidden = YES;
  299. self.avatorBgAnimationV.hidden = YES;
  300. }else{
  301. self.liveBtn.hidden = NO;
  302. self.avatorBgAnimationV.hidden = NO;
  303. }
  304. // self.bixinLab.text = [NSString stringWithFormat:@"%ld",model.heart_count];
  305. }
  306. //点击了昵称
  307. -(void)clickNickNameAction
  308. {
  309. if (self.delegate && [self.delegate respondsToSelector:@selector(youpaifclickNikname:)]) {
  310. [self.delegate youpaifclickNikname:self.model];
  311. }
  312. }
  313. //点击头像
  314. -(void)youpaifclickAvatarImgView
  315. {
  316. if (self.delegate && [self.delegate respondsToSelector:@selector(youpaifclickAvatar:)]) {
  317. [self.delegate youpaifclickAvatar:self.model];
  318. }
  319. }
  320. //点击关注、取消关注
  321. -(void)followBtnAction:(UIButton *)button
  322. {
  323. if (self.delegate && [self.delegate respondsToSelector:@selector(youpaifclickAttention:)]) {
  324. [self.delegate youpaifclickAttention:self.model];
  325. }
  326. }
  327. //视频点赞
  328. -(void)supportBtn:(UIButton *)button
  329. {
  330. [LCHttpHelper requestWithURLString:TrendsLike parameters:@{@"vt_id":self.model.youpaipvideoId} needToken:YES type:(HttpRequestTypePost) success:^(id responseObject) {
  331. NSDictionary* dict = (NSDictionary*)responseObject;
  332. NSInteger code = [[dict objectForKey:@"code"] integerValue];
  333. if (code==0) {//成功
  334. NSInteger type = [[[dict objectForKey:@"data"] objectForKey:@"type"] integerValue];
  335. NSString *like_count = [NSString stringWithFormat:@"%@",[[dict objectForKey:@"data"] objectForKey:@"like_count"]];
  336. // button.selected = type;
  337. // self.supportLab.text = like_count;
  338. self.model.youpaiplike_count = [like_count integerValue];
  339. self.model.youpaipis_like = type;
  340. if (self.delegate && [self.delegate respondsToSelector:@selector(youpaifclickSupport:)]) {
  341. [self.delegate youpaifclickSupport:self.model];
  342. }
  343. }
  344. } failure:^(NSError *error) {
  345. }];
  346. }
  347. //点击拨打视频
  348. -(void)youpaifvideoBtn:(UIButton *)button
  349. {
  350. if (self.delegate && [self.delegate respondsToSelector:@selector(youpaifclickImVideo:)]) {
  351. [self.delegate youpaifclickImVideo:self.model];
  352. }
  353. }
  354. //点击了比心
  355. -(void)_bixinBtn:(UIButton *)button
  356. {
  357. if (self.delegate && [self.delegate respondsToSelector:@selector(youpaifclickBiXin:)]) {
  358. [self.delegate youpaifclickBiXin:self.model];
  359. }
  360. }
  361. // 点击了礼物
  362. - (void)youpaifgiftBtnClick{
  363. if (self.delegate && [self.delegate respondsToSelector:@selector(youpaifclickGift:)]) {
  364. [self.delegate youpaifclickGift:self.model];
  365. }
  366. }
  367. - (YYImage *)icLiveUserHeader{
  368. NSString *path = [[NSBundle mainBundle] pathForResource:@"ic_live_header" ofType:@"gif"];
  369. return [YYImage imageWithData:[NSData dataWithContentsOfFile:path]];
  370. }
  371. @end