feat(EventCenter): 添加活动中心模块
新增活动中心模块,包括官方活动、活动广场和我的活动三个页面。支持活动列表展示、倒计时功能及创建活动按钮。优化了页面切换和UI交互体验。
This commit is contained in:
6
YuMi/Assets.xcassets/20.20.59/Contents.json
Normal file
6
YuMi/Assets.xcassets/20.20.59/Contents.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
21
YuMi/Assets.xcassets/20.20.59/entrance_activities.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/entrance_activities.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "游戏@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
YuMi/Assets.xcassets/20.20.59/entrance_activities.imageset/游戏@3x.png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/entrance_activities.imageset/游戏@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 170 KiB |
21
YuMi/Assets.xcassets/20.20.59/yellow_indicator.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/yellow_indicator.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "矩形 3164@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
YuMi/Assets.xcassets/20.20.59/yellow_indicator.imageset/矩形 3164@3x.png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/yellow_indicator.imageset/矩形 3164@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
21
YuMi/Assets.xcassets/Language/ar/entrance_activities_ar.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/Language/ar/entrance_activities_ar.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "游戏@3x(1).png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
YuMi/Assets.xcassets/Language/ar/entrance_activities_ar.imageset/游戏@3x(1).png
vendored
Normal file
BIN
YuMi/Assets.xcassets/Language/ar/entrance_activities_ar.imageset/游戏@3x(1).png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 172 KiB |
21
YuMi/Assets.xcassets/Language/en/entrance_activities_en.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/Language/en/entrance_activities_en.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "游戏@3x.png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
YuMi/Assets.xcassets/Language/en/entrance_activities_en.imageset/游戏@3x.png
vendored
Normal file
BIN
YuMi/Assets.xcassets/Language/en/entrance_activities_en.imageset/游戏@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 170 KiB |
21
YuMi/Assets.xcassets/Language/tr/entrance_activities_tr.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/Language/tr/entrance_activities_tr.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "游戏@3x(2).png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
YuMi/Assets.xcassets/Language/tr/entrance_activities_tr.imageset/游戏@3x(2).png
vendored
Normal file
BIN
YuMi/Assets.xcassets/Language/tr/entrance_activities_tr.imageset/游戏@3x(2).png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 173 KiB |
16
YuMi/Modules/YMNewHome/Presenter/EventCenterPresenter.h
Normal file
16
YuMi/Modules/YMNewHome/Presenter/EventCenterPresenter.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// EventCenterPresenter.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import "BaseMvpPresenter.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface EventCenterPresenter : BaseMvpPresenter
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
12
YuMi/Modules/YMNewHome/Presenter/EventCenterPresenter.m
Normal file
12
YuMi/Modules/YMNewHome/Presenter/EventCenterPresenter.m
Normal file
@@ -0,0 +1,12 @@
|
||||
//
|
||||
// EventCenterPresenter.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import "EventCenterPresenter.h"
|
||||
|
||||
@implementation EventCenterPresenter
|
||||
|
||||
@end
|
16
YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h
Normal file
16
YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// EventCenterEventCell.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface EventCenterEventCell : UITableViewCell
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
23
YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m
Normal file
23
YuMi/Modules/YMNewHome/View/Cell/EventCenterEventCell.m
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// EventCenterEventCell.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import "EventCenterEventCell.h"
|
||||
|
||||
@implementation EventCenterEventCell
|
||||
|
||||
- (void)awakeFromNib {
|
||||
[super awakeFromNib];
|
||||
// Initialization code
|
||||
}
|
||||
|
||||
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
|
||||
[super setSelected:selected animated:animated];
|
||||
|
||||
// Configure the view for the selected state
|
||||
}
|
||||
|
||||
@end
|
21
YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.h
Normal file
21
YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.h
Normal file
@@ -0,0 +1,21 @@
|
||||
//
|
||||
// EventCenterOfficialCell.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
@class HomeBannerInfoModel;
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface EventCenterOfficialCell : UITableViewCell
|
||||
|
||||
@property (nonatomic, strong) HomeBannerInfoModel *cellModel;
|
||||
|
||||
// 更新倒计时天数
|
||||
- (void)updateCountdownWithDays:(NSInteger)days;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
239
YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.m
Normal file
239
YuMi/Modules/YMNewHome/View/Cell/EventCenterOfficialCell.m
Normal file
@@ -0,0 +1,239 @@
|
||||
//
|
||||
// EventCenterOfficialCell.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import "EventCenterOfficialCell.h"
|
||||
#import "HomeBannerInfoModel.h"
|
||||
|
||||
@interface EventCenterOfficialCell()
|
||||
|
||||
@property (nonatomic, strong) NetImageView *coverImageView;
|
||||
@property (nonatomic, strong) UILabel *titleLabel;
|
||||
@property (nonatomic, strong) UIStackView *countdownView;
|
||||
@property (nonatomic, strong) UILabel *countdownPrefixLabel; // Countdown: 前缀标签
|
||||
@property (nonatomic, strong) UILabel *daysNumberLabel; // 天数数字标签
|
||||
@property (nonatomic, strong) UILabel *hourNumberLabel; // 天数数字标签
|
||||
@property (nonatomic, strong) UILabel *minuteNumberLabel; // 天数数字标签
|
||||
@property (nonatomic, strong) UILabel *secondNumberLabel; // 天数数字标签
|
||||
@property (nonatomic, strong) UILabel *daysSuffixLabel; // days 后缀标签
|
||||
@property (nonatomic, strong) UILabel *colonSuffixLabel_1; // ":" 标签
|
||||
@property (nonatomic, strong) UILabel *colonSuffixLabel_2; // ":" 后缀标签
|
||||
@property (nonatomic, strong) NSTimer *countdownTimer; // 倒计时定时器
|
||||
|
||||
@end
|
||||
|
||||
@implementation EventCenterOfficialCell
|
||||
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
||||
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
|
||||
|
||||
self.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
self.contentView.backgroundColor = [UIColor whiteColor];
|
||||
|
||||
[self.contentView addSubview:self.coverImageView];
|
||||
[self.contentView addSubview:self.titleLabel];
|
||||
[self.contentView addSubview:self.countdownView];
|
||||
|
||||
[self.coverImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.contentView).offset(6);
|
||||
make.leading.trailing.mas_equalTo(self.contentView).inset(15);
|
||||
make.height.mas_equalTo(80);
|
||||
}];
|
||||
|
||||
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.coverImageView.mas_bottom).offset(4);
|
||||
make.leading.trailing.mas_equalTo(self.contentView).inset(15);
|
||||
make.height.mas_equalTo(26);
|
||||
}];
|
||||
|
||||
[self.countdownView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.titleLabel.mas_bottom).offset(0);
|
||||
make.leading.trailing.mas_equalTo(self.contentView).inset(15);
|
||||
make.height.mas_equalTo(26);
|
||||
}];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)setCellModel:(HomeBannerInfoModel *)cellModel {
|
||||
_cellModel = cellModel;
|
||||
self.coverImageView.imageUrl = cellModel.bannerPic;
|
||||
self.titleLabel.text = cellModel.bannerName;
|
||||
|
||||
// 假设从模型中获取倒计时天数
|
||||
NSInteger days = 30; // 这里应该从cellModel中获取实际的倒计时天数
|
||||
[self updateCountdownWithDays:days];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
- (NetImageView *)coverImageView {
|
||||
if (!_coverImageView) {
|
||||
NetImageConfig *config = [[NetImageConfig alloc] init];
|
||||
config.placeHolder = [UIImageConstant defaultBannerPlaceholder];
|
||||
_coverImageView = [[NetImageView alloc] initWithConfig:config];
|
||||
[_coverImageView setCornerRadius:12];
|
||||
}
|
||||
return _coverImageView;
|
||||
}
|
||||
|
||||
- (UILabel *)titleLabel {
|
||||
if (!_titleLabel) {
|
||||
_titleLabel = [UILabel labelInitWithText:@"" font:kFontSemibold(14) textColor:UIColorFromRGB(0x313131)];
|
||||
}
|
||||
return _titleLabel;
|
||||
}
|
||||
|
||||
- (UIStackView *)countdownView {
|
||||
if (!_countdownView) {
|
||||
_countdownView = [[UIStackView alloc] initWithArrangedSubviews:@[
|
||||
self.countdownPrefixLabel,
|
||||
self.daysNumberLabel,
|
||||
self.daysSuffixLabel,
|
||||
self.hourNumberLabel,
|
||||
self.colonSuffixLabel_1,
|
||||
self.minuteNumberLabel,
|
||||
self.colonSuffixLabel_2,
|
||||
self.secondNumberLabel,
|
||||
[UIView new]
|
||||
]];
|
||||
_countdownView.spacing = 6;
|
||||
_countdownView.backgroundColor = [UIColor clearColor];
|
||||
|
||||
[self.daysNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.width.greaterThanOrEqualTo(@30);
|
||||
}];
|
||||
[self.hourNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.width.greaterThanOrEqualTo(@30);
|
||||
}];
|
||||
[self.minuteNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.width.greaterThanOrEqualTo(@30);
|
||||
}];
|
||||
[self.secondNumberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.width.greaterThanOrEqualTo(@30);
|
||||
}];
|
||||
}
|
||||
return _countdownView;
|
||||
}
|
||||
|
||||
- (UILabel *)countdownPrefixLabel {
|
||||
if (!_countdownPrefixLabel) {
|
||||
_countdownPrefixLabel = [UILabel labelInitWithText:@"Countdown: " font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
}
|
||||
return _countdownPrefixLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)daysNumberLabel {
|
||||
if (!_daysNumberLabel) {
|
||||
_daysNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
_daysNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15];
|
||||
_daysNumberLabel.layer.cornerRadius = 6;
|
||||
_daysNumberLabel.layer.masksToBounds = YES;
|
||||
_daysNumberLabel.textAlignment = NSTextAlignmentCenter;
|
||||
}
|
||||
return _daysNumberLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)hourNumberLabel {
|
||||
if (!_hourNumberLabel) {
|
||||
_hourNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
_hourNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15];
|
||||
_hourNumberLabel.layer.cornerRadius = 6;
|
||||
_hourNumberLabel.layer.masksToBounds = YES;
|
||||
_hourNumberLabel.textAlignment = NSTextAlignmentCenter;
|
||||
}
|
||||
return _hourNumberLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)minuteNumberLabel {
|
||||
if (!_minuteNumberLabel) {
|
||||
_minuteNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
_minuteNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15];
|
||||
_minuteNumberLabel.layer.cornerRadius = 6;
|
||||
_minuteNumberLabel.layer.masksToBounds = YES;
|
||||
_minuteNumberLabel.textAlignment = NSTextAlignmentCenter;
|
||||
}
|
||||
return _minuteNumberLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)secondNumberLabel {
|
||||
if (!_secondNumberLabel) {
|
||||
_secondNumberLabel = [UILabel labelInitWithText:@"00" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
_secondNumberLabel.backgroundColor = [[UIColor orangeColor] colorWithAlphaComponent:0.15];
|
||||
_secondNumberLabel.layer.cornerRadius = 6;
|
||||
_secondNumberLabel.layer.masksToBounds = YES;
|
||||
_secondNumberLabel.textAlignment = NSTextAlignmentCenter;
|
||||
}
|
||||
return _secondNumberLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)daysSuffixLabel {
|
||||
if (!_daysSuffixLabel) {
|
||||
_daysSuffixLabel = [UILabel labelInitWithText:@"days" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
}
|
||||
return _daysSuffixLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)colonSuffixLabel_1 {
|
||||
if (!_colonSuffixLabel_1) {
|
||||
_colonSuffixLabel_1 = [UILabel labelInitWithText:@":" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
}
|
||||
return _colonSuffixLabel_1;
|
||||
}
|
||||
|
||||
- (UILabel *)colonSuffixLabel_2 {
|
||||
if (!_colonSuffixLabel_2) {
|
||||
_colonSuffixLabel_2 = [UILabel labelInitWithText:@":" font:kFontSemibold(16) textColor:UIColorFromRGB(0xff9900)];
|
||||
}
|
||||
return _colonSuffixLabel_2;
|
||||
}
|
||||
|
||||
- (void)updateCountdownWithDays:(NSInteger)days {
|
||||
// 更新天数标签
|
||||
self.daysNumberLabel.text = [NSString stringWithFormat:@"%02ld", (long)days];
|
||||
|
||||
// 如果有定时器,先停止
|
||||
[self stopCountdownTimer];
|
||||
|
||||
// 如果天数大于0,启动定时器进行倒计时
|
||||
if (days > 0) {
|
||||
[self startCountdownTimerWithDays:days];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)startCountdownTimerWithDays:(NSInteger)days {
|
||||
// 创建一个每天触发一次的定时器
|
||||
// 注意:实际应用中,可能需要更精确的倒计时逻辑,这里仅作示例
|
||||
self.countdownTimer = [NSTimer scheduledTimerWithTimeInterval:86400 target:self selector:@selector(updateDaysCount) userInfo:nil repeats:YES];
|
||||
}
|
||||
|
||||
- (void)updateDaysCount {
|
||||
// 获取当前显示的天数
|
||||
NSInteger currentDays = [self.daysNumberLabel.text integerValue];
|
||||
|
||||
// 如果天数大于0,减少一天
|
||||
if (currentDays > 0) {
|
||||
currentDays--;
|
||||
self.daysNumberLabel.text = [NSString stringWithFormat:@"%02ld", (long)currentDays];
|
||||
}
|
||||
|
||||
// 如果天数为0,停止定时器
|
||||
if (currentDays == 0) {
|
||||
[self stopCountdownTimer];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)stopCountdownTimer {
|
||||
if (self.countdownTimer && [self.countdownTimer isValid]) {
|
||||
[self.countdownTimer invalidate];
|
||||
self.countdownTimer = nil;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
// 确保在Cell被释放时停止定时器
|
||||
[self stopCountdownTimer];
|
||||
}
|
||||
@end
|
@@ -164,15 +164,25 @@
|
||||
}
|
||||
-(void)setItemModel:(PIHomeItemModel *)itmeModel{
|
||||
_itemModel = itmeModel;
|
||||
if (self.rankAvatarsModelArray.count > 0) {
|
||||
_bgImageView.image = [UIImage imageNamed:@"home_rank_Heads_bg"];
|
||||
} else {
|
||||
_bgImageView.layer.cornerRadius = kGetScaleWidth(12);
|
||||
@kWeakify(self);
|
||||
[_bgImageView loadImageWithUrl:_itemModel.icon completion:^(UIImage * _Nonnull image, NSURL * _Nonnull url) {
|
||||
@kStrongify(self);
|
||||
self.bgImageView.layer.cornerRadius = kGetScaleWidth(0);
|
||||
}];
|
||||
switch (itmeModel.resourceType) {
|
||||
case HomeMenuResourceType_H5:
|
||||
// if (self.rankAvatarsModelArray.count > 0) {
|
||||
self.bgImageView.image = [UIImage imageNamed:@"home_rank_Heads_bg"];
|
||||
// } else {
|
||||
// {
|
||||
// @kWeakify(self);
|
||||
// [self.bgImageView loadImageWithUrl:itmeModel.icon
|
||||
// completion:^(UIImage * _Nonnull image, NSURL * _Nonnull url) {
|
||||
// @kStrongify(self);
|
||||
// self.bgImageView.layer.cornerRadius = kGetScaleWidth(0);
|
||||
// }];
|
||||
// }
|
||||
// }
|
||||
break;
|
||||
case HomeMenuResourceType_Room_Game:
|
||||
default:
|
||||
self.bgImageView.image = [UIImage getLanguageImage:@"entrance_activities"];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
18
YuMi/Modules/YMNewHome/View/EventCenterViewController.h
Normal file
18
YuMi/Modules/YMNewHome/View/EventCenterViewController.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// EventCenterViewController.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import "MvpViewController.h"
|
||||
@class HomeBannerInfoModel;
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface EventCenterViewController : MvpViewController
|
||||
|
||||
@property (nonatomic,copy) NSArray<HomeBannerInfoModel *> *officialEventModels;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
377
YuMi/Modules/YMNewHome/View/EventCenterViewController.m
Normal file
377
YuMi/Modules/YMNewHome/View/EventCenterViewController.m
Normal file
@@ -0,0 +1,377 @@
|
||||
//
|
||||
// EventCenterViewController.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/4/29.
|
||||
//
|
||||
|
||||
#import "EventCenterViewController.h"
|
||||
#import "EventCenterPresenter.h"
|
||||
#import "EventCenterEventCell.h"
|
||||
#import "EventCenterOfficialCell.h"
|
||||
|
||||
@interface EventCenterViewController () <UIPageViewControllerDataSource, UIPageViewControllerDelegate, UITableViewDelegate, UITableViewDataSource>
|
||||
|
||||
@property (nonatomic, strong) NSMutableArray *officialDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray *eventSquareDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray *myEventDatasource;
|
||||
|
||||
@property (nonatomic, strong) UITableView *officialTableView;
|
||||
@property (nonatomic, strong) UITableView *myEventTableView;
|
||||
@property (nonatomic, strong) UITableView *eventSquareTableView;
|
||||
|
||||
@property (nonatomic, strong) UIView *tabView;
|
||||
@property (nonatomic, strong) UIImageView *indicatorImageView;
|
||||
@property (nonatomic, strong) NSArray<UIButton *> *tabButtons;
|
||||
@property (nonatomic, strong) UIPageViewController *pageViewController;
|
||||
@property (nonatomic, strong) NSArray<UIViewController *> *contentViewControllers;
|
||||
@property (nonatomic, assign) NSInteger currentIndex;
|
||||
|
||||
@property (nonatomic, strong) UIButton *createButton;
|
||||
|
||||
- (void)switchToIndex:(NSInteger)index animated:(BOOL)animated;
|
||||
|
||||
@end
|
||||
|
||||
@implementation EventCenterViewController
|
||||
|
||||
- (__kindof id)presenter {
|
||||
return [[EventCenterPresenter alloc] init];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
self.view.backgroundColor = [UIColor whiteColor];
|
||||
self.title = YMLocalizedString(@"20.20.59_text_1");
|
||||
|
||||
[self setupTabView];
|
||||
[self setupPageViewController];
|
||||
[self setupBottomButton];
|
||||
|
||||
// 设置初始状态下 createButton 的显示状态
|
||||
self.createButton.hidden = (self.currentIndex == 0);
|
||||
}
|
||||
|
||||
#pragma mark - Setup UI
|
||||
- (void)setupTabView {
|
||||
self.tabView = [[UIView alloc] init];
|
||||
[self.view addSubview:self.tabView];
|
||||
[self.tabView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop);
|
||||
make.left.right.equalTo(self.view);
|
||||
make.height.mas_equalTo(44);
|
||||
}];
|
||||
|
||||
NSArray *titles = @[YMLocalizedString(@"20.20.59_text_2"), YMLocalizedString(@"20.20.59_text_3"), YMLocalizedString(@"20.20.59_text_4")];
|
||||
NSMutableArray *buttons = [NSMutableArray array];
|
||||
CGFloat buttonWidth = UIScreen.mainScreen.bounds.size.width / titles.count;
|
||||
|
||||
for (NSInteger i = 0; i < titles.count; i++) {
|
||||
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||
[button setTitle:titles[i] forState:UIControlStateNormal];
|
||||
[button setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
|
||||
[button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
|
||||
button.tag = i;
|
||||
[button addTarget:self action:@selector(tabButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
|
||||
[self.tabView addSubview:button];
|
||||
[button mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.bottom.equalTo(self.tabView);
|
||||
make.left.equalTo(self.tabView).offset(i * buttonWidth);
|
||||
make.width.mas_equalTo(buttonWidth);
|
||||
}];
|
||||
[buttons addObject:button];
|
||||
}
|
||||
self.tabButtons = buttons;
|
||||
|
||||
// 添加底部指示器
|
||||
self.indicatorImageView = [[UIImageView alloc] initWithImage:kImage(@"yellow_indicator")];
|
||||
[self.tabView addSubview:self.indicatorImageView];
|
||||
[self.indicatorImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.bottom.equalTo(self.tabView);
|
||||
make.width.mas_equalTo(21);
|
||||
make.height.mas_equalTo(6);
|
||||
make.centerX.equalTo(buttons.firstObject);
|
||||
}];
|
||||
|
||||
// 设置默认选中状态
|
||||
self.currentIndex = 0;
|
||||
((UIButton *)buttons.firstObject).selected = YES;
|
||||
}
|
||||
|
||||
- (void)setupPageViewController {
|
||||
// 创建内容页面控制器
|
||||
NSMutableArray *viewControllers = [NSMutableArray array];
|
||||
|
||||
// 使用懒加载的TableView
|
||||
UIViewController *officialVC = [[UIViewController alloc] init];
|
||||
officialVC.view = self.officialTableView;
|
||||
[viewControllers addObject:officialVC];
|
||||
|
||||
UIViewController *eventSquareVC = [[UIViewController alloc] init];
|
||||
eventSquareVC.view = self.eventSquareTableView;
|
||||
[viewControllers addObject:eventSquareVC];
|
||||
|
||||
UIViewController *myEventVC = [[UIViewController alloc] init];
|
||||
myEventVC.view = self.myEventTableView;
|
||||
[viewControllers addObject:myEventVC];
|
||||
self.contentViewControllers = viewControllers;
|
||||
|
||||
// 配置PageViewController
|
||||
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll
|
||||
navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal
|
||||
options:nil];
|
||||
self.pageViewController.delegate = self;
|
||||
self.pageViewController.dataSource = self;
|
||||
|
||||
[self addChildViewController:self.pageViewController];
|
||||
[self.view addSubview:self.pageViewController.view];
|
||||
[self.pageViewController didMoveToParentViewController:self];
|
||||
|
||||
[self.pageViewController.view mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.equalTo(self.tabView.mas_bottom);
|
||||
make.left.right.bottom.equalTo(self.view);
|
||||
}];
|
||||
|
||||
// 设置初始页面
|
||||
[self.pageViewController setViewControllers:@[viewControllers.firstObject]
|
||||
direction:UIPageViewControllerNavigationDirectionForward
|
||||
animated:NO
|
||||
completion:nil];
|
||||
}
|
||||
|
||||
- (void)setupBottomButton {
|
||||
[self.view addSubview:self.createButton];
|
||||
[self.createButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerX.mas_equalTo(self.view);
|
||||
make.bottom.mas_equalTo(self.view).offset(-48);
|
||||
make.size.mas_equalTo(CGSizeMake(195, 40));
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - Setup Data
|
||||
- (void)setOfficialEventModels:(NSArray<HomeBannerInfoModel *> *)officialEventModels {
|
||||
_officialDatasource = officialEventModels.mutableCopy;
|
||||
[self.officialTableView reloadData];
|
||||
}
|
||||
|
||||
#pragma mark - Actions
|
||||
|
||||
- (void)tabButtonClicked:(UIButton *)sender {
|
||||
[self switchToIndex:sender.tag animated:YES];
|
||||
}
|
||||
|
||||
- (void)switchToIndex:(NSInteger)index animated:(BOOL)animated {
|
||||
if (index == self.currentIndex) return;
|
||||
|
||||
// 更新按钮状态
|
||||
self.tabButtons[self.currentIndex].selected = NO;
|
||||
self.tabButtons[index].selected = YES;
|
||||
|
||||
// 更新指示器位置
|
||||
[self.indicatorImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
|
||||
make.bottom.equalTo(self.tabView);
|
||||
make.width.mas_equalTo(21);
|
||||
make.height.mas_equalTo(6);
|
||||
make.centerX.equalTo(self.tabButtons[index]);
|
||||
}];
|
||||
|
||||
if (animated) {
|
||||
[UIView animateWithDuration:0.05 animations:^{
|
||||
[self.view layoutIfNeeded];
|
||||
}];
|
||||
}
|
||||
|
||||
// 切换页面
|
||||
UIPageViewControllerNavigationDirection direction = index > self.currentIndex ? UIPageViewControllerNavigationDirectionForward : UIPageViewControllerNavigationDirectionReverse;
|
||||
|
||||
[self.pageViewController setViewControllers:@[self.contentViewControllers[index]]
|
||||
direction:direction
|
||||
animated:animated
|
||||
completion:nil];
|
||||
|
||||
self.currentIndex = index;
|
||||
|
||||
// 根据当前选中的tab控制createButton的显示状态
|
||||
self.createButton.hidden = (index == 0);
|
||||
}
|
||||
|
||||
- (void)didTapCreateButton {
|
||||
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDataSource
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||||
if (tableView == self.officialTableView) {
|
||||
return self.officialDatasource.count > 0 ? self.officialDatasource.count : 0;
|
||||
} else if (tableView == self.eventSquareTableView) {
|
||||
return self.eventSquareDatasource.count > 0 ? self.eventSquareDatasource.count : 0;
|
||||
} else {
|
||||
return self.myEventDatasource.count > 0 ? self.myEventDatasource.count : 0;
|
||||
}
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
if (tableView == self.officialTableView) {
|
||||
EventCenterOfficialCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterOfficialCell class])];
|
||||
if (!cell) {
|
||||
cell = [[EventCenterOfficialCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([EventCenterOfficialCell class])];
|
||||
}
|
||||
// 配置官方活动cell
|
||||
cell.cellModel = [self.officialDatasource xpSafeObjectAtIndex:indexPath.row];
|
||||
return cell;
|
||||
} else {
|
||||
EventCenterEventCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterEventCell class])];
|
||||
if (!cell) {
|
||||
cell = [[EventCenterEventCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([EventCenterEventCell class])];
|
||||
}
|
||||
// 配置活动广场和我的活动cell
|
||||
if ((tableView == self.eventSquareTableView && self.eventSquareDatasource.count > indexPath.row) ||
|
||||
(tableView == self.myEventTableView && self.myEventDatasource.count > indexPath.row)) {
|
||||
// cell.model = tableView == self.eventSquareTableView ? self.eventSquareDatasource[indexPath.row] : self.myEventDatasource[indexPath.row];
|
||||
}
|
||||
return cell;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDelegate
|
||||
|
||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
return 150;
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
[tableView deselectRowAtIndexPath:indexPath animated:YES];
|
||||
// 处理cell点击事件
|
||||
if (tableView == self.officialTableView && self.officialDatasource.count > indexPath.row) {
|
||||
// 处理官方活动点击
|
||||
} else if (tableView == self.eventSquareTableView && self.eventSquareDatasource.count > indexPath.row) {
|
||||
// 处理活动广场点击
|
||||
} else if (tableView == self.myEventTableView && self.myEventDatasource.count > indexPath.row) {
|
||||
// 处理我的活动点击
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UIPageViewControllerDataSource
|
||||
|
||||
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
|
||||
NSInteger index = [self.contentViewControllers indexOfObject:viewController];
|
||||
if (index == 0 || index == NSNotFound) return nil;
|
||||
return self.contentViewControllers[index - 1];
|
||||
}
|
||||
|
||||
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
|
||||
NSInteger index = [self.contentViewControllers indexOfObject:viewController];
|
||||
if (index == self.contentViewControllers.count - 1 || index == NSNotFound) return nil;
|
||||
return self.contentViewControllers[index + 1];
|
||||
}
|
||||
|
||||
#pragma mark - UIPageViewControllerDelegate
|
||||
|
||||
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed {
|
||||
if (!completed) return;
|
||||
|
||||
NSInteger index = [self.contentViewControllers indexOfObject:pageViewController.viewControllers.firstObject];
|
||||
if (index != NSNotFound) {
|
||||
[self switchToIndex:index animated:YES];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Lazy Loading
|
||||
|
||||
- (UITableView *)officialTableView {
|
||||
if (!_officialTableView) {
|
||||
_officialTableView = [[UITableView alloc] init];
|
||||
_officialTableView.backgroundColor = [UIColor whiteColor];
|
||||
_officialTableView.delegate = self;
|
||||
_officialTableView.dataSource = self;
|
||||
_officialTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
||||
if (@available(iOS 11.0, *)) {
|
||||
_officialTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||||
}
|
||||
[_officialTableView registerClass:[EventCenterOfficialCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterOfficialCell class])];
|
||||
_officialTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
|
||||
// 下拉刷新
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.officialTableView.mj_header endRefreshing];
|
||||
});
|
||||
}];
|
||||
_officialTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
|
||||
// 上拉加载更多
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.officialTableView.mj_footer endRefreshing];
|
||||
});
|
||||
}];
|
||||
}
|
||||
return _officialTableView;
|
||||
}
|
||||
|
||||
- (UITableView *)eventSquareTableView {
|
||||
if (!_eventSquareTableView) {
|
||||
_eventSquareTableView = [[UITableView alloc] init];
|
||||
_eventSquareTableView.backgroundColor = [UIColor whiteColor];
|
||||
_eventSquareTableView.delegate = self;
|
||||
_eventSquareTableView.dataSource = self;
|
||||
_eventSquareTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
||||
if (@available(iOS 11.0, *)) {
|
||||
_eventSquareTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||||
}
|
||||
[_eventSquareTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])];
|
||||
_eventSquareTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
|
||||
// 下拉刷新
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.eventSquareTableView.mj_header endRefreshing];
|
||||
});
|
||||
}];
|
||||
_eventSquareTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
|
||||
// 上拉加载更多
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.eventSquareTableView.mj_footer endRefreshing];
|
||||
});
|
||||
}];
|
||||
}
|
||||
return _eventSquareTableView;
|
||||
}
|
||||
|
||||
- (UITableView *)myEventTableView {
|
||||
if (!_myEventTableView) {
|
||||
_myEventTableView = [[UITableView alloc] init];
|
||||
_myEventTableView.backgroundColor = [UIColor whiteColor];
|
||||
_myEventTableView.delegate = self;
|
||||
_myEventTableView.dataSource = self;
|
||||
_myEventTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
|
||||
if (@available(iOS 11.0, *)) {
|
||||
_myEventTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||||
}
|
||||
[_myEventTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])];
|
||||
_myEventTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
|
||||
// 下拉刷新
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.myEventTableView.mj_header endRefreshing];
|
||||
});
|
||||
}];
|
||||
_myEventTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
|
||||
// 上拉加载更多
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.myEventTableView.mj_footer endRefreshing];
|
||||
});
|
||||
}];
|
||||
}
|
||||
return _myEventTableView;
|
||||
}
|
||||
|
||||
- (UIButton *)createButton {
|
||||
if (!_createButton) {
|
||||
_createButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||
[_createButton setTitle:YMLocalizedString(@"20.20.59_text_8") forState:UIControlStateNormal];
|
||||
[_createButton addGradientBackgroundWithColors:@[
|
||||
UIColorFromRGB(0xe29030),
|
||||
UIColorFromRGB(0xfcc074)
|
||||
] startPoint:CGPointMake(0, 0.5) endPoint:CGPointMake(1, 0.5) cornerRadius:20];
|
||||
[_createButton setCornerRadius:20];
|
||||
[_createButton addTarget:self action:@selector(didTapCreateButton) forControlEvents:UIControlEventTouchUpInside];
|
||||
}
|
||||
return _createButton;
|
||||
}
|
||||
|
||||
@end
|
@@ -55,6 +55,7 @@
|
||||
#import "PIHomeCategoryTitleModel.h"
|
||||
|
||||
#import "RegionListViewController.h"
|
||||
#import "EventCenterViewController.h"
|
||||
|
||||
UIKIT_EXTERN NSString * kHomeMoreScrollPageKey;
|
||||
UIKIT_EXTERN NSString * const kOpenRoomNotification;
|
||||
@@ -783,35 +784,44 @@ XPHomeRecommendOtherRoomViewDelegate>
|
||||
}
|
||||
///选择
|
||||
-(void)selectItemWithModel:(PIHomeItemModel *)model{
|
||||
if (model.resourceType == HomeMenuResourceType_H5) {
|
||||
XPWebViewController * webVC = [[ XPWebViewController alloc] initWithRoomUID:nil];
|
||||
webVC.url = model.resourceContent;
|
||||
[self.navigationController pushViewController:webVC animated:YES];
|
||||
}else if (model.resourceType == HomeMenuResourceType_Match) { // 一键匹配的
|
||||
[self.presenter homeChatPick];
|
||||
}else {
|
||||
NSString * uid = [AccountInfoStorage instance].getUid;
|
||||
if (model.ID.length > 0 && uid.length > 0) {
|
||||
@kWeakify(self);
|
||||
[Api homePickResource:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||||
@kStrongify(self);
|
||||
if (code == 200) {
|
||||
HomeMenuSourceModel * sourceModel = [HomeMenuSourceModel modelWithDictionary:data.data];
|
||||
if (sourceModel.isPick) {
|
||||
if (sourceModel.uid.integerValue > 0) {
|
||||
[XPRoomViewController openRoom:sourceModel.uid fromNick:nil fromType:UserEnterRoomFromType_Home_Recommend fromUid:nil viewController:self];
|
||||
}
|
||||
} else {
|
||||
XPHomeRecommendOtherRoomView * recommendView = [[XPHomeRecommendOtherRoomView alloc] init];
|
||||
recommendView.delegate = self;
|
||||
recommendView.roomInfo = sourceModel;
|
||||
[TTPopup popupView:recommendView style:TTPopupStyleAlert];
|
||||
}
|
||||
} else {
|
||||
[XNDJTDDLoadingTool showErrorWithMessage:msg];
|
||||
}
|
||||
} uid:uid rid:model.ID];
|
||||
switch (model.resourceType) {
|
||||
case HomeMenuResourceType_H5: {
|
||||
XPWebViewController * webVC = [[ XPWebViewController alloc] initWithRoomUID:nil];
|
||||
webVC.url = model.resourceContent;
|
||||
[self.navigationController pushViewController:webVC animated:YES];
|
||||
}
|
||||
break;
|
||||
case HomeMenuResourceType_Match:
|
||||
[self.presenter homeChatPick];
|
||||
break;
|
||||
case HomeMenuResourceType_Room_Game: {
|
||||
// @kWeakify(self);
|
||||
// [Api homePickResource:^(BaseModel * _Nullable data, NSInteger code, NSString * _Nullable msg) {
|
||||
// @kStrongify(self);
|
||||
// if (code == 200) {
|
||||
// HomeMenuSourceModel * sourceModel = [HomeMenuSourceModel modelWithDictionary:data.data];
|
||||
// if (sourceModel.isPick) {
|
||||
// if (sourceModel.uid.integerValue > 0) {
|
||||
// [XPRoomViewController openRoom:sourceModel.uid fromNick:nil fromType:UserEnterRoomFromType_Home_Recommend fromUid:nil viewController:self];
|
||||
// }
|
||||
// } else {
|
||||
// XPHomeRecommendOtherRoomView * recommendView = [[XPHomeRecommendOtherRoomView alloc] init];
|
||||
// recommendView.delegate = self;
|
||||
// recommendView.roomInfo = sourceModel;
|
||||
// [TTPopup popupView:recommendView style:TTPopupStyleAlert];
|
||||
// }
|
||||
// } else {
|
||||
// [XNDJTDDLoadingTool showErrorWithMessage:msg];
|
||||
// }
|
||||
// } uid:uid rid:model.ID];
|
||||
}
|
||||
default:
|
||||
{
|
||||
EventCenterViewController *vc = [[EventCenterViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
vc.officialEventModels = self.headView.bannerList;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
-(void)selectBannerListWithModel:(HomeBannerInfoModel *)model{
|
||||
|
@@ -1028,10 +1028,13 @@ XPRoomGraffitiGiftAnimationViewDelegate
|
||||
}
|
||||
}
|
||||
|
||||
if (self.giftEffectTimer == nil &&
|
||||
self.svgaQueue.count > 0) {
|
||||
[self startHandleGiftEffectTimer];
|
||||
}
|
||||
dispatch_async(self.giftEffectsQueue, ^{
|
||||
if (self.giftEffectTimer == nil &&
|
||||
self.svgaQueue.count > 0) {
|
||||
[self startHandleGiftEffectTimer];
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
- (void)handleLuckyBagGifts:(GiftReceiveInfoModel *)receiveInfo {
|
||||
@@ -1081,7 +1084,7 @@ XPRoomGraffitiGiftAnimationViewDelegate
|
||||
return;
|
||||
}
|
||||
dispatch_async(self.giftEffectsQueue, ^{
|
||||
// NSLog(@"******************* 当前队列个数: %@,image loader 个数: %@", @(self.svgaQueue.count), @(self.mp4AvatarLoaders.count));
|
||||
NSLog(@"******************* 当前队列个数: %@,image loader 个数: %@", @(self.svgaQueue.count), @(self.mp4AvatarLoaders.count));
|
||||
if (self.svgaQueue.count == 0) {
|
||||
dispatch_source_cancel(timer);
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
@@ -1689,8 +1692,9 @@ XPRoomGraffitiGiftAnimationViewDelegate
|
||||
model.uid = receiveInfo.uid.integerValue;
|
||||
receiveInfo.targetUsers = @[model];
|
||||
}
|
||||
if (receiveInfo.targetUids.count == 0 && attachment.second == Custom_Message_Sub_Gift_Send) {
|
||||
receiveInfo.targetUids = @[@(receiveInfo.uid.integerValue)];
|
||||
// 确认接受者有 uid
|
||||
if (receiveInfo.targetUsers.count > 0 && receiveInfo.targetUids.count <= 0) {
|
||||
receiveInfo.targetUids = [receiveInfo.targetUsers valueForKeyPath:@"uid"];
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -28,13 +28,11 @@
|
||||
#import "XPRoomFacePresenter.h"
|
||||
#import "XPRoomFaceProtocol.h"
|
||||
|
||||
@interface XPRoomFaceViewController ()<UICollectionViewDelegate, UICollectionViewDataSource,UICollectionViewDelegateFlowLayout, XPRoomFaceProtocol>
|
||||
@interface XPRoomFaceViewController ()<UICollectionViewDelegate, UICollectionViewDataSource,UICollectionViewDelegateFlowLayout, XPRoomFaceProtocol, UIGestureRecognizerDelegate>
|
||||
///顶部的View
|
||||
@property (nonatomic,strong) UIView * topView;
|
||||
///显示的内容
|
||||
@property (nonatomic,strong) UIView * contentView;
|
||||
///蒙版
|
||||
@property (nonatomic,strong) UIVisualEffectView *effectView;
|
||||
///最外层的容器
|
||||
@property (nonatomic,strong) UIStackView *stackView;
|
||||
///标题的容器
|
||||
@@ -232,6 +230,10 @@
|
||||
return resultArray;
|
||||
}
|
||||
|
||||
#pragma mark - Gesture Delegate
|
||||
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma mark - scrollviewdelegate
|
||||
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
|
||||
@@ -335,9 +337,6 @@
|
||||
#pragma mark - Event Response
|
||||
- (void)noblePrivilButtonAction:(UIButton *)sender {
|
||||
[self dismissViewControllerAnimated:YES completion:nil];
|
||||
return;
|
||||
// XPNobleCenterViewController * nobleCenter = [[XPNobleCenterViewController alloc] init];
|
||||
// [((UINavigationController *)self.presentingViewController) pushViewController:nobleCenter animated:YES];
|
||||
}
|
||||
|
||||
- (void)disMissViewRecognizer {
|
||||
@@ -348,9 +347,11 @@
|
||||
- (UIView *)topView {
|
||||
if (!_topView) {
|
||||
_topView = [[UIView alloc] init];
|
||||
_topView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.3];
|
||||
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disMissViewRecognizer)];
|
||||
[_topView addGestureRecognizer:tap];
|
||||
_topView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.2];
|
||||
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disMissViewRecognizer)];
|
||||
tap.cancelsTouchesInView = NO;
|
||||
tap.delegate = self;
|
||||
[_topView addGestureRecognizer:tap];
|
||||
}
|
||||
return _topView;
|
||||
}
|
||||
@@ -363,15 +364,6 @@
|
||||
return _contentView;
|
||||
}
|
||||
|
||||
- (UIVisualEffectView *)effectView {
|
||||
if (!_effectView) {
|
||||
UIBlurEffect *effect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
|
||||
_effectView = [[UIVisualEffectView alloc]initWithEffect:effect];
|
||||
_effectView.alpha = 1;
|
||||
}
|
||||
return _effectView;
|
||||
}
|
||||
|
||||
- (UIStackView *)stackView {
|
||||
if (!_stackView) {
|
||||
_stackView = [[UIStackView alloc] init];
|
||||
|
@@ -391,6 +391,7 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey;
|
||||
}];
|
||||
|
||||
[self.stackView addArrangedSubview:self.inputButton];
|
||||
// [self.stackView addArrangedSubview:self.faceButton];
|
||||
[self.stackView addArrangedSubview:self.micButton];
|
||||
[self.stackView addArrangedSubview:self.voiceButton];
|
||||
[self.stackView addArrangedSubview:self.arrangeMicButton];
|
||||
@@ -398,7 +399,7 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey;
|
||||
[self.stackView addArrangedSubview:self.moreButton];
|
||||
[self.stackView addArrangedSubview:self.giftButton];
|
||||
|
||||
[self.stackView addSubview:self.faceButton];
|
||||
[self.stackView addSubview:self.faceButton];
|
||||
|
||||
[self.stackView addSubview:self.micButton_open];
|
||||
[self.stackView addSubview:self.micButton_close_all];
|
||||
@@ -433,9 +434,9 @@ UIKIT_EXTERN NSString * kRoomBackMusicCaptureVolumeKey;
|
||||
}];
|
||||
|
||||
[self.faceButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerY.mas_equalTo(self.inputButton);
|
||||
make.trailing.mas_equalTo(self.inputButton).offset(-7);
|
||||
make.width.height.mas_equalTo(22);
|
||||
make.centerY.mas_equalTo(self.inputButton);
|
||||
make.trailing.mas_equalTo(self.inputButton).offset(-4);
|
||||
make.width.height.mas_equalTo(36);
|
||||
}];
|
||||
|
||||
[self.micButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
|
@@ -560,8 +560,10 @@ UIKIT_EXTERN NSString * const kRoomGiftEffectUpdateNotificationKey;
|
||||
if (!_topView) {
|
||||
_topView = [[UIView alloc] init];
|
||||
_topView.backgroundColor = [UIColor clearColor];
|
||||
UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disMissRecognizer)];
|
||||
[_topView addGestureRecognizer:tap];
|
||||
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disMissRecognizer)];
|
||||
tap.cancelsTouchesInView = NO;
|
||||
tap.delegate = self;
|
||||
[_topView addGestureRecognizer:tap];
|
||||
}
|
||||
return _topView;
|
||||
}
|
||||
|
@@ -29,7 +29,7 @@
|
||||
// 用来存储 GiftReceiveInfoModel 和 NSDictionary 的元数据队列
|
||||
@property (nonatomic, strong) NSMutableArray *giftComboQueue;
|
||||
@property (nonatomic, strong) NSMutableArray *comboFlagQueue;
|
||||
@property (nonatomic, strong) NSTimer *comboFlagTimer;
|
||||
@property (nonatomic, strong) dispatch_source_t comboFlagTimer;
|
||||
@property (nonatomic, strong) UIView *containerView;
|
||||
|
||||
// 定时器,处理请求的调度器
|
||||
@@ -60,6 +60,13 @@
|
||||
|
||||
#pragma mark - 单例方法
|
||||
|
||||
- (void)dealloc {
|
||||
[self stopProcessingGiftComboFlagQueue];
|
||||
if (self.comboFlagQueue) {
|
||||
self.comboFlagQueue = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
+ (instancetype)sharedManager {
|
||||
static GiftComboManager *sharedInstance = nil;
|
||||
static dispatch_once_t onceToken;
|
||||
@@ -166,12 +173,38 @@
|
||||
}
|
||||
|
||||
- (void)startProcessingGiftComboFlagQueue {
|
||||
self.comboFlagTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(processGiftFlagQueue) userInfo:nil repeats:YES];
|
||||
if (self.comboFlagTimer) {
|
||||
return;
|
||||
}
|
||||
|
||||
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
|
||||
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
|
||||
|
||||
dispatch_source_set_timer(timer,
|
||||
DISPATCH_TIME_NOW,
|
||||
0.2 * NSEC_PER_SEC,
|
||||
0.01 * NSEC_PER_SEC);
|
||||
|
||||
@kWeakify(self);
|
||||
dispatch_source_set_event_handler(timer, ^{
|
||||
@kStrongify(self);
|
||||
[self processGiftFlagQueue];
|
||||
});
|
||||
|
||||
dispatch_resume(timer);
|
||||
self.comboFlagTimer = timer;
|
||||
}
|
||||
|
||||
- (void)stopProcessingGiftComboFlagQueue {
|
||||
[self.comboFlagTimer invalidate];
|
||||
self.comboFlagTimer = nil;
|
||||
if (self.comboFlagTimer) {
|
||||
dispatch_source_cancel(self.comboFlagTimer);
|
||||
|
||||
@kWeakify(self);
|
||||
dispatch_source_set_cancel_handler(self.comboFlagTimer, ^{
|
||||
@kStrongify(self);
|
||||
self.comboFlagTimer = nil;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
- (void)processGiftFlagQueue {
|
||||
@@ -181,7 +214,9 @@
|
||||
|
||||
GiftReceiveInfoModel *receiveInfo = [self.giftComboQueue firstObject];
|
||||
[self.giftComboQueue removeObjectAtIndex:0];
|
||||
[self handleGiftInfo:receiveInfo];
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self handleGiftInfo:receiveInfo];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)handleGiftInfo:(GiftReceiveInfoModel *)receiveInfo {
|
||||
@@ -285,7 +320,7 @@
|
||||
}
|
||||
|
||||
|
||||
// MARK: Logic is 连击面板出现后,每点击一次,就触发一次面板最后的请求,请求成功后,构造云信消息体,消息体进入队列并按 0.2s 一次的频率发送消息
|
||||
// MARK: Logic is 连击面板出现后,每点击一次,就触发一次面板最后的请求,请求成功后,构造云信消息体,消息体进入队列并按 0.25s 一次的频率发送消息
|
||||
#pragma mark - 管理队列
|
||||
|
||||
// 开始处理队列
|
||||
@@ -298,7 +333,7 @@
|
||||
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
|
||||
|
||||
// 设置定时器时间间隔:每 0.3 秒执行一次
|
||||
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC);
|
||||
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.25 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC);
|
||||
|
||||
// 定时器触发的事件处理
|
||||
dispatch_source_set_event_handler(self.timer, ^{
|
||||
@@ -360,9 +395,11 @@
|
||||
@synchronized (self) {
|
||||
if (self.requestQueue.count > 0) {
|
||||
// 获取并移除队列中的第一个元数据
|
||||
NSDictionary *dic = [self.requestQueue firstObject];
|
||||
[self handleSendGift:dic];
|
||||
[self.requestQueue removeObject:dic];
|
||||
NSDictionary *dic = [self.requestQueue xpSafeObjectAtIndex:0];
|
||||
if (dic) {
|
||||
[self handleSendGift:dic];
|
||||
[self.requestQueue removeObject:dic];
|
||||
}
|
||||
} else {
|
||||
[self stopProcessingQueue];
|
||||
}
|
||||
|
@@ -210,28 +210,24 @@
|
||||
|
||||
- (void)handleTap {
|
||||
static BOOL isHandlingTap = NO;
|
||||
|
||||
if (isHandlingTap) {
|
||||
// NSLog(@"点击间隔过短,忽略此次点击");
|
||||
return;
|
||||
}
|
||||
|
||||
isHandlingTap = YES;
|
||||
[self.feedbackGenerator impactOccurred];
|
||||
|
||||
[[GiftComboManager sharedManager] sendGift];
|
||||
[self.playImageView startAnimation];
|
||||
[self.countdownRingView resetCountdown];
|
||||
|
||||
// 处理点击事件
|
||||
// NSLog(@"有效点击处理");
|
||||
@kWeakify(self);
|
||||
// 延迟重置标志位
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
@kStrongify(self);
|
||||
// 1521 连续震动 3 次
|
||||
// AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
|
||||
// AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate));
|
||||
[self.feedbackGenerator impactOccurred];
|
||||
|
||||
[[GiftComboManager sharedManager] sendGift];
|
||||
[self.playImageView startAnimation];
|
||||
[self.countdownRingView resetCountdown];
|
||||
isHandlingTap = NO;
|
||||
});
|
||||
}
|
||||
|
@@ -80,7 +80,11 @@
|
||||
point = CGPointMake(paddingH + (mcWidth + marginH) * (index - 10) + mcWidth / 2, tRowTop + mcHeight / 2);
|
||||
}
|
||||
|
||||
point = [self convertPoint:point toView:nil];
|
||||
if (CGPointEqualToPoint(point, CGPointZero)) {
|
||||
point = CGPointMake(KScreenWidth/2, 70);
|
||||
} else {
|
||||
point = [self convertPoint:point toView:nil];
|
||||
}
|
||||
return point;
|
||||
}
|
||||
|
||||
@@ -99,7 +103,11 @@
|
||||
point = CGPointMake(paddingH + (mcWidth + marginH) * (index - 10) + mcWidth / 2, tRowTop + mcHeight / 2);
|
||||
}
|
||||
|
||||
point = [self convertPoint:point toView:nil];
|
||||
if (CGPointEqualToPoint(point, CGPointZero)) {
|
||||
point = CGPointMake(KScreenWidth/2, 70);
|
||||
} else {
|
||||
point = [self convertPoint:point toView:nil];
|
||||
}
|
||||
return point;
|
||||
}
|
||||
|
||||
|
@@ -120,7 +120,7 @@ static const NSInteger kMicCountPerRow = 5;
|
||||
|
||||
- (CGPoint)animationPointAtStageViewByIndex:(NSInteger)index {
|
||||
if (index < 0 || index >= [self countOfMicroView]) {
|
||||
return CGPointZero;
|
||||
return CGPointMake(KScreenWidth/2, 70);
|
||||
}
|
||||
|
||||
CGRect rect = [self rectForViewAtIndex:index];
|
||||
|
@@ -103,7 +103,13 @@
|
||||
if (index >= 5 && index <= 9) {
|
||||
point = CGPointMake(paddingH + (mcWidth + marginH) * (index - 4 - 1) + mcWidth / 2, s_top + mcWidth / 2 - 10);
|
||||
}
|
||||
point = [self convertPoint:point toView:nil];
|
||||
|
||||
if (CGPointEqualToPoint(point, CGPointZero)) {
|
||||
point = CGPointMake(KScreenWidth/2, 70);
|
||||
} else {
|
||||
point = [self convertPoint:point toView:nil];
|
||||
}
|
||||
|
||||
return point;
|
||||
}
|
||||
|
||||
|
@@ -71,7 +71,11 @@
|
||||
if (index >= 5 && index < 10) {
|
||||
point = CGPointMake(paddingH + (mcWidth + marginH) * (index - 5) + mcWidth / 2, sRowTop + mcWidth / 2);
|
||||
}
|
||||
point = [self convertPoint:point toView:nil];
|
||||
if (CGPointEqualToPoint(point, CGPointZero)) {
|
||||
point = CGPointMake(KScreenWidth/2, 70);
|
||||
} else {
|
||||
point = [self convertPoint:point toView:nil];
|
||||
}
|
||||
return point;
|
||||
}
|
||||
|
||||
|
@@ -67,7 +67,7 @@ static const NSInteger kMicCountPerRow = 5;
|
||||
|
||||
- (CGPoint)animationPointAtStageViewByIndex:(NSInteger)index {
|
||||
if (index < 0 || index >= [self countOfMicroView]) {
|
||||
return CGPointMake(KScreenWidth/2 - mcWidth/2, mcHeight);
|
||||
return CGPointMake(KScreenWidth/2, 50);
|
||||
}
|
||||
CGPoint position = [self positionForIndex:index rowHeight:mcHeight];
|
||||
return [self convertPoint:position toView:nil];
|
||||
|
@@ -1788,7 +1788,6 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
}
|
||||
[XPRoomMiniManager shareManager].curState = nil;
|
||||
}
|
||||
|
||||
}
|
||||
- (void)getRoomFirstChargeWindowSuccess:(FirstChargeRoomWindowModel *)model{
|
||||
if(model.needToShow == NO || model.showAfterSecond <= 0 || self.isShowFirstRecharge == YES)return;
|
||||
@@ -1854,7 +1853,7 @@ XPCandyTreeInsufficientBalanceViewDelegate>
|
||||
continue;
|
||||
}
|
||||
|
||||
// NSLog(@" --- Message Raw Attach Content: %@, %@, %ld", @(message.senderClientType), message.rawAttachContent, (long)message.messageType);
|
||||
NSLog(@" --- Message Raw Attach Content: %@, %@, %ld", @(message.senderClientType), message.rawAttachContent, (long)message.messageType);
|
||||
|
||||
if (message.messageType == NIMMessageTypeNotification) {
|
||||
NIMNotificationObject *notiMsg = (NIMNotificationObject *)message.messageObject;
|
||||
|
@@ -237,7 +237,6 @@
|
||||
NSLog(@"\n%@", [baseModel toJSONString]);
|
||||
#else
|
||||
#endif
|
||||
|
||||
success(baseModel);
|
||||
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
|
||||
[self handleNetError:error method:method failure:failure];
|
||||
|
@@ -4169,3 +4169,12 @@ ineHeadView12" = "الحمل";
|
||||
"20.20.56_text_18" = "مقبول";
|
||||
"20.20.56_text_19" = "مرفوض";
|
||||
"20.20.56_text_20" = "والآخر يرفض دعوتك لتغيير العلاقات.";
|
||||
|
||||
"20.20.59_text_1" = "老年人活動中心";
|
||||
"20.20.59_text_2" = "Offical";
|
||||
"20.20.59_text_3" = "Event Square";
|
||||
"20.20.59_text_4" = "My Events";
|
||||
"20.20.59_text_5" = "Sub";
|
||||
"20.20.59_text_6" = "Unsub";
|
||||
"20.20.59_text_7" = "Participate";
|
||||
"20.20.59_text_8" = "Create Event";
|
||||
|
@@ -3954,3 +3954,12 @@
|
||||
"20.20.56_text_18" = "Accepted";
|
||||
"20.20.56_text_19" = "Rejected";
|
||||
"20.20.56_text_20" = "The other rejects your invitation to change relationships.";
|
||||
|
||||
"20.20.59_text_1" = "老年人活動中心";
|
||||
"20.20.59_text_2" = "Offical";
|
||||
"20.20.59_text_3" = "Event Square";
|
||||
"20.20.59_text_4" = "My Events";
|
||||
"20.20.59_text_5" = "Sub";
|
||||
"20.20.59_text_6" = "Unsub";
|
||||
"20.20.59_text_7" = "Participate";
|
||||
"20.20.59_text_8" = "Create Event";
|
||||
|
@@ -3747,3 +3747,12 @@
|
||||
"20.20.56_text_18" = "Kabul Edildi";
|
||||
"20.20.56_text_19" = "Reddedildi";
|
||||
"20.20.56_text_20" = "Diğeri sizin ilişkileri değiştirme davetinizi reddeder.";
|
||||
|
||||
"20.20.59_text_1" = "老年人活動中心";
|
||||
"20.20.59_text_2" = "Offical";
|
||||
"20.20.59_text_3" = "Event Square";
|
||||
"20.20.59_text_4" = "My Events";
|
||||
"20.20.59_text_5" = "Sub";
|
||||
"20.20.59_text_6" = "Unsub";
|
||||
"20.20.59_text_7" = "Participate";
|
||||
"20.20.59_text_8" = "Create Event";
|
||||
|
@@ -3619,3 +3619,12 @@
|
||||
"20.20.56_text_18" = "已接受";
|
||||
"20.20.56_text_19" = "已拒絕";
|
||||
"20.20.56_text_20" = "拒绝改变关系的邀请。";
|
||||
|
||||
"20.20.59_text_1" = "老年人活動中心";
|
||||
"20.20.59_text_2" = "Offical";
|
||||
"20.20.59_text_3" = "Event Square";
|
||||
"20.20.59_text_4" = "My Events";
|
||||
"20.20.59_text_5" = "Sub";
|
||||
"20.20.59_text_6" = "Unsub";
|
||||
"20.20.59_text_7" = "Participate";
|
||||
"20.20.59_text_8" = "Create Event";
|
||||
|
Reference in New Issue
Block a user