// // LuckyPackageViewController.m // YuMi // // Created by P on 2025/1/10. // #import "LuckyPackageViewController.h" #import "MoliMoneyLabel.h" #import "EmptyDataView.h" #import "NSDate+DateUtils.h" #import "RoomInfoModel.h" #import "UserInfoModel.h" #import "LuckyPackagePresenter.h" #import "XPIAPRechargeViewController.h" #import "XCCurrentVCStackManager.h" #import "LuckyPackageLogicManager.h" #import "LuckyPackageBannerView.h" #import "XPWebViewController.h" #import "XPGiftCollectionViewFlowLayout.h" @interface LuckyPackageRuleView : UIView @property(nonatomic, assign) UIButton *backButton; @property(nonatomic, strong) XPWebViewController *webView; @end @implementation LuckyPackageRuleView @end @interface LuckyPackageRecordsCell : UITableViewCell @property(nonatomic, strong) RedEnvelopeListVo *cellModel; @property(nonatomic, assign) NSInteger type; @property(nonatomic, strong) UILabel *titleLabel; @property(nonatomic, strong) UILabel *timeLabel; @property(nonatomic, strong) UILabel *moneyLabel; @property(nonatomic, strong) UILabel *giftNumLabel; @property(nonatomic, strong) UIImageView *moneyImageView; @end @implementation LuckyPackageRecordsCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { self.backgroundColor = [UIColor clearColor]; self.contentView.backgroundColor = [UIColor clearColor]; [self.contentView addSubview:self.timeLabel]; [self.contentView addSubview:self.titleLabel]; [self.contentView addSubview:self.moneyLabel]; [self.contentView addSubview:self.giftNumLabel]; [self.contentView addSubview:self.moneyImageView]; [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(self.contentView); make.bottom.mas_equalTo(self.contentView).offset(-12); }]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(self.contentView); make.top.mas_equalTo(self.contentView).offset(8); }]; [self.moneyImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.trailing.centerY.mas_equalTo(self.contentView); make.size.mas_equalTo(CGSizeMake(17, 17)); }]; [self.moneyLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.trailing.mas_equalTo(self.moneyImageView.mas_leading).offset(-4); make.centerY.mas_equalTo(self.moneyImageView); }]; [self.giftNumLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.trailing.centerY.mas_equalTo(self.contentView); }]; } return self; } - (void)setCellModel:(RedEnvelopeListVo *)cellModel { _cellModel = cellModel; if (self.type == 1) { self.timeLabel.text = [[NSDate dateWithTimeIntervalSince1970:cellModel.beginTime/1000] stringForYearMonthDayDashed]; } else { self.timeLabel.text = [[NSDate dateWithTimeIntervalSince1970:cellModel.createTime/1000] stringForYearMonthDayDashed]; } if ([cellModel.type isEqualToString:@"DIAMOND"]) { self.giftNumLabel.hidden = YES; self.moneyLabel.hidden = NO; self.moneyImageView.hidden = NO; self.moneyLabel.text = @(cellModel.originalAmount).stringValue; if (self.type == 1) { self.titleLabel.text = YMLocalizedString(@"1.0.37_text_2"); } else { self.titleLabel.text = cellModel.nick; } } else if ([cellModel.type isEqualToString:@"GIFT"]) { self.giftNumLabel.hidden = NO; self.moneyLabel.hidden = YES; self.moneyImageView.hidden = YES; if (self.type == 1) { self.titleLabel.text = YMLocalizedString(@"1.0.37_text_1"); self.giftNumLabel.text = [NSString stringWithFormat:@"%@*%@", YMLocalizedString(@"1.0.37_text_10"), @(cellModel.num)]; } else { self.titleLabel.text = cellModel.nick; self.giftNumLabel.text = [NSString stringWithFormat:@"%@*%@", cellModel.giftName, @(cellModel.originalAmount)]; } } } #pragma mark - - (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [UILabel labelInitWithText:@"" font:kFontMedium(14) textColor:UIColorFromRGB(0xffea5c)]; } return _titleLabel; } - (UILabel *)timeLabel { if (!_timeLabel) { _timeLabel = [UILabel labelInitWithText:@"" font:kFontMedium(12) textColor:UIColorFromRGB(0xffea5c)]; _timeLabel.alpha = 0.6; } return _timeLabel; } - (UILabel *)moneyLabel { if (!_moneyLabel) { _moneyLabel = [UILabel labelInitWithText:@"" font:kFontMedium(15) textColor:UIColorFromRGB(0xffea5c)]; } return _moneyLabel; } - (UILabel *)giftNumLabel { if (!_giftNumLabel) { _giftNumLabel = [UILabel labelInitWithText:@"" font:kFontMedium(15) textColor:UIColorFromRGB(0xffea5c)]; } return _giftNumLabel; } - (UIImageView *)moneyImageView { if (!_moneyImageView) { _moneyImageView = [[UIImageView alloc] initWithImage:kImage(@"moli_money_icon")]; } return _moneyImageView; } @end @interface LuckyPackageRecordsListView : UIView @property(nonatomic, strong) NSMutableArray *dataSource; @property(nonatomic, strong) UITableView *tableView; @property(nonatomic, assign) NSInteger type; @property(nonatomic, strong) UIImageView *emptyImage; @end @implementation LuckyPackageRecordsListView - (instancetype)init { self = [super init]; if (self) { _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain]; _tableView.delegate = self; _tableView.dataSource = self; _tableView.backgroundColor = [UIColor clearColor]; _tableView.separatorColor = UIColorFromRGB(0xb75a6f); _tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0); // 左右间距 15 [_tableView registerClass:[LuckyPackageRecordsCell class] forCellReuseIdentifier:@"LuckyPackageRecordsCell"]; [self addSubview:_tableView]; [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.bottom.mas_equalTo(self); make.leading.trailing.mas_equalTo(self).inset(22.5); }]; _emptyImage = [[UIImageView alloc] initWithImage:kImage(@"缺省")]; _emptyImage.hidden = YES; [self addSubview:_emptyImage]; [self.emptyImage mas_makeConstraints:^(MASConstraintMaker *make) { make.top.centerX.mas_equalTo(self); make.size.mas_equalTo(CGSizeMake(123, 123)); }]; } return self; } - (void)setDataSource:(NSMutableArray *)dataSource { _dataSource = dataSource; [self.tableView reloadData]; self.emptyImage.hidden = dataSource.count > 0; } #pragma mark - - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 60; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.dataSource.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { LuckyPackageRecordsCell *cell = [tableView dequeueReusableCellWithIdentifier:@"LuckyPackageRecordsCell" forIndexPath:indexPath]; cell.type = self.type; cell.cellModel = [self.dataSource xpSafeObjectAtIndex:indexPath.row]; return cell; } @end @interface LuckyPackageRecordsView : UIView { UIImageView *backgroundImageView; UIView *topButtonsContainer; UIView *selectedPill; } @property(nonatomic, strong) NetImageView *avatarImageView; @property(nonatomic, strong) UILabel *nickLabel; @property(nonatomic, strong) LuckyPackageRecordsListView *sentRecordsView; @property(nonatomic, strong) LuckyPackageRecordsListView *receiveRecordsView; @property(nonatomic, strong) UIButton *backButton; @property(nonatomic, strong) UIButton *receivedButton; @property(nonatomic, strong) UIButton *sentButton; @property(nonatomic, assign) BOOL currentSelectedIsReceive; @property(nonatomic, copy)void(^tapBackButton)(void); @property(nonatomic, copy)void(^switchTap)(BOOL isReceive); @property(nonatomic, copy)NSArray *dateSource; - (void)updateWithUserInfo:(UserInfoModel *)userInfo; @end @implementation LuckyPackageRecordsView - (instancetype)init { self = [super init]; if (self) { backgroundImageView = [[UIImageView alloc] initWithImage:kImage(@"luck_package_records_bg")]; [self addSubview:backgroundImageView]; [backgroundImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; topButtonsContainer = [[UIView alloc] init]; topButtonsContainer.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2]; [topButtonsContainer setCornerRadius:17.5]; [self addSubview:topButtonsContainer]; [topButtonsContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(40); make.leading.trailing.mas_equalTo(self).inset(23); make.height.mas_equalTo(35); }]; selectedPill = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 165, 35)]; [selectedPill addGradientBackgroundWithColors:@[ UIColorFromRGB(0xfff437), UIColorFromRGB(0xff9f00) ] startPoint:CGPointMake(0.5, 0) endPoint:CGPointMake(0.5, 1) cornerRadius:17.5]; [self addSubview:selectedPill]; [self addSubview:self.sentButton]; [self addSubview:self.receivedButton]; [self.sentButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.trailing.bottom.mas_equalTo(topButtonsContainer); make.width.mas_equalTo(topButtonsContainer.mas_width).multipliedBy(0.5); }]; [self.receivedButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.leading.bottom.mas_equalTo(topButtonsContainer); make.width.mas_equalTo(topButtonsContainer.mas_width).multipliedBy(0.5); }]; [selectedPill mas_makeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self.receivedButton); make.size.mas_equalTo(self.receivedButton); }]; [self addSubview:self.avatarImageView]; [self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self); make.top.mas_equalTo(topButtonsContainer.mas_bottom).offset(14); make.size.mas_equalTo(65); }]; [self addSubview:self.nickLabel]; [self.nickLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self); make.top.mas_equalTo(self.avatarImageView.mas_bottom).offset(9); }]; [self addSubview:self.backButton]; [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self); make.leading.mas_equalTo(11); make.size.mas_equalTo(CGSizeMake(30, 30)); }]; [self addSubview:self.sentRecordsView]; [self addSubview:self.receiveRecordsView]; [self.sentRecordsView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.nickLabel.mas_bottom).offset(20); make.leading.bottom.trailing.mas_equalTo(self); }]; [self.receiveRecordsView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.nickLabel.mas_bottom).offset(20); make.leading.bottom.trailing.mas_equalTo(self); }]; [self didTapReceive]; } return self; } - (void)setDateSource:(NSArray *)dateSource { _dateSource = dateSource; if (self.currentSelectedIsReceive) { [self.receiveRecordsView setDataSource:dateSource.mutableCopy]; } else { [self.sentRecordsView setDataSource:dateSource.mutableCopy]; } self.avatarImageView.hidden = dateSource.count == 0; self.nickLabel.hidden = dateSource.count == 0; } - (void)didTapBack { if (_tapBackButton) { _tapBackButton(); } } - (void)didTapSent { if (!self.currentSelectedIsReceive) { return; } [selectedPill mas_remakeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self.sentButton); make.size.mas_equalTo(self.sentButton); }]; self.sentButton.selected = YES; self.receivedButton.selected = NO; self.sentRecordsView.hidden = NO; self.receiveRecordsView.hidden = YES; self.currentSelectedIsReceive = NO; if (_switchTap) { self.switchTap(NO); } } - (void)didTapReceive { if (self.currentSelectedIsReceive) { return; } [selectedPill mas_remakeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self.receivedButton); make.size.mas_equalTo(self.receivedButton); }]; self.sentButton.selected = NO; self.receivedButton.selected = YES; self.sentRecordsView.hidden = YES; self.receiveRecordsView.hidden = NO; self.currentSelectedIsReceive = YES; if (_switchTap) { self.switchTap(YES); } } - (void)updateWithUserInfo:(UserInfoModel *)userInfo { self.avatarImageView.imageUrl = userInfo.avatar; self.nickLabel.text = userInfo.nick; } #pragma mark - - (NetImageView *)avatarImageView { if (!_avatarImageView) { NetImageConfig * config = [[NetImageConfig alloc]init]; config.imageType = ImageTypeUserIcon; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; _avatarImageView = [[NetImageView alloc] initWithConfig:config]; [_avatarImageView setAllCornerRadius:65/2 borderWidth:2 borderColor:UIColorFromRGB(0xffd168)]; } return _avatarImageView; } - (UILabel *)nickLabel { if (!_nickLabel) { _nickLabel = [UILabel labelInitWithText:@"" font:kFontMedium(14) textColor:UIColorFromRGB(0xffea5c)]; _nickLabel.textAlignment = NSTextAlignmentCenter; } return _nickLabel; } - (LuckyPackageRecordsListView *)sentRecordsView { if (!_sentRecordsView) { _sentRecordsView = [[LuckyPackageRecordsListView alloc] init]; _sentRecordsView.type = 1; } return _sentRecordsView; } - (LuckyPackageRecordsListView *)receiveRecordsView { if (!_receiveRecordsView) { _receiveRecordsView = [[LuckyPackageRecordsListView alloc] init]; _receiveRecordsView.type = 2; } return _receiveRecordsView; } - (UIButton *)backButton { if (!_backButton) { _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_backButton setImage:kImage(@"luck_package_records_back") forState:UIControlStateNormal]; [_backButton addTarget:self action:@selector(didTapBack) forControlEvents:UIControlEventTouchUpInside]; } return _backButton; } - (UIButton *)sentButton { if (!_sentButton) { _sentButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_sentButton setTitle:YMLocalizedString(@"1.0.37_text_15") forState:UIControlStateNormal]; [_sentButton setTitleColor:UIColorFromRGB(0xffea5c) forState:UIControlStateNormal]; [_sentButton setTitleColor:UIColorFromRGB(0x292601) forState:UIControlStateSelected]; [_sentButton addTarget:self action:@selector(didTapSent) forControlEvents:UIControlEventTouchUpInside]; } return _sentButton; } - (UIButton *)receivedButton { if (!_receivedButton) { _receivedButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_receivedButton setTitle:YMLocalizedString(@"1.0.37_text_14") forState:UIControlStateNormal]; [_receivedButton setTitleColor:UIColorFromRGB(0xffea5c) forState:UIControlStateNormal]; [_receivedButton setTitleColor:UIColorFromRGB(0x292601) forState:UIControlStateSelected]; [_receivedButton addTarget:self action:@selector(didTapReceive) forControlEvents:UIControlEventTouchUpInside]; _receivedButton.selected = YES; } return _receivedButton; } @end @interface GiftCountCalculator : UIView @property(nonatomic, assign) NSInteger count; @property(nonatomic, strong) UILabel *countLabel; @property(nonatomic, strong) UIButton *reduceButton; @property(nonatomic, strong) UIButton *increaseButton; @property(nonatomic, copy) void(^tapReduce)(NSInteger count); @property(nonatomic, copy) void(^tapIncrease)(NSInteger count); @property(nonatomic, copy) void(^tapCountLabel)(void); - (void)reset; - (void)updateCount:(NSInteger)count; @end @implementation GiftCountCalculator - (instancetype)init { self = [super init]; if (self) { self.count = 0; self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2]; [self setCornerRadius:4]; _countLabel = [UILabel labelInitWithText:@"0" font:kFontMedium(12) textColor:[UIColor whiteColor]]; _countLabel.textAlignment = NSTextAlignmentCenter; _countLabel.backgroundColor = [UIColor colorWithWhite:0 alpha:0.3]; _countLabel.userInteractionEnabled = YES; [_countLabel setCornerRadius:4]; _reduceButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_reduceButton setImage:kImage(@"luck_package_item_reduce") forState:UIControlStateNormal]; [_reduceButton addTarget:self action:@selector(didTapReduce) forControlEvents:UIControlEventTouchUpInside]; _increaseButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_increaseButton setImageEdgeInsets:UIEdgeInsetsMake(2, 2, 2, 2)]; [_increaseButton setImage:kImage(@"mine_guild_add_room") forState:UIControlStateNormal]; [_increaseButton addTarget:self action:@selector(didTapIncrease) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:self.countLabel]; [self addSubview:self.reduceButton]; [self addSubview:self.increaseButton]; [self.countLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self); make.size.mas_equalTo(CGSizeMake(22, 18)); }]; [self.reduceButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.leading.bottom.mas_equalTo(self); make.width.mas_equalTo(self.reduceButton.mas_height); }]; [self.increaseButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.trailing.bottom.mas_equalTo(self); make.width.mas_equalTo(self.reduceButton.mas_height); }]; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(displayKeyboard)]; [self.countLabel addGestureRecognizer:tap]; } return self; } - (void)reset { self.count = 0; self.countLabel.text = @"0"; } - (void)updateCount:(NSInteger)count { self.count = count; self.countLabel.text = @(self.count).stringValue; } - (void)didTapReduce { _count = MAX(0, _count-1); self.countLabel.text = @(self.count).stringValue; if (_tapReduce) { _tapReduce(_count); } } - (void)didTapIncrease { _count = MIN(99, _count+1); self.countLabel.text = @(self.count).stringValue; if (_tapIncrease) { _tapIncrease(_count); } } - (void)displayKeyboard { if (_tapCountLabel) { self.tapCountLabel(); } } @end @interface OneLineImageItemCell : UICollectionViewCell - (void)updateCell:(NSNumber *)content index:(NSInteger)index; @end @implementation OneLineImageItemCell { UIImageView *normalBGImageView; UIImageView *selectedBGImageView; UIImageView *iconImageView; UILabel *numberLabel; UIImageView *moneyImageView; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self.contentView setCornerRadius:12 corners:UIRectCornerTopLeft|UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight borderWidth:1 borderColor:UIColorFromRGB(0xffd168)]; normalBGImageView = [[UIImageView alloc] initWithImage:[UIImage gradientColorImageFromColors:@[ UIColorFromRGB(0x97000c), UIColorFromRGB(0x610015) ] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(75, 100)]]; selectedBGImageView = [[UIImageView alloc] initWithImage:[UIImage gradientColorImageFromColors:@[ UIColorFromRGB(0xFFF437), UIColorFromRGB(0xFF9f00) ] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(75, 100)]]; selectedBGImageView.hidden = YES; iconImageView = [[UIImageView alloc] init]; numberLabel = [UILabel labelInitWithText:@"0" font:kFontRegular(13) textColor:UIColorFromRGB(0xffea5c)]; moneyImageView = [[UIImageView alloc] initWithImage:kImage(@"moli_money_icon")]; moneyImageView.contentMode = UIViewContentModeScaleAspectFit; UIStackView *stack = [[UIStackView alloc] initWithArrangedSubviews:@[ numberLabel, moneyImageView ]]; stack.spacing = 2.5; stack.axis = UILayoutConstraintAxisHorizontal; [self.contentView addSubview:normalBGImageView]; [self.contentView addSubview:selectedBGImageView]; [self.contentView addSubview:iconImageView]; [self.contentView addSubview:stack]; [normalBGImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.contentView); }]; [selectedBGImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.contentView); }]; [iconImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.leading.trailing.mas_equalTo(self.contentView).inset(6.5); make.height.mas_equalTo(iconImageView.mas_width); }]; [stack mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self.contentView); make.bottom.mas_equalTo(self.contentView).offset(-6); make.height.mas_equalTo(16); }]; } return self; } - (void)setSelected:(BOOL)selected { [super setSelected:selected]; if (selected) { normalBGImageView.hidden = YES; selectedBGImageView.hidden = NO; numberLabel.textColor = UIColorFromRGB(0x292601); } else { normalBGImageView.hidden = NO; selectedBGImageView.hidden = YES; numberLabel.textColor = UIColorFromRGB(0xffea5c); } } - (void)updateCell:(NSNumber *)content index:(NSInteger)index { switch (index) { case 0: iconImageView.image = kImage(@"luck_package_bag_lv1"); break; case 1: iconImageView.image = kImage(@"luck_package_bag_lv2"); break; case 2: iconImageView.image = kImage(@"luck_package_bag_lv3"); break; case 3: iconImageView.image = kImage(@"luck_package_bag_lv4"); break; default: break; } numberLabel.text = content.stringValue; } @end @interface OneLineImageButtons : UIView @property(nonatomic, copy) NSArray *dataSource; @property(nonatomic, copy) void(^didSelected)(NSInteger index); @end @implementation OneLineImageButtons { UICollectionView *collectionView; } - (instancetype)init { self = [super init]; if (self) { UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; layout.itemSize = CGSizeMake(kGetScaleWidth(75), kGetScaleWidth(100)); layout.sectionInset = UIEdgeInsetsMake(0, 20, 0, 20); collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; collectionView.backgroundColor = [UIColor clearColor]; collectionView.delegate = self; collectionView.dataSource = self; [collectionView registerClass:[OneLineImageItemCell class] forCellWithReuseIdentifier:@"OneLineImageItemCell"]; [self addSubview:collectionView]; [collectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; } return self; } - (void)setDataSource:(NSArray *)dataSource { _dataSource = dataSource; [collectionView reloadData]; dispatch_async(dispatch_get_main_queue(), ^{ NSIndexPath *firstIndexPath = [NSIndexPath indexPathForItem:0 inSection:0]; [self->collectionView selectItemAtIndexPath:firstIndexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone]; }); } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.dataSource.count; } - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { OneLineImageItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"OneLineImageItemCell" forIndexPath:indexPath]; [cell updateCell:[self.dataSource xpSafeObjectAtIndex:indexPath.item] index:indexPath.item]; return cell; } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { if (_didSelected) { self.didSelected(indexPath.item); } } @end @interface OneLineButtons : UIView @property(nonatomic, copy) NSArray *dataSource; @property(nonatomic, copy) void(^didSelected)(NSInteger index); @end @implementation OneLineButtons { UIButton *button_1; UIButton *button_2; UIButton *button_3; UIButton *button_4; } - (instancetype)init { self = [super init]; if (self) { button_1 = [self createButton:0]; button_2 = [self createButton:1]; button_3 = [self createButton:2]; button_4 = [self createButton:3]; UIStackView *stack = [[UIStackView alloc] initWithArrangedSubviews:@[ button_1, button_2, button_3, button_4 ]]; stack.spacing = 10; stack.distribution = UIStackViewDistributionFillEqually; [self addSubview:stack]; [stack mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self).insets(UIEdgeInsetsMake(0, 20, 0, 20)); }]; button_1.selected = YES; } return self; } - (UIButton *)createButton:(NSInteger)tag { UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; b.tag = tag; b.frame = CGRectMake(0, 0, kGetScaleWidth(80), 30); UIImage *normalImage = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0x97000C), UIColorFromRGB(0x610015)] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(kGetScaleWidth(80), 30)]; UIImage *selectedImage = [UIImage gradientColorImageFromColors:@[UIColorFromRGB(0xFFF437), UIColorFromRGB(0xFF9F00)] gradientType:GradientTypeTopToBottom imgSize:CGSizeMake(kGetScaleWidth(80), 30)]; [b setCornerRadius:6 corners:UIRectCornerTopLeft|UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight borderWidth:0.5 borderColor:UIColorFromRGB(0xFEF057)]; [b setBackgroundImage:normalImage forState:UIControlStateNormal]; [b setBackgroundImage:selectedImage forState:UIControlStateSelected]; [b setTitleColor:UIColorFromRGB(0xFFEA5C) forState:UIControlStateNormal]; [b setTitleColor:UIColorFromRGB(0x292601) forState:UIControlStateSelected]; [b.titleLabel setFont:kFontRegular(12)]; [b addTarget:self action:@selector(handleTapEvent:) forControlEvents:UIControlEventTouchUpInside]; return b; } - (void)setDataSource:(NSArray *)dataSource { _dataSource = dataSource; [button_1 setTitle:dataSource[0] forState:UIControlStateNormal]; [button_2 setTitle:dataSource[1] forState:UIControlStateNormal]; [button_3 setTitle:dataSource[2] forState:UIControlStateNormal]; [button_4 setTitle:dataSource[3] forState:UIControlStateNormal]; } - (void)handleTapEvent:(UIButton *)sender { button_1.selected = NO; button_2.selected = NO; button_3.selected = NO; button_4.selected = NO; sender.selected = YES; if (_didSelected) { self.didSelected(sender.tag); } } @end @interface WalletBalanceDisplayView : UIView @property(nonatomic, strong) UIImageView *moneyImageView; @property(nonatomic, strong) UILabel *balanceLabel; @property(nonatomic, strong) UIButton *addButton; @property(nonatomic, strong) UIView *spacer; @property(nonatomic, strong) UIStackView *stack; @property(nonatomic, copy) void(^tapAddButton)(void); - (void)hideAddButton; - (void)updatePrice:(double)price; @end @implementation WalletBalanceDisplayView - (instancetype)init { self = [super init]; if (self) { _moneyImageView = [[UIImageView alloc] initWithImage:kImage(@"moli_money_icon")]; _moneyImageView.contentMode = UIViewContentModeScaleAspectFit; // [self addSubview:self.moneyImageView]; _balanceLabel = [UILabel labelInitWithText:@"0" font:kFontMedium(15) textColor:UIColorFromRGB(0xFFEA5C)]; // [self addSubview:self.balanceLabel]; _addButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_addButton setImage:kImage(@"luck_package_add") forState:UIControlStateNormal]; [self.addButton addTarget:self action:@selector(didTapAddButton) forControlEvents:UIControlEventTouchUpInside]; _spacer = [[UIView alloc] init]; self.spacer.backgroundColor = [UIColor clearColor]; _stack = [[UIStackView alloc] initWithArrangedSubviews:@[ self.moneyImageView, self.balanceLabel, self.addButton, self.spacer ]]; self.stack.spacing = 4; self.stack.alignment = UIStackViewAlignmentLeading; self.stack.distribution = UIStackViewDistributionFill; [self addSubview:self.stack]; [self.stack mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; // **让 spacer 充满右侧空间** [self.spacer setContentHuggingPriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; } return self; } - (void)hideAddButton { self.addButton.hidden = YES; self.spacer.hidden = YES; self.stack.alignment = UIStackViewAlignmentCenter; } - (void)updatePrice:(double)price { self.balanceLabel.text = @(price).stringValue; } - (void)didTapAddButton { if (_tapAddButton) { self.tapAddButton(); } } @end @interface ChooseViewTitleBar : UIView @property(nonatomic, strong) UILabel *titleLabel; @property(nonatomic, strong) UIImageView *leftImageView; @property(nonatomic, strong) UIImageView *rightImageView; - (void)updateTitle:(NSString *)content; @end @implementation ChooseViewTitleBar - (instancetype)init { self = [super init]; if (self) { _titleLabel = [UILabel labelInitWithText:@"" font:kFontMedium(14) textColor:UIColorFromRGB(0xffea5c)]; if (isMSRTL()) { _leftImageView = [[UIImageView alloc] initWithImage:kImage(@"luck_package_right")]; _rightImageView = [[UIImageView alloc] initWithImage:kImage(@"luck_package_left")]; } else { _leftImageView = [[UIImageView alloc] initWithImage:kImage(@"luck_package_left")]; _rightImageView = [[UIImageView alloc] initWithImage:kImage(@"luck_package_right")]; } _leftImageView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; _rightImageView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; [self addSubview:self.titleLabel]; [self addSubview:self.leftImageView]; [self addSubview:self.rightImageView]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.center.mas_equalTo(self); make.height.mas_equalTo(18); }]; [self.leftImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self.titleLabel); make.trailing.mas_equalTo(self.titleLabel.mas_leading).offset(-15); make.size.mas_equalTo(CGSizeMake(80, 15)); }]; [self.rightImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self.titleLabel); make.leading.mas_equalTo(self.titleLabel.mas_trailing).offset(15); make.size.mas_equalTo(CGSizeMake(80, 15)); }]; } return self; } - (void)updateTitle:(NSString *)content { self.titleLabel.text = content; } @end @interface ChooseCoinView : UIView @property(nonatomic, strong) UIScrollView *scrollView; @property(nonatomic, strong) OneLineImageButtons *oneLineImageButtons; @property(nonatomic, strong) ChooseViewTitleBar *luckyBagTitleBar; @property(nonatomic, strong) ChooseViewTitleBar *waitingTitleBar; @property(nonatomic, strong) OneLineButtons *luckyBagOneLineButtons; @property(nonatomic, strong) OneLineButtons *waitingTimeOneLineButtons; @property(nonatomic, strong) UILabel *totalCostLabel; @property(nonatomic, strong) WalletBalanceDisplayView *walletView; @property(nonatomic, strong) UIButton *sendButton; @property(nonatomic, copy) void(^tapSendCoin)(void); @end @implementation ChooseCoinView - (instancetype)init { self = [super init]; if (self) { _scrollView = [[UIScrollView alloc] init]; [self addSubview:self.scrollView]; [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; // 创建容器视图,承载所有内容 UIView *contentView = [[UIView alloc] init]; contentView.backgroundColor = [UIColor clearColor]; [self.scrollView addSubview:contentView]; // 使用 Masonry 设置容器视图的约束 [contentView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.scrollView); // 与 scrollView 对齐 make.width.mas_equalTo(self.scrollView); // 宽度与 scrollView 相同 }]; _oneLineImageButtons = [[OneLineImageButtons alloc] init]; [contentView addSubview:self.oneLineImageButtons]; [self.oneLineImageButtons mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(50); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(kGetScaleWidth(100)); }]; _luckyBagTitleBar = [[ChooseViewTitleBar alloc] init]; [contentView addSubview:self.luckyBagTitleBar]; [self.luckyBagTitleBar updateTitle:YMLocalizedString(@"1.0.37_text_8")]; [self.luckyBagTitleBar mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.oneLineImageButtons.mas_bottom).offset(46); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(18); }]; _luckyBagOneLineButtons = [[OneLineButtons alloc] init]; [contentView addSubview:self.luckyBagOneLineButtons]; [self.luckyBagOneLineButtons mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.luckyBagTitleBar.mas_bottom).offset(12.5); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(30); }]; _waitingTitleBar = [[ChooseViewTitleBar alloc] init]; [contentView addSubview:self.waitingTitleBar]; [self.waitingTitleBar updateTitle:YMLocalizedString(@"1.0.37_text_5")]; [self.waitingTitleBar mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.luckyBagOneLineButtons.mas_bottom).offset(46); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(18); }]; _waitingTimeOneLineButtons = [[OneLineButtons alloc] init]; [contentView addSubview:self.waitingTimeOneLineButtons]; [self.waitingTimeOneLineButtons mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.waitingTitleBar.mas_bottom).offset(12.5); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(30); }]; _totalCostLabel = [UILabel labelInitWithText:@"" font:kFontRegular(12) textColor:UIColorFromRGB(0xffea5c)]; _totalCostLabel.textAlignment = NSTextAlignmentCenter; [contentView addSubview:self.totalCostLabel]; [self.totalCostLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.waitingTimeOneLineButtons.mas_bottom).offset(30); make.leading.trailing.mas_equalTo(contentView); }]; UIView *space = [[UIView alloc] init]; [contentView addSubview:space]; [space mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.leading.trailing.mas_equalTo(contentView); make.top.mas_equalTo(self.totalCostLabel.mas_bottom); make.height.mas_equalTo(100); }]; _walletView = [[WalletBalanceDisplayView alloc] init]; [_walletView setTapAddButton:^{ // @kStrongify(self); // [self gotoChargeView]; }]; [self addSubview:self.walletView]; [self.walletView mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.mas_equalTo(self).offset(-32); make.leading.mas_equalTo(self).offset(23); make.width.mas_equalTo(150); make.height.mas_equalTo(24); }]; _sendButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_sendButton.titleLabel setFont:kFontSemibold(15)]; [_sendButton setBackgroundImage:kImage(@"luck_package_send_bg") forState:UIControlStateNormal]; [_sendButton setTitle:YMLocalizedString(@"1.0.37_text_15.2") forState:UIControlStateNormal]; [_sendButton setTitleColor:UIColorFromRGB(0x292601) forState:UIControlStateNormal]; [_sendButton addTarget:self action:@selector(didTapSendButton) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:self.sendButton]; [self.sendButton mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.trailing.mas_equalTo(self).offset(-18); make.width.mas_equalTo(190); make.height.mas_equalTo(50); }]; [self setupDataSource]; } return self; } - (void)setupDataSource { NSArray *moneys = [[LuckyPackageLogicManager sharedInstance] loadConfigLuckyBagMoneys]; [self.oneLineImageButtons setDataSource:moneys]; [self.oneLineImageButtons setDidSelected:^(NSInteger index) { [[LuckyPackageLogicManager sharedInstance] updateSelectedBag:[moneys[index] integerValue]]; }]; NSMutableArray *arr_bag = @[].mutableCopy; NSArray *bagNumber = [[LuckyPackageLogicManager sharedInstance] loadConfigLuckyBagNumbers]; for (NSNumber *num in bagNumber) { [arr_bag addObject:num.stringValue]; } [self.luckyBagOneLineButtons setDataSource:arr_bag.copy]; [self.luckyBagOneLineButtons setDidSelected:^(NSInteger index) { [[LuckyPackageLogicManager sharedInstance] updateSelectedBagNum:[bagNumber[index] integerValue]]; }]; NSArray *times = [[LuckyPackageLogicManager sharedInstance] loadConfigWaitingTimesMins]; NSMutableArray *arr_time = @[].mutableCopy; for (NSNumber *time in times) { [arr_time addObject:[NSString stringWithFormat:YMLocalizedString(@"1.0.37_text_7"), time]]; } [self.waitingTimeOneLineButtons setDataSource:arr_time.copy]; [self.waitingTimeOneLineButtons setDidSelected:^(NSInteger index) { [[LuckyPackageLogicManager sharedInstance] updateSelectedBagWaitingTime:[times[index] integerValue] * 60]; }]; [self.walletView updatePrice:[[LuckyPackageLogicManager sharedInstance] loadSavedWalletInfo].diamonds.doubleValue]; self.totalCostLabel.attributedText = [[LuckyPackageLogicManager sharedInstance] loadCoinTotalCostString]; @kWeakify(self); [[LuckyPackageLogicManager sharedInstance] registerCoinTotalCostString:^(NSAttributedString * _Nonnull content) { @kStrongify(self); self.totalCostLabel.attributedText = content; }]; } - (void)didTapSendButton { if (_tapSendCoin) { _tapSendCoin(); } } @end @interface ChooseGiftCell : UICollectionViewCell @property(nonatomic, strong) GiftInfoModel *cellModel; @property(nonatomic, assign) NSInteger giftCount; @property(nonatomic, strong) UIView *bgView; @property(nonatomic, strong) NetImageView *giftIconImageView; @property(nonatomic, strong) MarqueeLabel *giftNameLabel; @property(nonatomic, strong) UILabel *giftCountLabel; @property(nonatomic, strong) GiftCountCalculator *giftCountView; @property(nonatomic, strong) MoliMoneyLabel *priceLabel; @property(nonatomic, copy) void(^modifySelectedGift)(GiftInfoModel *model, NSInteger count); @property(nonatomic, copy) void(^editGiftCount)(GiftInfoModel *model); @end @implementation ChooseGiftCell - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.contentView.backgroundColor = [UIColor clearColor]; [self.contentView addSubview:self.bgView]; [self.bgView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.leading.trailing.mas_equalTo(self.contentView); make.height.mas_equalTo(self.bgView.mas_width); }]; [self.contentView addSubview:self.giftIconImageView]; [self.giftIconImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.bgView).insets(UIEdgeInsetsMake(6, 6, 6, 6)); }]; [self.contentView addSubview:self.giftNameLabel]; [self.giftNameLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.mas_equalTo(self.contentView); make.top.mas_equalTo(self.bgView.mas_bottom).offset(6); make.height.mas_equalTo(14); }]; [self.contentView addSubview:self.priceLabel]; [self.priceLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self.contentView); make.top.mas_equalTo(self.giftNameLabel.mas_bottom).offset(3); make.height.mas_equalTo(16); }]; [self.contentView addSubview:self.giftCountView]; [self.giftCountView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self.contentView); make.top.mas_equalTo(self.priceLabel.mas_bottom).offset(4); make.height.mas_equalTo(20); make.width.mas_equalTo(60); }]; } return self; } - (void)prepareForReuse { [super prepareForReuse]; [self.giftCountView reset]; } - (void)setCellModel:(GiftInfoModel *)cellModel { _cellModel = cellModel; self.giftIconImageView.imageUrl = cellModel.giftUrl; self.giftNameLabel.text = cellModel.giftName; [self.priceLabel updateContent:@(cellModel.goldPrice).stringValue]; [self.giftCountView updateCount:cellModel.luckyPackageCount]; } - (void)setGiftCount:(NSInteger)giftCount { _giftCount = giftCount; if (!_giftCountLabel) { [self.giftCountView removeFromSuperview]; _giftCountLabel = [UILabel labelInitWithText:[NSString stringWithFormat:@"x%@", @(giftCount)] font:kFontRegular(13) textColor:UIColorFromRGB(0xffea5c)]; [self.contentView addSubview:_giftCountLabel]; [self.giftCountLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self.contentView); make.top.mas_equalTo(self.priceLabel.mas_bottom).offset(2); make.height.mas_equalTo(14); }]; } self.giftCountLabel.text = [NSString stringWithFormat:@"x%@", @(giftCount)]; } - (UIView *)bgView { if (!_bgView) { _bgView = [[UIView alloc] init]; [_bgView addGradientBackgroundWithColors:@[UIColorFromRGB(0x610015), UIColorFromRGB(0x97000c)] startPoint:CGPointMake(0.5, 0) endPoint:CGPointMake(0.5, 1) cornerRadius:12]; [_bgView setCornerRadius:12 corners:UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight borderWidth:1 borderColor:UIColorFromRGB(0xFEF057)]; } return _bgView; } - (NetImageView *)giftIconImageView { if (!_giftIconImageView) { NetImageConfig *config = [[NetImageConfig alloc] init]; config.placeHolder = [UIImageConstant defaultAvatarPlaceholder]; _giftIconImageView = [[NetImageView alloc] initWithConfig:config]; _giftIconImageView.contentMode = UIViewContentModeScaleAspectFit; } return _giftIconImageView; } - (MarqueeLabel *)giftNameLabel { if (!_giftNameLabel) { _giftNameLabel = [[MarqueeLabel alloc] init]; _giftNameLabel.text = @"Name"; _giftNameLabel.font = kFontRegular(13); _giftNameLabel.textColor = UIColorFromRGB(0xffea5c); _giftNameLabel.textAlignment = NSTextAlignmentCenter; _giftNameLabel.scrollDuration = 3.0; _giftNameLabel.fadeLength = 8.0f; _giftNameLabel.animationDelay = 1.0; } return _giftNameLabel; } - (GiftCountCalculator *)giftCountView { if (!_giftCountView) { _giftCountView = [[GiftCountCalculator alloc] init]; @kWeakify(self); [_giftCountView setTapIncrease:^(NSInteger count){ @kStrongify(self); if (self.modifySelectedGift) { self.modifySelectedGift(self.cellModel, count); } }]; [_giftCountView setTapReduce:^(NSInteger count) { @kStrongify(self); if (self.modifySelectedGift) { self.modifySelectedGift(self.cellModel, count); } }]; [_giftCountView setTapCountLabel:^{ @kStrongify(self); if (self.editGiftCount) { self.editGiftCount(self.cellModel); } }]; } return _giftCountView; } - (MoliMoneyLabel *)priceLabel { if (!_priceLabel) { _priceLabel = [MoliMoneyLabel moneyLabelWithTextColot:UIColorFromRGB(0xffea5c) font:kFontRegular(13) moneyPostion:1 moneySize:CGSizeMake(16, 16)]; [_priceLabel removeSpace]; } return _priceLabel; } @end @interface ChooseGiftView : UIView @property(nonatomic, assign) NSInteger watiingTime; @property(nonatomic, strong) UIScrollView *scrollView; @property(nonatomic, strong) ChooseViewTitleBar *chooseGiftTitleBar; @property(nonatomic, strong) ChooseViewTitleBar *waitingTitleBar; @property(nonatomic, strong) UICollectionView *giftsCollectionView; @property(nonatomic, strong) UIPageControl *pageControl; @property(nonatomic, strong) NSArray *dataSources; @property(nonatomic, assign) NSInteger pageCount; @property(nonatomic, strong) OneLineButtons *waitingTimeOneLineButtons; @property(nonatomic, strong) UILabel *totalCostLabel; @property(nonatomic, strong) WalletBalanceDisplayView *walletView; @property(nonatomic, strong) UIButton *sendButton; @property(nonatomic, strong) UITextField *hiddenTextField; @property(nonatomic, strong) UITextField *inputTextField; @property(nonatomic, strong) GiftInfoModel *editingModel; @property (nonatomic, strong) UIView *customInputView; @property(nonatomic, copy) void(^forceClose)(void); @property(nonatomic, copy) void(^tapSendGift)(void); - (void)refreshData; @end @implementation ChooseGiftView - (instancetype)init { self = [super init]; if (self) { self.watiingTime = 5; @kWeakify(self); [[LuckyPackageLogicManager sharedInstance] registerGiftTotalCostString:^(NSAttributedString * _Nonnull content) { @kStrongify(self); self.totalCostLabel.attributedText = content; } key:@"ChooseGiftView"]; _scrollView = [[UIScrollView alloc] init]; [self addSubview:self.scrollView]; [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; // 创建容器视图,承载所有内容 UIView *contentView = [[UIView alloc] init]; contentView.backgroundColor = [UIColor clearColor]; [self.scrollView addSubview:contentView]; // 使用 Masonry 设置容器视图的约束 [contentView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.scrollView); // 与 scrollView 对齐 make.width.mas_equalTo(self.scrollView); // 宽度与 scrollView 相同 }]; _chooseGiftTitleBar = [[ChooseViewTitleBar alloc] init]; [self.chooseGiftTitleBar updateTitle:YMLocalizedString(@"1.0.37_text_3")]; _waitingTitleBar = [[ChooseViewTitleBar alloc] init]; [self.waitingTitleBar updateTitle:YMLocalizedString(@"1.0.37_text_5")]; [contentView addSubview:self.chooseGiftTitleBar]; [self.chooseGiftTitleBar mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(contentView).offset(6); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(18); }]; CGFloat itemWidth = (KScreenWidth - 40 - 30)/4.0; CGFloat itemHeight = kGetScaleWidth(75) + 6 + 12 + 3 + 16 + 4 + 28; XPGiftCollectionViewFlowLayout *layout = [[XPGiftCollectionViewFlowLayout alloc] init]; layout.minimumInteritemSpacing = 10; layout.minimumLineSpacing = 10; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; layout.itemSize = CGSizeMake(itemWidth, itemHeight); layout.sectionInset = UIEdgeInsetsMake(10, 0, 0, 0); _giftsCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; _giftsCollectionView.clipsToBounds = YES; _giftsCollectionView.backgroundColor = [UIColor clearColor]; _giftsCollectionView.delegate = self; _giftsCollectionView.dataSource = self; _giftsCollectionView.pagingEnabled = YES; _giftsCollectionView.showsHorizontalScrollIndicator = NO; [_giftsCollectionView registerClass:[ChooseGiftCell class] forCellWithReuseIdentifier:@"ChooseGiftCell"]; _giftsCollectionView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; [contentView addSubview:self.giftsCollectionView]; [self.giftsCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.mas_equalTo(contentView).inset(20); make.top.mas_equalTo(self.chooseGiftTitleBar.mas_bottom).offset(10); make.height.mas_equalTo(itemHeight * 2 + 30); }]; _pageControl = [[UIPageControl alloc] init]; _pageControl.numberOfPages = 1; _pageControl.currentPage = 0; _pageControl.pageIndicatorTintColor = [UIColor colorWithWhite:0 alpha:0.3]; _pageControl.currentPageIndicatorTintColor = UIColorFromRGB(0xffea5c); [contentView addSubview:self.pageControl]; [self.pageControl mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.giftsCollectionView.mas_bottom).offset(3); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(10); }]; [contentView addSubview:self.waitingTitleBar]; [self.waitingTitleBar mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.pageControl.mas_bottom).offset(10); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(18); }]; _waitingTimeOneLineButtons = [[OneLineButtons alloc] init]; [_waitingTimeOneLineButtons setDidSelected:^(NSInteger index) { @kStrongify(self); [self selectWaitingTime:index]; }]; [contentView addSubview:_waitingTimeOneLineButtons]; [self.waitingTimeOneLineButtons mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.waitingTitleBar.mas_bottom).offset(12); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(30); }]; _walletView = [[WalletBalanceDisplayView alloc] init]; [_walletView setTapAddButton:^{ @kStrongify(self); [self gotoChargeView]; }]; [self addSubview:self.walletView]; [self.walletView mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.mas_equalTo(self).offset(-32); make.leading.mas_equalTo(self).offset(23); make.width.mas_equalTo(150); make.height.mas_equalTo(24); }]; _sendButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_sendButton.titleLabel setFont:kFontSemibold(15)]; [_sendButton setBackgroundImage:kImage(@"luck_package_send_bg") forState:UIControlStateNormal]; [_sendButton setTitle:YMLocalizedString(@"1.0.37_text_15.1") forState:UIControlStateNormal]; [_sendButton setTitleColor:UIColorFromRGB(0x292601) forState:UIControlStateNormal]; [_sendButton addTarget:self action:@selector(didTapSendButton) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:self.sendButton]; [self.sendButton mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.trailing.mas_equalTo(self).offset(-18); make.width.mas_equalTo(190); make.height.mas_equalTo(50); }]; _totalCostLabel = [UILabel labelInitWithText:@"" font:kFontRegular(12) textColor:UIColorFromRGB(0xFFEA5C)]; _totalCostLabel.attributedText = [[LuckyPackageLogicManager sharedInstance] loadGiftTotalCostString]; _totalCostLabel.textAlignment = NSTextAlignmentCenter; [contentView addSubview:_totalCostLabel]; [self.totalCostLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.waitingTimeOneLineButtons.mas_bottom).offset(12); make.leading.trailing.mas_equalTo(contentView); make.height.mas_equalTo(20); }]; NSArray *times = [[LuckyPackageLogicManager sharedInstance] loadConfigWaitingTimesMins]; NSMutableArray *arr = @[].mutableCopy; for (NSNumber *time in times) { [arr addObject:[NSString stringWithFormat:YMLocalizedString(@"1.0.37_text_7"), time]]; } [self.waitingTimeOneLineButtons setDataSource:arr.copy]; self.hiddenTextField = [[UITextField alloc] initWithFrame:CGRectMake(KScreenWidth, KScreenHeight, KScreenWidth, 50)]; self.hiddenTextField.keyboardType = UIKeyboardTypeNumberPad; [self addSubview:self.hiddenTextField]; self.customInputView = [self createInputAccessoryView]; self.hiddenTextField.inputAccessoryView = self.customInputView; UIView *space = [[UIView alloc] init]; [contentView addSubview:space]; [space mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.leading.trailing.mas_equalTo(contentView); make.top.mas_equalTo(self.totalCostLabel.mas_bottom); make.height.mas_equalTo(100); }]; } return self; } - (void)refreshData { [self.giftsCollectionView reloadData]; } - (void)setDataSources:(NSArray *)dataSources { _dataSources = dataSources; self.pageCount = ceil(self.dataSources.count / 8.0); self.pageControl.numberOfPages = self.pageCount; [self.giftsCollectionView reloadData]; dispatch_async(dispatch_get_main_queue(), ^{ [self adjustCollectionViewContentInset]; }); } // **创建 inputAccessoryView(输入栏 + 确认按钮)** - (UIView *)createInputAccessoryView { UIView *toolbar = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 50)]; toolbar.backgroundColor = UIColorFromRGB(0xf4f4f4); // **确认按钮** UIButton *confirmButton = [UIButton buttonWithType:UIButtonTypeCustom]; [confirmButton setTitle:YMLocalizedString(@"TTAlertConfig0") forState:UIControlStateNormal]; [confirmButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [confirmButton.titleLabel setFont:kFontRegular(14)]; [confirmButton setCornerRadius:17]; [confirmButton addGradientBackgroundWithColors:@[ UIColorFromRGB(0xe29030), UIColorFromRGB(0xfcc074) ] startPoint:CGPointMake(0, 0.5) endPoint:CGPointMake(1, 1) cornerRadius:17]; [confirmButton addTarget:self action:@selector(confirmButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; [toolbar addSubview:confirmButton]; [confirmButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(toolbar); make.trailing.mas_equalTo(toolbar).offset(-15); make.size.mas_equalTo(CGSizeMake(74, 34)); }]; // 输入栏 UITextField *inputField = [[UITextField alloc] init]; inputField.backgroundColor = [UIColor whiteColor]; [inputField setCornerRadius:17]; inputField.borderStyle = UITextBorderStyleNone; inputField.keyboardType = UIKeyboardTypeNumberPad; inputField.placeholder = YMLocalizedString(@"1.0.37_text_30"); [inputField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged]; [toolbar addSubview:inputField]; UIView *paddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 8, 1)]; inputField.leftView = paddingView; inputField.leftViewMode = UITextFieldViewModeAlways; [inputField mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(toolbar); make.leading.mas_equalTo(toolbar).offset(15); make.trailing.mas_equalTo(confirmButton.mas_leading).offset(-10); make.height.mas_equalTo(34); }]; self.inputTextField = inputField; return toolbar; } // **确认按钮点击事件** - (void)confirmButtonTapped:(UIButton *)sender { if (self.inputTextField.text.length > 0) { self.editingModel.luckyPackageCount = self.inputTextField.text.integerValue; } else { self.editingModel.luckyPackageCount = 0; } [[LuckyPackageLogicManager sharedInstance] updateSelectedGift:self.editingModel count:self.editingModel.luckyPackageCount]; [self.giftsCollectionView reloadData]; // **收起键盘** [self.hiddenTextField resignFirstResponder]; [self.inputTextField resignFirstResponder]; [self endEditing:YES]; } #pragma mark - - (void)textFieldDidChange:(UITextField *)textField { NSInteger value = [textField.text integerValue]; if (value > 99) { textField.text = @"99"; // 超过 99,强制改成 99 } } #pragma mark - - (void)didTapSendButton { if (_tapSendGift) { _tapSendGift(); } } - (void)gotoChargeView { XPIAPRechargeViewController * rechargeVC = [[XPIAPRechargeViewController alloc] init]; rechargeVC.type = @"4"; [[XCCurrentVCStackManager shareManager].getCurrentVC.navigationController pushViewController:rechargeVC animated:YES]; if (_forceClose) { self.forceClose(); } } - (void)selectWaitingTime:(NSInteger)index { NSArray *times = [[LuckyPackageLogicManager sharedInstance] loadConfigWaitingTimesMins]; NSNumber *num = [times xpSafeObjectAtIndex:index]; self.watiingTime = num.integerValue; [[LuckyPackageLogicManager sharedInstance] updateSelectedGiftWaitingTime:self.watiingTime * 60]; } #pragma mark - - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.dataSources.count; } - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { ChooseGiftCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ChooseGiftCell" forIndexPath:indexPath]; cell.cellModel = [self.dataSources xpSafeObjectAtIndex:indexPath.item]; [cell setModifySelectedGift:^(GiftInfoModel *model, NSInteger count) { model.luckyPackageCount = count; [[LuckyPackageLogicManager sharedInstance] updateSelectedGift:model count:count]; }]; @kWeakify(self); [cell setEditGiftCount:^(GiftInfoModel *model) { @kStrongify(self); self.editingModel = model; [self.hiddenTextField becomeFirstResponder]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.inputTextField.text = @(model.luckyPackageCount).stringValue; [self.inputTextField becomeFirstResponder]; }); }]; return cell; } // 监听滑动,更新 PageControl - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat pageWidth = self.giftsCollectionView.frame.size.width; NSInteger currentPage = (self.giftsCollectionView.contentOffset.x + pageWidth / 2) / pageWidth; self.pageControl.currentPage = currentPage; } - (void)adjustCollectionViewContentInset { CGFloat pageWidth = self.giftsCollectionView.frame.size.width; NSInteger totalPages = ceil((double)self.dataSources.count / 8.0); CGFloat fullContentWidth = totalPages * pageWidth; CGFloat remainingWidth = fullContentWidth - self.giftsCollectionView.contentSize.width; if (remainingWidth > 0) { self.giftsCollectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, remainingWidth); } } @end @interface ComfirmChooseGiftView : UIView @property(nonatomic, strong) UIScrollView *scrollView; @property(nonatomic, strong) UICollectionView *giftsCollectionView; // 不需要分页了 @property(nonatomic, strong) UILabel *waitingTimeLabel; @property(nonatomic, strong) UILabel *totalCostLabel; @property(nonatomic, strong) UIButton *sendButton; @property(nonatomic, strong) UIButton *modifyButton; @property(nonatomic, strong) NSArray *dataSources; @property(nonatomic, copy) void(^returnToModity)(void); @property(nonatomic, copy) void(^tapButtonForGiftLuckyPackage)(void); - (void)refreshContent; @end @implementation ComfirmChooseGiftView - (instancetype)init { self = [super init]; if (self) { self.backgroundColor = [UIColor clearColor]; @kWeakify(self); [[LuckyPackageLogicManager sharedInstance] registerGiftTotalCostString:^(NSAttributedString * _Nonnull content) { @kStrongify(self); self.totalCostLabel.attributedText = content; } key:@"ComfirmChooseGiftView"]; _scrollView = [[UIScrollView alloc] init]; [self addSubview:self.scrollView]; [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self); }]; // 创建容器视图,承载所有内容 UIView *contentView = [[UIView alloc] init]; contentView.backgroundColor = [UIColor clearColor]; [self.scrollView addSubview:contentView]; // 使用 Masonry 设置容器视图的约束 [contentView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.scrollView); // 与 scrollView 对齐 make.width.mas_equalTo(self.scrollView); // 宽度与 scrollView 相同 }]; UIView *space = [[UIView alloc] init]; [contentView addSubview:space]; CGFloat itemWidth = (KScreenWidth - 40 - 30)/4.0; CGFloat itemHeight = kGetScaleWidth(75) + 6 + 12 + 3 + 16 + 4 + 28; XPGiftCollectionViewFlowLayout *layout = [[XPGiftCollectionViewFlowLayout alloc] init]; layout.minimumInteritemSpacing = 10; layout.minimumLineSpacing = 10; layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; layout.itemSize = CGSizeMake(itemWidth, itemHeight); _giftsCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; _giftsCollectionView.clipsToBounds = YES; _giftsCollectionView.backgroundColor = [UIColor clearColor]; _giftsCollectionView.delegate = self; _giftsCollectionView.dataSource = self; _giftsCollectionView.pagingEnabled = YES; _giftsCollectionView.showsHorizontalScrollIndicator = NO; [_giftsCollectionView registerClass:[ChooseGiftCell class] forCellWithReuseIdentifier:@"ChooseGiftCell"]; [contentView addSubview:self.giftsCollectionView]; [self.giftsCollectionView mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.trailing.mas_equalTo(contentView).inset(20); make.top.mas_equalTo(contentView).offset(60); make.height.mas_equalTo(itemHeight * 2 + 30); }]; _waitingTimeLabel = [UILabel labelInitWithText: [NSString stringWithFormat:YMLocalizedString(@"1.0.37_text_13"), @([[LuckyPackageLogicManager sharedInstance] loadGiftWaitingTime]/60)] font:kFontMedium(14) textColor:UIColorFromRGB(0xFFEA5C)]; _waitingTimeLabel.textAlignment = NSTextAlignmentCenter; [contentView addSubview:_waitingTimeLabel]; [self.waitingTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.giftsCollectionView.mas_bottom).offset(30); make.centerX.mas_equalTo(contentView); make.height.mas_equalTo(16); }]; _modifyButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_modifyButton.titleLabel setFont:kFontRegular(12)]; [_modifyButton setTitleColor:UIColorFromRGB(0xffea5c) forState:UIControlStateNormal]; NSTextAttachment *attchment = [[NSTextAttachment alloc] init]; attchment.image = kImage(@"luck_package_arrow"); attchment.bounds = CGRectMake(0, -1, 11, 11); NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attchment]; NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:YMLocalizedString(@"1.0.37_text_12") attributes:@{ NSFontAttributeName: kFontRegular(12), NSForegroundColorAttributeName: UIColorFromRGB(0xffea5c) }]; [attributedString appendAttributedString:string]; [_modifyButton setAttributedTitle:attributedString forState:UIControlStateNormal]; [_modifyButton addTarget:self action:@selector(didTapModifyButton) forControlEvents:UIControlEventTouchUpInside]; [contentView addSubview:_modifyButton]; [self.modifyButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.waitingTimeLabel.mas_bottom).offset(24); make.centerX.mas_equalTo(contentView); make.height.mas_equalTo(16); }]; _totalCostLabel = [UILabel labelInitWithText:@"" font:kFontRegular(12) textColor:UIColorFromRGB(0xFFEA5C)]; _totalCostLabel.textAlignment = NSTextAlignmentCenter; [contentView addSubview:_totalCostLabel]; [self.totalCostLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.modifyButton.mas_bottom).offset(24); make.centerX.mas_equalTo(contentView); make.height.mas_equalTo(16); }]; [space mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.leading.trailing.mas_equalTo(contentView); make.top.mas_equalTo(self.totalCostLabel.mas_bottom); make.height.mas_equalTo(100); }]; _sendButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_sendButton.titleLabel setFont:kFontSemibold(15)]; [_sendButton setBackgroundImage:kImage(@"luck_package_send_bg") forState:UIControlStateNormal]; [_sendButton setTitle:YMLocalizedString(@"1.0.37_text_15.1") forState:UIControlStateNormal]; [_sendButton setTitleColor:UIColorFromRGB(0x292601) forState:UIControlStateNormal]; [_sendButton addTarget:self action:@selector(didTapSendButton) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:self.sendButton]; [self.sendButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self); make.bottom.mas_equalTo(self).offset(-18); make.width.mas_equalTo(190); make.height.mas_equalTo(50); }]; } return self; } - (void)refreshContent { [self.scrollView setContentOffset:CGPointZero]; _dataSources = [[LuckyPackageLogicManager sharedInstance] loadAllSelectedGifts]; [self.giftsCollectionView reloadData]; dispatch_async(dispatch_get_main_queue(), ^{ [self adjustCollectionViewContentInset]; }); self.waitingTimeLabel.text = [NSString stringWithFormat:YMLocalizedString(@"1.0.37_text_13"), @([[LuckyPackageLogicManager sharedInstance] loadGiftWaitingTime]/60)]; self.totalCostLabel.attributedText = [[LuckyPackageLogicManager sharedInstance] loadGiftTotalCostString]; } - (void)didTapModifyButton { if (_returnToModity) { self.returnToModity(); } } - (void)didTapSendButton { if (_tapButtonForGiftLuckyPackage) { self.tapButtonForGiftLuckyPackage(); } } #pragma mark - - (void)adjustCollectionViewContentInset { CGFloat pageWidth = self.giftsCollectionView.frame.size.width; NSInteger totalPages = ceil((double)self.dataSources.count / 8.0); CGFloat fullContentWidth = totalPages * pageWidth; CGFloat remainingWidth = fullContentWidth - self.giftsCollectionView.contentSize.width; if (remainingWidth > 0) { self.giftsCollectionView.contentInset = UIEdgeInsetsMake(0, 0, 0, remainingWidth); } else { self.giftsCollectionView.contentInset = UIEdgeInsetsZero; } } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.dataSources.count; } - (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { ChooseGiftCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ChooseGiftCell" forIndexPath:indexPath]; cell.cellModel = [self.dataSources xpSafeObjectAtIndex:indexPath.item]; [cell setModifySelectedGift:^(GiftInfoModel *model, NSInteger count) { model.luckyPackageCount = count; [[LuckyPackageLogicManager sharedInstance] updateSelectedGift:model count:count]; }]; return cell; } @end @interface LuckyPackageViewController () @property (nonatomic,weak) idhostDelegate; @property(nonatomic, strong) UIButton *closeButton; @property(nonatomic, strong) UIImageView *bgImageView; @property(nonatomic, strong) UIButton *giftButton; @property(nonatomic, strong) UIButton *coinButton; @property(nonatomic, strong) UIImageView *gemImageView; @property(nonatomic, strong) UIButton *recordsButton; @property(nonatomic, strong) UIButton *rulesButton; @property(nonatomic, strong) UIView *coinContainer; @property(nonatomic, strong) UIView *giftContainer; @property(nonatomic, strong) UIView *createLuckyPackageContainer; @property(nonatomic, strong) ChooseCoinView *chooseCoin; @property(nonatomic, strong) ChooseGiftView *chooseGift; @property(nonatomic, strong) ComfirmChooseGiftView *comfirmChooseGift; @property(nonatomic, strong) LuckyPackageRecordsView *recordsView; @property(nonatomic, strong) LuckyPackageBannerView *demoBanner; @end @implementation LuckyPackageViewController - (instancetype)initWithdelegate:(id)delegate { self = [super init]; if (self) { self.hiddenNavBar = YES; self.hostDelegate = delegate; } return self; } - (LuckyPackagePresenter *)createPresenter { return [[LuckyPackagePresenter alloc] init]; } - (void)viewDidLoad { [super viewDidLoad]; self.hiddenNavBar = YES; [self setupUI]; [self displayChooseGift]; } - (void)setupUI { self.view.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2]; [self.view addSubview:self.createLuckyPackageContainer]; [self.createLuckyPackageContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.view); }]; [self setupBG]; [self setupControlArea]; } - (void)setupBG { [self.view addSubview:self.closeButton]; [self.createLuckyPackageContainer addSubview:self.bgImageView]; [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { if (iPhoneXSeries) { make.edges.mas_equalTo(self.createLuckyPackageContainer).insets(UIEdgeInsetsMake(kGetScaleWidth(162), 0, 0, 0)); } else { make.edges.mas_equalTo(self.createLuckyPackageContainer).insets(UIEdgeInsetsMake(kNavigationHeight, 0, 0, 0)); } }]; [self.createLuckyPackageContainer addSubview:self.demoBanner]; [self.demoBanner mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.mas_equalTo(self.bgImageView.mas_top).offset(40); make.leading.trailing.mas_equalTo(self.createLuckyPackageContainer); make.height.mas_equalTo(kGetScaleWidth(100)); }]; [self.closeButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.leading.trailing.mas_equalTo(self.createLuckyPackageContainer); make.bottom.mas_equalTo(self.demoBanner.mas_bottom); }]; } - (void)setupControlArea { [self.createLuckyPackageContainer addSubview:self.giftButton]; [self.createLuckyPackageContainer addSubview:self.coinButton]; [self.createLuckyPackageContainer addSubview:self.gemImageView]; [self.giftButton mas_makeConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(47); make.top.mas_equalTo(self.bgImageView).offset(kGetScaleWidth(108)); make.left.mas_equalTo(self.createLuckyPackageContainer).offset(8); make.right.mas_equalTo(self.createLuckyPackageContainer.mas_centerX).offset(-1.5); }]; [self.coinButton mas_makeConstraints:^(MASConstraintMaker *make) { make.height.mas_equalTo(47); make.top.mas_equalTo(self.bgImageView).offset(kGetScaleWidth(108)); make.right.mas_equalTo(self.createLuckyPackageContainer).offset(-8); make.left.mas_equalTo(self.createLuckyPackageContainer.mas_centerX).offset(1.5); }]; [self.gemImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.mas_equalTo(self.createLuckyPackageContainer); make.centerY.mas_equalTo(self.giftButton); make.size.mas_equalTo(CGSizeMake(62, 31)); }]; [self.createLuckyPackageContainer addSubview:self.rulesButton]; [self.createLuckyPackageContainer addSubview:self.recordsButton]; [self.rulesButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.coinButton.mas_bottom).offset(2); make.trailing.mas_equalTo(self.createLuckyPackageContainer).offset(-5); make.size.mas_equalTo(CGSizeMake(27, 27)); }]; [self.recordsButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.coinButton.mas_bottom).offset(2); make.trailing.mas_equalTo(self.rulesButton.mas_leading).offset(-3); make.size.mas_equalTo(CGSizeMake(27, 27)); }]; } - (void)setupChooseGift { if (!_giftContainer) { _giftContainer = [[UIView alloc] init]; [self.giftContainer addSubview:self.chooseGift]; [self.chooseGift mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.giftContainer); }]; } [self.createLuckyPackageContainer addSubview:self.giftContainer]; [self.giftContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.rulesButton); make.bottom.leading.trailing.mas_equalTo(self.view); }]; [self.createLuckyPackageContainer bringSubviewToFront:self.rulesButton]; [self.createLuckyPackageContainer bringSubviewToFront:self.recordsButton]; } - (void)setupChooseCoin { if (!_coinContainer) { _coinContainer = [[UIView alloc] init]; [self.coinContainer addSubview:self.chooseCoin]; [self.chooseCoin mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.coinContainer); }]; } [self.createLuckyPackageContainer addSubview:self.coinContainer]; [self.coinContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.top.mas_equalTo(self.rulesButton); make.bottom.leading.trailing.mas_equalTo(self.view); }]; [self.createLuckyPackageContainer bringSubviewToFront:self.rulesButton]; [self.createLuckyPackageContainer bringSubviewToFront:self.recordsButton]; } - (void)setupComfirmChooseGift { [self.giftContainer addSubview:self.comfirmChooseGift]; [self.comfirmChooseGift mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self.giftContainer); }]; } - (void)readyToSendGift { if ([[LuckyPackageLogicManager sharedInstance] loadAllSelectedGifts].count == 0) { [XNDJTDDLoadingTool showErrorWithMessage:YMLocalizedString(@"1.0.37_text_29")]; return; } self.comfirmChooseGift.alpha = 0; [self setupComfirmChooseGift]; [self.comfirmChooseGift refreshContent]; [UIView animateWithDuration:0.25 animations:^{ self.comfirmChooseGift.alpha = 1; self.chooseGift.alpha = 0; }]; } - (void)returnToModify { [UIView animateWithDuration:0.25 animations:^{ self.comfirmChooseGift.alpha = 0; self.chooseGift.alpha = 1; [self.chooseGift refreshData]; } completion:^(BOOL finished) { [self.comfirmChooseGift removeFromSuperview]; }]; } #pragma mark - - (void)setupData { NSString *roomUid = @(self.hostDelegate.getRoomInfo.uid).stringValue; [self.presenter loadGifts:roomUid]; [self.presenter loadWalletInfo]; } - (void)loadGiftsSuccess:(NSArray *)gifts { self.chooseGift.dataSources = gifts; } - (void)loadWalletInfoSuccess:(WalletInfoModel *)walletInfo { [[LuckyPackageLogicManager sharedInstance] saveWalletInfo:walletInfo]; [self.chooseGift.walletView updatePrice:walletInfo.diamonds.doubleValue]; } - (void)loadSentLuckyBag { @kWeakify(self); [self.presenter loadLuckyPackageRecords:1 type:1 success:^(NSArray * _Nonnull array) { @kStrongify(self); [self.recordsView setDateSource:array]; }]; } - (void)loadReceivedLuckyBag { @kWeakify(self); [self.presenter loadLuckyPackageRecords:1 type:2 success:^(NSArray * _Nonnull array) { @kStrongify(self); [self.recordsView setDateSource:array]; }]; } - (void)sendGiftLuckyPackage { @kWeakify(self); [self.presenter sendGiftLuckyPackage:self.hostDelegate.getRoomInfo.uid uid:[[AccountInfoStorage instance] getUid] waitingTime:[[LuckyPackageLogicManager sharedInstance] loadGiftWaitingTime] selectedGifts:[[LuckyPackageLogicManager sharedInstance] loadAllSelectedGifts] success:^{ @kStrongify(self); [self didTapCloseButton]; }]; } - (void)sendCoinLuckyPackage { @kWeakify(self); [self.presenter sendCoinLuckyPackage:self.hostDelegate.getRoomInfo.uid uid:[[AccountInfoStorage instance] getUid] waitingTime:[[LuckyPackageLogicManager sharedInstance] loadCoinWaitingTime] num:@([[LuckyPackageLogicManager sharedInstance] loadSelectedBagNum]) goldNum:@([[LuckyPackageLogicManager sharedInstance] loadSelectedBagMoney]) success:^{ @kStrongify(self); [self didTapCloseButton]; }]; } #pragma mark - - (void)displayChooseGift { if (_coinContainer) { [self.coinContainer removeFromSuperview]; } [self setupChooseGift]; [self setupData]; UserInfoModel *currentUser = [self.hostDelegate getUserInfo]; [self.demoBanner updateDemoFor:1 nick:currentUser.nick avatar:currentUser.avatar]; } - (void)displayChooseCoin { if (_giftContainer) { [self.giftContainer removeFromSuperview]; } [self setupChooseCoin]; UserInfoModel *currentUser = [self.hostDelegate getUserInfo]; [self.demoBanner updateDemoFor:2 nick:currentUser.nick avatar:currentUser.avatar]; } #pragma mark - - (void)didTapCloseButton { [self removeFromParentViewController]; [self.view removeFromSuperview]; if (_close) { self.close(); } [[LuckyPackageLogicManager sharedInstance] reset]; } - (void)didTapGiftTabButton:(UIButton *)sender { if (sender.isSelected) { return; } sender.selected = YES; self.coinButton.selected = NO; [self displayChooseGift]; } - (void)didTapCoinTabButton:(UIButton *)sender { if (sender.isSelected) { return; } sender.selected = YES; self.giftButton.selected = NO; [self displayChooseCoin]; } - (void)didTapRecordsButton { if (!_recordsView) { _recordsView = [[LuckyPackageRecordsView alloc] init]; @kWeakify(self); [self.recordsView setTapBackButton:^{ @kStrongify(self); [UIView animateWithDuration:0.25 animations:^{ self.recordsView.alpha = 0; self.createLuckyPackageContainer.alpha = 1; } completion:^(BOOL finished) { [self.recordsView removeFromSuperview]; }]; }]; [self.recordsView setSwitchTap:^(BOOL isReceive) { @kStrongify(self); if (isReceive) { [self loadReceivedLuckyBag]; } else { [self loadSentLuckyBag]; } }]; [self loadReceivedLuckyBag]; } self.recordsView.alpha = 0; [self.view addSubview:self.recordsView]; [self.recordsView mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.leading.trailing.mas_equalTo(self.view); make.height.mas_equalTo(485); }]; [self.recordsView updateWithUserInfo:self.hostDelegate.getUserInfo]; [UIView animateWithDuration:0.25 animations:^{ self.recordsView.alpha = 1; self.createLuckyPackageContainer.alpha = 0; }]; } - (void)didTapRulesButton { BOOL giftContainerHiddenStatus = self.createLuckyPackageContainer.hidden; self.createLuckyPackageContainer.hidden = YES; XPWebViewController *vc = [[XPWebViewController alloc] initWithRoomUID:[LuckyPackageLogicManager sharedInstance].roomUid]; vc.hiddenNavBar = YES; vc.url = URLWithType(KLuckyPackageRule); @kWeakify(vc); [vc setCloseWebViewBlock:^(BOOL result) { @kStrongify(vc); [vc.view removeFromSuperview]; [vc removeFromParentViewController]; self.createLuckyPackageContainer.hidden = giftContainerHiddenStatus; }]; vc.view.hidden = YES; [self addChildViewController:vc]; [self.view addSubview:vc.view]; [vc.view mas_makeConstraints:^(MASConstraintMaker *make) { make.bottom.leading.trailing.mas_equalTo(self.view); make.height.mas_equalTo(kGetScaleWidth(470)); }]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ vc.view.hidden = NO; }); } #pragma mark - - (UIButton *)closeButton { if (!_closeButton) { _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_closeButton addTarget:self action:@selector(didTapCloseButton) forControlEvents:UIControlEventTouchUpInside]; } return _closeButton; } - (UIImageView *)bgImageView { if (!_bgImageView) { _bgImageView = [[UIImageView alloc] initWithImage:kImage(@"luck_package_main_bg")]; _bgImageView.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; } return _bgImageView; } - (UIButton *)giftButton { if (!_giftButton) { _giftButton = [UIButton buttonWithType:UIButtonTypeCustom]; _giftButton.adjustsImageWhenHighlighted = NO; [_giftButton.titleLabel setFont:kFontSemibold(16)]; [_giftButton setTitleColor:UIColorFromRGB(0xffea5c) forState:UIControlStateNormal]; [_giftButton setTitle:YMLocalizedString(@"1.0.37_text_1") forState:UIControlStateNormal]; [_giftButton setBackgroundImage:kImage(@"luck_package_gift_button_normal") forState:UIControlStateNormal]; [_giftButton setBackgroundImage:kImage(@"luck_package_gift_button_selected") forState:UIControlStateSelected]; [_giftButton addTarget:self action:@selector(didTapGiftTabButton:) forControlEvents:UIControlEventTouchUpInside]; _giftButton.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; _giftButton.selected = YES; } return _giftButton; } - (UIButton *)coinButton { if (!_coinButton) { _coinButton = [UIButton buttonWithType:UIButtonTypeCustom]; _coinButton.adjustsImageWhenHighlighted = NO; [_coinButton.titleLabel setFont:kFontSemibold(16)]; [_coinButton setTitleColor:UIColorFromRGB(0xffea5c) forState:UIControlStateNormal]; [_coinButton setTitle:YMLocalizedString(@"1.0.37_text_2") forState:UIControlStateNormal]; [_coinButton setBackgroundImage:kImage(@"luck_package_coin_button_normal") forState:UIControlStateNormal]; [_coinButton setBackgroundImage:kImage(@"luck_package_coin_button_selected") forState:UIControlStateSelected]; [_coinButton addTarget:self action:@selector(didTapCoinTabButton:) forControlEvents:UIControlEventTouchUpInside]; _coinButton.semanticContentAttribute = UISemanticContentAttributeForceLeftToRight; } return _coinButton; } - (UIImageView *)gemImageView { if (!_gemImageView) { _gemImageView = [[UIImageView alloc] initWithImage:kImage(@"luck_package_gem")]; } return _gemImageView; } - (UIButton *)recordsButton { if (!_recordsButton) { _recordsButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_recordsButton setBackgroundImage:kImage(@"luck_package_records") forState:UIControlStateNormal]; [_recordsButton addTarget:self action:@selector(didTapRecordsButton) forControlEvents:UIControlEventTouchUpInside]; } return _recordsButton; } - (UIButton *)rulesButton { if (!_rulesButton) { _rulesButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_rulesButton setBackgroundImage:kImage(@"luck_package_rules") forState:UIControlStateNormal]; [_rulesButton addTarget:self action:@selector(didTapRulesButton) forControlEvents:UIControlEventTouchUpInside]; } return _rulesButton; } - (ChooseCoinView *)chooseCoin { if (!_chooseCoin) { _chooseCoin = [[ChooseCoinView alloc] init]; @kWeakify(self); [_chooseCoin setTapSendCoin:^{ @kStrongify(self); [self sendCoinLuckyPackage]; }]; } return _chooseCoin; } - (ChooseGiftView *)chooseGift { if (!_chooseGift) { _chooseGift = [[ChooseGiftView alloc] init]; @kWeakify(self); [_chooseGift setForceClose:^{ @kStrongify(self); [self didTapCloseButton]; }]; [_chooseGift setTapSendGift:^{ @kStrongify(self); [self readyToSendGift]; }]; } return _chooseGift; } - (ComfirmChooseGiftView *)comfirmChooseGift { if (!_comfirmChooseGift) { _comfirmChooseGift = [[ComfirmChooseGiftView alloc] init]; @kWeakify(self); [_comfirmChooseGift setReturnToModity:^{ @kStrongify(self); [self returnToModify]; }]; [_comfirmChooseGift setTapButtonForGiftLuckyPackage:^{ @kStrongify(self); [self sendGiftLuckyPackage]; }]; } return _comfirmChooseGift; } - (UIView *)createLuckyPackageContainer { if (!_createLuckyPackageContainer) { _createLuckyPackageContainer = [[UIView alloc] init]; } return _createLuckyPackageContainer; } - (LuckyPackageBannerView *)demoBanner { if (!_demoBanner) { _demoBanner = [LuckyPackageBannerView demoBanner]; } return _demoBanner; } @end