MORedEnvelopeCell.m 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. //
  2. // MORedEnvelopeCell.m
  3. // MiMoLive
  4. //
  5. // Created by SuperC on 2025/6/9.
  6. //
  7. #import "MORedEnvelopeCell.h"
  8. @interface MORedEnvelopeCell ()
  9. @property (nonatomic, strong) UIView *redBgView;
  10. @property (nonatomic, strong) UIImageView *iconImageView;
  11. @property (nonatomic, strong) UILabel *titleLabel;
  12. @property (nonatomic, strong) UIButton *actionButton;
  13. @end
  14. @implementation MORedEnvelopeCell
  15. - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
  16. self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
  17. if (self != nil) {
  18. self.contentView.transform = CGAffineTransformMakeScale(1, -1);
  19. self.backgroundColor = [UIColor clearColor];
  20. self.selectionStyle = UITableViewCellSelectionStyleNone;
  21. [self setupUI];
  22. }
  23. return self;
  24. }
  25. - (void)setupUI{
  26. [self.contentView addSubview:self.redBgView];
  27. [self.redBgView mas_makeConstraints:^(MASConstraintMaker *make) {
  28. make.left.equalTo(self.contentView).offset(MOBgViewOffSet);
  29. make.bottom.equalTo(self.contentView).offset(-MOBgViewOffSet);
  30. make.height.equalTo(@(MOTextRedEnvelopeViewHeight));
  31. make.width.equalTo(@220.0);
  32. }];
  33. [self.redBgView addSubview:self.iconImageView];
  34. [self.iconImageView mas_makeConstraints:^(MASConstraintMaker *make) {
  35. make.centerY.equalTo(self.redBgView);
  36. make.width.equalTo(@33.0);
  37. make.height.equalTo(@38.0);
  38. make.left.equalTo(self.redBgView).offset(16.0);
  39. }];
  40. [self.redBgView addSubview:self.titleLabel];
  41. [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
  42. make.left.equalTo(self.iconImageView.mas_right).offset(8.0);
  43. make.top.equalTo(self.iconImageView.mas_top).offset(0.0);
  44. make.height.equalTo(@16.0);
  45. make.right.equalTo(self.redBgView).offset(-10.0);
  46. }];
  47. [self.redBgView addSubview:self.actionButton];
  48. [self.actionButton mas_makeConstraints:^(MASConstraintMaker *make) {
  49. make.left.equalTo(self.iconImageView.mas_right).offset(8.0);
  50. make.top.equalTo(self.titleLabel.mas_bottom).offset(4.0);
  51. make.right.equalTo(self.redBgView).offset(-10.0);
  52. }];
  53. [self.contentView addSubview:self.bgView];
  54. [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) {
  55. make.left.equalTo(self.contentView).offset(MOBgViewOffSet);
  56. make.width.equalTo(@(MOBgViewMaxWidth));
  57. make.top.equalTo(self.contentView).offset(MOBgViewOffSet);
  58. make.bottom.equalTo(self.redBgView.mas_top).offset(-MOBgViewOffSet);
  59. }];
  60. self.bgView.layer.cornerRadius = 10.0;
  61. [self.bgView addSubview:self.bubbleImgView];
  62. [self.bubbleImgView mas_makeConstraints:^(MASConstraintMaker *make) {
  63. make.left.equalTo(self.bgView).offset(-MOBgViewOffSet);
  64. make.right.equalTo(self.bgView).offset(MOBgViewOffSet);
  65. make.top.equalTo(self.bgView).offset(-MOBgViewOffSet);
  66. make.bottom.equalTo(self.bgView).offset(MOBgViewOffSet);
  67. }];
  68. [self.bgView addSubview:self.contentTextView];
  69. [self.contentTextView mas_makeConstraints:^(MASConstraintMaker *make) {
  70. make.left.equalTo(self.bgView).offset(MOContentLeftAndRighSpacing);
  71. make.right.equalTo(self.bgView).offset(-MOContentLeftAndRighSpacing);
  72. make.centerY.equalTo(self.bgView);
  73. make.height.equalTo(@16.0);
  74. }];
  75. self.contentView.userInteractionEnabled = YES;
  76. _bubbleTapGestureRecognizer = [UITapGestureRecognizer new];
  77. [_bubbleTapGestureRecognizer addTarget:self action:@selector(bubbleTapped:)];
  78. _bubbleTapGestureRecognizer.delegate = self;
  79. [self.contentView addGestureRecognizer:self.bubbleTapGestureRecognizer];
  80. _bubbleLongPressGestureRecognizer = [UILongPressGestureRecognizer new];
  81. [_bubbleLongPressGestureRecognizer addTarget:self action:@selector(bubbleLongPressHandler:)];
  82. [self.contentView addGestureRecognizer:self.bubbleLongPressGestureRecognizer];
  83. }
  84. - (void)bubbleTapped:(UITapGestureRecognizer *)recognizer
  85. {
  86. MOLogV(@"触发了点击");
  87. self.cellTapBlock ? self.cellTapBlock(self.cellModel) : nil;
  88. }
  89. - (void)bubbleLongPressHandler:(UILongPressGestureRecognizer *)recognizer{
  90. if (recognizer.state == UIGestureRecognizerStateBegan){
  91. MOLogV(@"触发了长按");
  92. self.cellLongPressBlock ? self.cellLongPressBlock(self.cellModel) : nil;
  93. recognizer.enabled = NO;
  94. }
  95. else if (recognizer.state == UIGestureRecognizerStateEnded || recognizer.state == UIGestureRecognizerStateCancelled)
  96. {
  97. recognizer.enabled = YES;
  98. }
  99. }
  100. - (void)awakeFromNib {
  101. [super awakeFromNib];
  102. // Initialization code
  103. }
  104. - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
  105. [super setSelected:selected animated:animated];
  106. // Configure the view for the selected state
  107. }
  108. - (void)setCellModel:(MORtmEntity *)cellModel{
  109. _cellModel = cellModel;
  110. NSMutableAttributedString *attributedString = [MOTextTools creteTextWith:cellModel];
  111. self.contentTextView.attributedText = attributedString;
  112. // 计算文本高度
  113. CGFloat contentHeight = cellModel.cellHeight - MOTextRedEnvelopeViewHeight;
  114. if(contentHeight < MORtmContentMixHeight){
  115. contentHeight = MORtmContentMixHeight;
  116. }
  117. [self.contentTextView mas_updateConstraints:^(MASConstraintMaker *make) {
  118. make.height.equalTo(@(contentHeight));
  119. }];
  120. self.bgView.backgroundColor = MONormalBgViewColor;
  121. MORtmJosnEntity *jsonEntity = (MORtmJosnEntity *)cellModel.data;
  122. MORtmUser *rtmUser = cellModel.user;
  123. if(rtmUser.bubble != 0){
  124. UIImage *bubbleImg = [MOTextTools getBubbleImgWithCodeNum:rtmUser.bubble];
  125. if(bubbleImg){
  126. [self.bubbleImgView setImage:bubbleImg];
  127. self.bubbleImgView.hidden = NO;
  128. self.bgView.backgroundColor = [UIColor clearColor];
  129. }
  130. else{
  131. self.bubbleImgView.hidden = YES;
  132. }
  133. }
  134. else{
  135. self.bubbleImgView.hidden = YES;
  136. }
  137. if(cellModel.cellHeight > ((28.0 + MOTextRedEnvelopeViewHeight))){
  138. [self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
  139. make.width.equalTo(@(MOBgViewMaxWidth));
  140. }];
  141. }
  142. else{
  143. CGFloat width = cellModel.contentWidth + MOContentLeftAndRighSpacing * 2.0 + MOContentOffSet * 2.0;
  144. if(width > MOBgViewMaxWidth){
  145. width = MOBgViewMaxWidth;
  146. }
  147. if(width < MOBgViewMinWidth){
  148. width = MOBgViewMinWidth;
  149. }
  150. [self.bgView mas_updateConstraints:^(MASConstraintMaker *make) {
  151. make.width.equalTo(@(width));
  152. }];
  153. }
  154. }
  155. #pragma mark - Lazy
  156. - (UIView *)redBgView{
  157. if (!_redBgView) {
  158. _redBgView = [[UIView alloc] init];
  159. _redBgView.backgroundColor = [MOTools colorWithHexString:@"#FF4DA6"];
  160. _redBgView.layer.cornerRadius = 12.0;
  161. _redBgView.layer.masksToBounds = YES;
  162. }
  163. return _redBgView;
  164. }
  165. - (UIImageView *)iconImageView{
  166. if (!_iconImageView) {
  167. _iconImageView = [[UIImageView alloc] init];
  168. _iconImageView.image = [UIImage imageNamed:@"icon_live_red_p"];
  169. _iconImageView.contentMode = UIViewContentModeScaleAspectFill;
  170. }
  171. return _iconImageView;
  172. }
  173. - (UILabel *)titleLabel{
  174. if (!_titleLabel) {
  175. _titleLabel = [[UILabel alloc] init];
  176. _titleLabel.textColor = [UIColor whiteColor];
  177. _titleLabel.font = [MOTextTools mediumFont:14.0];
  178. _titleLabel.text = NSLocalString(@"mimo_2_rtm_angpao");
  179. }
  180. return _titleLabel;
  181. }
  182. - (UIButton *)actionButton{
  183. if (!_actionButton) {
  184. _actionButton = [UIButton buttonWithType:UIButtonTypeCustom];
  185. [_actionButton setTitle:NSLocalString(@"mimo_2_rtm_angpao_tip") forState:UIControlStateNormal];
  186. [_actionButton setTitleColor:[MOTools colorWithHexString:@"#FFE254"] forState:UIControlStateNormal];
  187. _actionButton.titleLabel.font = [MOTextTools mediumFont:14.0];
  188. [_actionButton setImage:[UIImage imageNamed:@"v_2_new_yellow_right"] forState:UIControlStateNormal];
  189. _actionButton.userInteractionEnabled = NO;
  190. _actionButton.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
  191. _actionButton.imageEdgeInsets = UIEdgeInsetsMake(0, 2, 0, 0);
  192. _actionButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
  193. [_actionButton setFont:[MOTextTools mediumFont:13.0]];
  194. }
  195. return _actionButton;
  196. }
  197. - (UIView *)bgView
  198. {
  199. if (_bgView == nil)
  200. {
  201. _bgView = [UIView new];
  202. _bgView.backgroundColor = MONormalBgViewColor;
  203. }
  204. return _bgView;
  205. }
  206. - (UIImageView *)bubbleImgView{
  207. if(!_bubbleImgView){
  208. _bubbleImgView = [[UIImageView alloc] init];
  209. [_bubbleImgView setImage:[UIImage imageNamed:@""]];
  210. }
  211. return _bubbleImgView;
  212. }
  213. - (MOMsgContentTextView *)contentTextView{
  214. if(!_contentTextView){
  215. _contentTextView = [MOMsgContentTextView new];
  216. _contentTextView.backgroundColor = [UIColor clearColor];
  217. _contentTextView.textContainerInset = UIEdgeInsetsMake(MOContentBaseTopSpcing, MOContentBaseLeftSpacing, MOContentBaseBottomSpcing, MOContentBaseRightSpacing);//UITextView原本文字距离左右有间距,设置负数消除边距
  218. _contentTextView.editable = NO;
  219. _contentTextView.scrollEnabled = NO;//防止滑出屏幕又滑入时有时单行文字消失
  220. _contentTextView.userInteractionEnabled = NO;
  221. _contentTextView.textColor = [MOTools colorWithHexString:@"#FFFFFF" alpha:1.0];
  222. }
  223. return _contentTextView;
  224. }
  225. @end