Files
peko-ios/YuMi/Modules/YMRoom/View/LuckyPackage/LuckyPackageViewController.m

2343 lines
89 KiB
Mathematica
Raw Normal View History

//
// LuckyPackageViewController.m
// YuMi
//
// Created by P on 2025/1/10.
//
#import "LuckyPackageViewController.h"
2025-02-28 19:04:09 +08:00
#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 <UITableViewDelegate, UITableViewDataSource>
@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 <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property(nonatomic, copy) NSArray<NSNumber *> *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<NSNumber *> *)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<NSString *> *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<NSString *> *)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];
2025-03-06 15:26:44 +08:00
self.totalCostLabel.attributedText = [[LuckyPackageLogicManager sharedInstance] loadCoinTotalCostString];
2025-02-28 19:04:09 +08:00
@kWeakify(self);
2025-03-06 15:26:44 +08:00
[[LuckyPackageLogicManager sharedInstance] registerCoinTotalCostString:^(NSAttributedString * _Nonnull content) {
2025-02-28 19:04:09 +08:00
@kStrongify(self);
2025-03-06 15:26:44 +08:00
self.totalCostLabel.attributedText = content;
2025-02-28 19:04:09 +08:00
}];
}
- (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;
2025-02-28 19:04:09 +08:00
@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 {
2025-02-28 19:04:09 +08:00
if (!_giftNameLabel) {
_giftNameLabel = [[MarqueeLabel alloc] init];
_giftNameLabel.text = @"Name";
_giftNameLabel.font = kFontRegular(13);
_giftNameLabel.textColor = UIColorFromRGB(0xffea5c);
2025-02-28 19:04:09 +08:00
_giftNameLabel.textAlignment = NSTextAlignmentCenter;
_giftNameLabel.scrollDuration = 3.0;
_giftNameLabel.fadeLength = 8.0f;
_giftNameLabel.animationDelay = 1.0;
2025-02-28 19:04:09 +08:00
}
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)];
2025-03-06 15:26:44 +08:00
[_priceLabel removeSpace];
2025-02-28 19:04:09 +08:00
}
return _priceLabel;
}
@end
@interface ChooseGiftView : UIView <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@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 <GiftInfoModel *>*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);
2025-03-06 15:26:44 +08:00
layout.sectionInset = UIEdgeInsetsMake(10, 0, 0, 0);
2025-02-28 19:04:09 +08:00
_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) {
2025-03-06 15:26:44 +08:00
make.leading.trailing.mas_equalTo(contentView).inset(20);
2025-02-28 19:04:09 +08:00
make.top.mas_equalTo(self.chooseGiftTitleBar.mas_bottom).offset(10);
make.height.mas_equalTo(itemHeight * 2 + 30);
}];
2025-03-06 15:26:44 +08:00
2025-02-28 19:04:09 +08:00
_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<GiftInfoModel *> *)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 <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@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;
2025-03-06 15:26:44 +08:00
@property(nonatomic, strong) NSArray <GiftInfoModel *>*dataSources;
2025-02-28 19:04:09 +08:00
@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;
2025-03-06 15:26:44 +08:00
CGFloat itemHeight = kGetScaleWidth(75) + 6 + 12 + 3 + 16 + 4 + 28;
XPGiftCollectionViewFlowLayout *layout = [[XPGiftCollectionViewFlowLayout alloc] init];
2025-02-28 19:04:09 +08:00
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;
2025-03-06 15:26:44 +08:00
_giftsCollectionView.pagingEnabled = YES;
2025-02-28 19:04:09 +08:00
_giftsCollectionView.showsHorizontalScrollIndicator = NO;
[_giftsCollectionView registerClass:[ChooseGiftCell class] forCellWithReuseIdentifier:@"ChooseGiftCell"];
[contentView addSubview:self.giftsCollectionView];
[self.giftsCollectionView mas_makeConstraints:^(MASConstraintMaker *make) {
2025-03-06 15:26:44 +08:00
make.leading.trailing.mas_equalTo(contentView).inset(20);
2025-02-28 19:04:09 +08:00
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 {
2025-03-06 15:26:44 +08:00
[self.scrollView setContentOffset:CGPointZero];
2025-02-28 19:04:09 +08:00
2025-03-06 15:26:44 +08:00
_dataSources = [[LuckyPackageLogicManager sharedInstance] loadAllSelectedGifts];
[self.giftsCollectionView reloadData];
2025-02-28 19:04:09 +08:00
dispatch_async(dispatch_get_main_queue(), ^{
2025-03-06 15:26:44 +08:00
[self adjustCollectionViewContentInset];
2025-02-28 19:04:09 +08:00
});
2025-03-06 15:26:44 +08:00
self.waitingTimeLabel.text = [NSString stringWithFormat:YMLocalizedString(@"1.0.37_text_13"), @([[LuckyPackageLogicManager sharedInstance] loadGiftWaitingTime]/60)];
self.totalCostLabel.attributedText = [[LuckyPackageLogicManager sharedInstance] loadGiftTotalCostString];
2025-02-28 19:04:09 +08:00
}
- (void)didTapModifyButton {
if (_returnToModity) {
self.returnToModity();
}
}
- (void)didTapSendButton {
if (_tapButtonForGiftLuckyPackage) {
self.tapButtonForGiftLuckyPackage();
}
}
#pragma mark -
2025-03-06 15:26:44 +08:00
- (void)adjustCollectionViewContentInset {
CGFloat pageWidth = self.giftsCollectionView.frame.size.width;
NSInteger totalPages = ceil((double)self.dataSources.count / 8.0);
2025-02-28 19:04:09 +08:00
2025-03-06 15:26:44 +08:00
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;
}
}
2025-02-28 19:04:09 +08:00
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
2025-03-06 15:26:44 +08:00
return self.dataSources.count;
2025-02-28 19:04:09 +08:00
}
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
ChooseGiftCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ChooseGiftCell" forIndexPath:indexPath];
2025-03-06 15:26:44 +08:00
cell.cellModel = [self.dataSources xpSafeObjectAtIndex:indexPath.item];
2025-02-28 19:04:09 +08:00
[cell setModifySelectedGift:^(GiftInfoModel *model, NSInteger count) {
model.luckyPackageCount = count;
[[LuckyPackageLogicManager sharedInstance] updateSelectedGift:model count:count];
}];
return cell;
}
@end
@interface LuckyPackageViewController () <LuckyPackagePresenterProtocol>
@property (nonatomic,weak) id<RoomHostDelegate>hostDelegate;
@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
2025-02-28 19:04:09 +08:00
- (instancetype)initWithdelegate:(id<RoomHostDelegate>)delegate {
self = [super init];
if (self) {
self.hiddenNavBar = YES;
self.hostDelegate = delegate;
}
return self;
}
- (LuckyPackagePresenter *)createPresenter {
return [[LuckyPackagePresenter alloc] init];
}
- (void)viewDidLoad {
[super viewDidLoad];
2025-02-28 19:04:09 +08:00
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 <GiftInfoModel *>*)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<RedEnvelopeListVo *> * _Nonnull array) {
@kStrongify(self);
[self.recordsView setDateSource:array];
}];
}
- (void)loadReceivedLuckyBag {
@kWeakify(self);
[self.presenter loadLuckyPackageRecords:1 type:2 success:^(NSArray<RedEnvelopeListVo *> * _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];
}
2025-02-28 19:04:09 +08:00
- (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;
}
2025-02-28 19:04:09 +08:00
- (LuckyPackageBannerView *)demoBanner {
if (!_demoBanner) {
_demoBanner = [LuckyPackageBannerView demoBanner];
}
return _demoBanner;
}
@end