新增活动详情页相关功能,包括事件模型、API接口、UI组件及相关资源文件。更新版本号至20.20.60。
This commit is contained in:
21
YuMi/Assets.xcassets/20.20.59/event_clock.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/event_clock.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/20.20.59/event_clock.imageset/容器@3x (1).png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/event_clock.imageset/容器@3x (1).png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1004 B |
21
YuMi/Assets.xcassets/20.20.59/event_ring.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/event_ring.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/20.20.59/event_ring.imageset/容器@3x (2).png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/event_ring.imageset/容器@3x (2).png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 711 B |
21
YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "切图 68@3x (2).png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/切图 68@3x (2).png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/event_ring_sub.imageset/切图 68@3x (2).png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
21
YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/Contents.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "1x"
|
||||
},
|
||||
{
|
||||
"idiom" : "universal",
|
||||
"scale" : "2x"
|
||||
},
|
||||
{
|
||||
"filename" : "切图 68@3x (1).png",
|
||||
"idiom" : "universal",
|
||||
"scale" : "3x"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
BIN
YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/切图 68@3x (1).png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/event_ring_unsub.imageset/切图 68@3x (1).png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
21
YuMi/Assets.xcassets/20.20.59/room_icon.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/room_icon.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/room_icon.imageset/容器@3x.png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/room_icon.imageset/容器@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
21
YuMi/Assets.xcassets/20.20.59/鸭子.imageset/Contents.json
vendored
Normal file
21
YuMi/Assets.xcassets/20.20.59/鸭子.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/鸭子.imageset/鸭子@3x.png
vendored
Normal file
BIN
YuMi/Assets.xcassets/20.20.59/鸭子.imageset/鸭子@3x.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.0 KiB |
@@ -112,6 +112,8 @@ typedef NS_ENUM(NSUInteger, URLType) {
|
||||
KLuckyPackageRule,
|
||||
/// 人機驗證
|
||||
kCaptchaSwitchPath,
|
||||
/// 活动详情页
|
||||
kEventDetailPath
|
||||
};
|
||||
|
||||
NSString * const URLWithType(URLType type);
|
||||
|
@@ -28,7 +28,8 @@ NSString * const URLWithType(URLType type) {
|
||||
@(KRoomLevelRule) : @"modules/roomLevel/index.html",///房间等级,
|
||||
@(KLuckyPackageRule) : @"modules/luckyBagRules/index.html",///红包礼物,
|
||||
@(kCaptchaSwitchPath) : @"modules/humanMachineVerification/index.html",
|
||||
@(kAccountlogoutConfirmURL) : @"modules/logout/confirm.html"
|
||||
@(kAccountlogoutConfirmURL) : @"modules/logout/confirm.html",
|
||||
@(kEventDetailPath) : @"modules/eventDetails/index.html?eventId=",
|
||||
};
|
||||
NSString * newUrl = [newDic objectForKey:@(type)];
|
||||
if(newUrl != nil){
|
||||
|
@@ -46,7 +46,7 @@ isPhoneXSeries = [[UIApplication sharedApplication] delegate].window.safeAreaIns
|
||||
#define kFontHeavy(font) [UIFont systemFontOfSize:kGetScaleWidth(font) weight:UIFontWeightHeavy]
|
||||
|
||||
///内置版本号
|
||||
#define PI_App_Version @"1.0.27"
|
||||
#define PI_App_Version @"1.0.27.1"
|
||||
///渠道
|
||||
#define PI_App_Source @"appstore"
|
||||
#define PI_Test_Flight @"TestFlight"
|
||||
|
@@ -68,6 +68,8 @@ typedef NS_ENUM(NSUInteger, CustomMessageType) {
|
||||
CustomMessageType_RoomBoom = 63,
|
||||
/// CP 礼物
|
||||
CustomMessageType_CP = 64,
|
||||
/// 房间活动
|
||||
CustomMessageType_Public_Event = 68,
|
||||
///塔罗
|
||||
CustomMessageType_Tarot = 71,
|
||||
///相亲
|
||||
@@ -153,6 +155,10 @@ typedef NS_ENUM(NSUInteger, CustomMessageType) {
|
||||
CustomMessageType_CP_message = 117,
|
||||
};
|
||||
|
||||
typedef NS_ENUM(NSUInteger, CustomMessageTypePublicEvent) {
|
||||
Custom_Message_Sub_Public_Event_message = 681,
|
||||
};
|
||||
|
||||
/// first = CustomMessageType_CP_message
|
||||
typedef NS_ENUM(NSUInteger, CustomMessageTypeCPmessage) {
|
||||
Custom_Message_Sub_CP_message_request = 1170,
|
||||
|
@@ -90,28 +90,28 @@
|
||||
|
||||
|
||||
//在自定义cell中的init方法加入
|
||||
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressCellHandle:)];
|
||||
UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressCellHandle:)];
|
||||
longPressGesture.minimumPressDuration = 0.5;
|
||||
[self.messageBackground addGestureRecognizer:longPressGesture];
|
||||
[self.messageBackground addGestureRecognizer:longPressGesture];
|
||||
}
|
||||
|
||||
- (void)initLayout {
|
||||
[self.leftAvatar mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.leading.top.mas_equalTo(self).offset(15);
|
||||
make.width.height.mas_equalTo(45);
|
||||
make.width.height.mas_equalTo(45).priorityHigh();
|
||||
}];
|
||||
|
||||
[self.rightAvatar mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self).offset(15);
|
||||
make.trailing.mas_equalTo(self).offset(-15);
|
||||
make.width.height.mas_equalTo(45);
|
||||
make.width.height.mas_equalTo(45).priorityHigh();
|
||||
}];
|
||||
|
||||
[self.messageBackground mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
self.messageBackgroundLeft = make.leading.mas_equalTo(self.leftAvatar.mas_trailing).offset(15);
|
||||
self.messageBackgroundRight = make.trailing.mas_equalTo(self.rightAvatar.mas_leading).offset(-15);
|
||||
self.messageBackgroundLeftAvatar = make.leading.mas_equalTo(self.leftAvatar.mas_leading);
|
||||
self.messageBackgroundRightAvatar = make.trailing.mas_equalTo(self.rightAvatar.mas_trailing);
|
||||
self.messageBackgroundLeft = make.leading.mas_equalTo(self.leftAvatar.mas_trailing).offset(15).priorityHigh();
|
||||
self.messageBackgroundRight = make.trailing.mas_equalTo(self.rightAvatar.mas_leading).offset(-15).priorityHigh();
|
||||
self.messageBackgroundLeftAvatar = make.leading.mas_equalTo(self.leftAvatar.mas_leading).priorityHigh();
|
||||
self.messageBackgroundRightAvatar = make.trailing.mas_equalTo(self.rightAvatar.mas_trailing).priorityHigh();
|
||||
make.top.mas_equalTo(self).offset(20);
|
||||
}];
|
||||
|
||||
@@ -161,7 +161,7 @@
|
||||
- (BOOL)checkDataWith:(long)currentStr {
|
||||
NSDate* date = [NSDate dateWithTimeIntervalSince1970:currentStr];
|
||||
NSCalendar * calendar = [NSCalendar currentCalendar];
|
||||
NSCalendarUnit unit =NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
|
||||
NSCalendarUnit unit = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
|
||||
NSDateComponents * cmps = [calendar components:unit fromDate:date toDate:[NSDate date] options:0];
|
||||
if (cmps.minute <= 2) {
|
||||
return YES;
|
||||
@@ -226,9 +226,9 @@
|
||||
[self.messageBackgroundRight install];
|
||||
[self.messageBackgroundRightAvatar uninstall];
|
||||
} else {
|
||||
[self.messageBackgroundLeft uninstall];
|
||||
[self.messageBackgroundRight install];
|
||||
[self.messageBackgroundLeft install];
|
||||
[self.messageBackgroundLeftAvatar uninstall];
|
||||
[self.messageBackgroundRight install];
|
||||
[self.messageBackgroundRightAvatar uninstall];
|
||||
}
|
||||
self.rightAvatar.imageUrl = avatarUrl;
|
||||
@@ -243,7 +243,7 @@
|
||||
[self.messageBackgroundRightAvatar install];
|
||||
} else {
|
||||
[self.messageBackgroundLeft install];
|
||||
[self.messageBackgroundRight uninstall];
|
||||
[self.messageBackgroundRight install];
|
||||
[self.messageBackgroundLeftAvatar uninstall];
|
||||
[self.messageBackgroundRightAvatar uninstall];
|
||||
}
|
||||
@@ -264,7 +264,11 @@
|
||||
}
|
||||
}
|
||||
} else {
|
||||
#if DEBUG
|
||||
NSAssert(classStr != nil, @"message should not be nil");
|
||||
#else
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
[self.messageBackground addSubview:self.messageContent];
|
||||
//MARK: 不太理解原来的 layout 关系,对开黑卡特殊处理
|
||||
|
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// PublicEventTableViewCell.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/13.
|
||||
//
|
||||
|
||||
#import "MessageContentCustomView.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface PublicEventTableViewCell : MessageContentCustomView
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
@@ -0,0 +1,133 @@
|
||||
//
|
||||
// PublicEventTableViewCell.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/13.
|
||||
//
|
||||
|
||||
#import "PublicEventTableViewCell.h"
|
||||
#import "MessagePublicEventModel.h"
|
||||
|
||||
@interface PublicEventTableViewCell ()
|
||||
|
||||
@property (nonatomic, strong) NetImageView *topImageView;
|
||||
@property (nonatomic, strong) UIImageView *roomIcon;
|
||||
@property (nonatomic, strong) UILabel *roomIDLabel;
|
||||
@property (nonatomic, strong) UILabel *eventDescLabel;
|
||||
@property (nonatomic, strong) UIButton *joinButton;
|
||||
|
||||
@end
|
||||
|
||||
@implementation PublicEventTableViewCell
|
||||
|
||||
- (void)initSubViews {
|
||||
[super initSubViews];
|
||||
// return;
|
||||
[self.backView addSubview:self.topImageView];
|
||||
[self.backView addSubview:self.roomIcon];
|
||||
[self.backView addSubview:self.roomIDLabel];
|
||||
[self.backView addSubview:self.eventDescLabel];
|
||||
[self.backView addSubview:self.joinButton];
|
||||
}
|
||||
|
||||
- (void)initSubViewConstraints {
|
||||
[super initSubViewConstraints];
|
||||
// return;
|
||||
[self.topImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
// make.edges.mas_equalTo(self);
|
||||
make.top.leading.mas_equalTo(self);
|
||||
make.width.mas_equalTo(self);
|
||||
make.height.mas_equalTo(86);
|
||||
}];
|
||||
|
||||
[self.roomIcon mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.topImageView.mas_bottom).offset(8);
|
||||
make.leading.mas_equalTo(8);
|
||||
make.size.mas_equalTo(CGSizeMake(16, 16));
|
||||
}];
|
||||
|
||||
|
||||
[self.roomIDLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerY.mas_equalTo(self.roomIcon);
|
||||
make.leading.mas_equalTo(self.roomIcon.mas_trailing).offset(8);
|
||||
}];
|
||||
|
||||
[self.joinButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.bottom.trailing.mas_equalTo(-8);
|
||||
make.size.mas_equalTo(CGSizeMake(96, 30));
|
||||
}];
|
||||
|
||||
[self.eventDescLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.roomIcon.mas_bottom).offset(8);
|
||||
make.leading.trailing.mas_equalTo(self.backView).inset(8);
|
||||
make.bottom.mas_equalTo(self.joinButton.mas_top).offset(-8);
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)didTapJoinButton {
|
||||
|
||||
}
|
||||
|
||||
- (void)render:(MessageBaseModel *)message {
|
||||
if ([message isKindOfClass:[MessagePublicEventModel class]]) {
|
||||
MessagePublicEventModel *model = (MessagePublicEventModel *)message;
|
||||
NSLog(@"%@", model);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#pragma mark -
|
||||
- (NetImageView *)topImageView {
|
||||
if (!_topImageView) {
|
||||
NetImageConfig * config = [[NetImageConfig alloc] init];
|
||||
config.placeHolder = [UIImageConstant defaultBannerPlaceholder];
|
||||
_topImageView = [[NetImageView alloc] initWithConfig:config];
|
||||
[_topImageView setCornerRadius:8];
|
||||
}
|
||||
return _topImageView;
|
||||
}
|
||||
|
||||
- (UIImageView *)roomIcon {
|
||||
if (!_roomIcon) {
|
||||
_roomIcon = [[UIImageView alloc] initWithImage:kImage(@"room_icon")];
|
||||
}
|
||||
return _roomIcon;
|
||||
}
|
||||
|
||||
- (UILabel *)roomIDLabel {
|
||||
if (!_roomIDLabel) {
|
||||
_roomIDLabel = [UILabel labelInitWithText:YMLocalizedString(@"XPMineGuildViewController6")
|
||||
font:kFontRegular(13)
|
||||
textColor:UIColorFromRGB(0x313131)];
|
||||
}
|
||||
return _roomIDLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)eventDescLabel {
|
||||
if (!_eventDescLabel) {
|
||||
_eventDescLabel = [UILabel labelInitWithText:@"Your Event is about to start! Your fans and subscribers have been notified!"
|
||||
font:kFontMedium(14)
|
||||
textColor:UIColorFromRGB(0x313131)];
|
||||
_eventDescLabel.numberOfLines = 0;
|
||||
}
|
||||
return _eventDescLabel;
|
||||
}
|
||||
|
||||
- (UIButton *)joinButton {
|
||||
if (!_joinButton) {
|
||||
_joinButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||
[_joinButton setTitle:YMLocalizedString(@"XPCandyTreeViewController4") forState:UIControlStateNormal];
|
||||
[_joinButton.titleLabel setFont:kFontMedium(14)];
|
||||
[_joinButton addTarget:self
|
||||
action:@selector(didTapJoinButton)
|
||||
forControlEvents:UIControlEventTouchUpInside];
|
||||
[_joinButton setCornerRadius:15];
|
||||
[_joinButton addGradientBackgroundWithColors:@[
|
||||
UIColorFromRGB(0xe29030),
|
||||
UIColorFromRGB(0xfcc074)
|
||||
] startPoint:CGPointMake(0, 0.5) endPoint:CGPointMake(1, 0.5) cornerRadius:15];
|
||||
}
|
||||
return _joinButton;
|
||||
}
|
||||
|
||||
@end
|
@@ -0,0 +1,24 @@
|
||||
//
|
||||
// MessagePublicEventModel.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/13.
|
||||
//
|
||||
|
||||
#import "MessageBaseModel.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface MessagePublicEventModel : MessageBaseModel
|
||||
|
||||
@property (nonatomic, copy) NSString *eventBanner;
|
||||
@property (nonatomic, assign) NSInteger roomUid;
|
||||
@property (nonatomic, copy) NSString *id;
|
||||
@property (nonatomic, copy) NSString *eventTopic;
|
||||
@property (nonatomic, copy) NSString *eventDetail;
|
||||
@property (nonatomic, assign) NSInteger type;
|
||||
@property (nonatomic, assign) NSInteger roomErbanNo;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
@@ -0,0 +1,27 @@
|
||||
//
|
||||
// MessagePublicEventModel.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/13.
|
||||
//
|
||||
|
||||
#import "MessagePublicEventModel.h"
|
||||
|
||||
@implementation MessagePublicEventModel
|
||||
|
||||
- (instancetype)initWithMessage:(NIMMessage *)message {
|
||||
if (self = [super initWithMessage:message]) {
|
||||
self.message = message;
|
||||
self.isHiddenAvatar = NO;
|
||||
self.messageType = SessionMessageType_Custom;
|
||||
// TODO: 计算高度
|
||||
self.height = 230;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (NSString *)cellContent:(MessageBaseModel *)model {
|
||||
return @"PublicEventTableViewCell";
|
||||
}
|
||||
|
||||
@end
|
@@ -57,6 +57,7 @@
|
||||
#import "MessageTipsModel.h"
|
||||
#import "MessageTreasureFairyModel.h"
|
||||
#import "MessageCPNotifyModel.h"
|
||||
#import "MessagePublicEventModel.h"
|
||||
///View
|
||||
#import "XPMineUserInfoViewController.h"
|
||||
|
||||
@@ -234,6 +235,10 @@
|
||||
#pragma mark - cell的样式
|
||||
- (MessageBaseModel *)modeTransformMessage:(NIMMessage *)message {
|
||||
MessageBaseModel * model;
|
||||
#if DEBUG
|
||||
model = [[MessagePublicEventModel alloc] initWithMessage:message];
|
||||
return model;
|
||||
#endif
|
||||
switch (message.messageType) {
|
||||
case NIMMessageTypeText:
|
||||
model = [[MessageTextModel alloc] initWithMessage:message];
|
||||
@@ -253,7 +258,7 @@
|
||||
default:
|
||||
model = [[MessageUnSupportModel alloc] initWithMessage:message];
|
||||
break;
|
||||
break;
|
||||
|
||||
}
|
||||
return model;
|
||||
}
|
||||
@@ -277,6 +282,11 @@
|
||||
NSInteger second = attachment.second;
|
||||
|
||||
switch (first) {
|
||||
case CustomMessageType_Public_Event:
|
||||
if (second == Custom_Message_Sub_Public_Event_message) {
|
||||
model = [[MessagePublicEventModel alloc] initWithMessage:message];
|
||||
}
|
||||
break;
|
||||
case CustomMessageType_CP_message:
|
||||
if (second == Custom_Message_Sub_CP_message_request || second == Custom_Message_Sub_CP_message_result) {
|
||||
model = [[MessageCPNotifyModel alloc] initWithMessage:message];
|
||||
|
33
YuMi/Modules/YMNewHome/Api/Api+EventCenter.h
Normal file
33
YuMi/Modules/YMNewHome/Api/Api+EventCenter.h
Normal file
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// Api+EventCenter.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/15.
|
||||
//
|
||||
|
||||
#import "Api.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface Api(EventCenter)
|
||||
|
||||
/// 活动广场列表
|
||||
+ (void)usereventSquare:(HttpRequestHelperCompletion)complection
|
||||
page:(NSNumber *)page
|
||||
pageSize:(NSNumber *)pageSize;
|
||||
|
||||
/// 我发布的活动
|
||||
+ (void)usereventMySquare:(HttpRequestHelperCompletion)complection
|
||||
page:(NSNumber *)page
|
||||
pageSize:(NSNumber *)pageSize
|
||||
uid:(NSString *)uid;
|
||||
|
||||
/// 我订阅的活动
|
||||
+ (void)usereventMySub:(HttpRequestHelperCompletion)complection
|
||||
page:(NSNumber *)page
|
||||
pageSize:(NSNumber *)pageSize
|
||||
uid:(NSString *)uid;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
41
YuMi/Modules/YMNewHome/Api/Api+EventCenter.m
Normal file
41
YuMi/Modules/YMNewHome/Api/Api+EventCenter.m
Normal file
@@ -0,0 +1,41 @@
|
||||
//
|
||||
// Api+EventCenter.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/15.
|
||||
//
|
||||
|
||||
#import "Api+EventCenter.h"
|
||||
|
||||
@implementation Api(EventCenter)
|
||||
|
||||
/// 活动广场列表
|
||||
+ (void)usereventSquare:(HttpRequestHelperCompletion)complection
|
||||
page:(NSNumber *)page
|
||||
pageSize:(NSNumber *)pageSize {
|
||||
[self makeRequest:@"userevent/square"
|
||||
method:HttpRequestHelperMethodGET
|
||||
completion:complection, __FUNCTION__, page, pageSize, nil];
|
||||
}
|
||||
|
||||
/// 我发布的活动
|
||||
+ (void)usereventMySquare:(HttpRequestHelperCompletion)complection
|
||||
page:(NSNumber *)page
|
||||
pageSize:(NSNumber *)pageSize
|
||||
uid:(NSString *)uid {
|
||||
[self makeRequest:@"userevent/mysquare"
|
||||
method:HttpRequestHelperMethodGET
|
||||
completion:complection, __FUNCTION__, page, pageSize, uid, nil];
|
||||
}
|
||||
|
||||
/// 我订阅的活动
|
||||
+ (void)usereventMySub:(HttpRequestHelperCompletion)complection
|
||||
page:(NSNumber *)page
|
||||
pageSize:(NSNumber *)pageSize
|
||||
uid:(NSString *)uid {
|
||||
[self makeRequest:@"userevent/mySub"
|
||||
method:HttpRequestHelperMethodGET
|
||||
completion:complection, __FUNCTION__, page, pageSize, uid, nil];
|
||||
}
|
||||
|
||||
@end
|
40
YuMi/Modules/YMNewHome/Model/EventItemModel.h
Normal file
40
YuMi/Modules/YMNewHome/Model/EventItemModel.h
Normal file
@@ -0,0 +1,40 @@
|
||||
//
|
||||
// EventItemModel.h
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/15.
|
||||
//
|
||||
|
||||
#import "PIBaseModel.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface EventItemModel : PIBaseModel
|
||||
|
||||
@property (nonatomic, strong) NSString *eventTopic; // 事件主题
|
||||
@property (nonatomic, assign) NSTimeInterval updateTime; // 更新时间戳
|
||||
@property (nonatomic, assign) NSInteger offectTimes; // 未知字段
|
||||
@property (nonatomic, assign) NSInteger shareNum; // 分享次数
|
||||
@property (nonatomic, assign) NSInteger liveStatus; // 1未开始,2进行中,3-已结束
|
||||
@property (nonatomic, assign) NSInteger eventStatus; // 0-待审核,1-审核通过,2-拒绝,3-删除,4-过期
|
||||
@property (nonatomic, assign) NSInteger eventDuration; // 事件持续时间
|
||||
@property (nonatomic, strong) NSString *roomAvatar; // 房间头像
|
||||
@property (nonatomic, strong) NSString *eventBanner; // 事件横幅
|
||||
@property (nonatomic, assign) NSInteger subNum; // 订阅数量
|
||||
@property (nonatomic, strong) NSString *eventDetail; // 事件详情
|
||||
@property (nonatomic, assign) NSInteger id; // 事件ID
|
||||
@property (nonatomic, assign) NSInteger uid; // 用户ID
|
||||
@property (nonatomic, assign) NSInteger noticeFans; // 通知粉丝
|
||||
@property (nonatomic, assign) NSInteger roomErbanNo; // 房间号
|
||||
@property (nonatomic, strong) NSString *eventStartTimeStr;// 事件开始时间字符串
|
||||
@property (nonatomic, assign) NSTimeInterval eventEndTime;// 事件结束时间戳
|
||||
@property (nonatomic, assign) BOOL subStatus; // 订阅状态
|
||||
@property (nonatomic, assign) NSInteger roomUid; // 房间用户ID
|
||||
@property (nonatomic, assign) NSTimeInterval eventStartTime;// 事件开始时间戳
|
||||
@property (nonatomic, assign) NSTimeInterval createTime; // 创建时间戳
|
||||
|
||||
@property (nonatomic, copy) NSString *gender;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
12
YuMi/Modules/YMNewHome/Model/EventItemModel.m
Normal file
12
YuMi/Modules/YMNewHome/Model/EventItemModel.m
Normal file
@@ -0,0 +1,12 @@
|
||||
//
|
||||
// EventItemModel.m
|
||||
// YuMi
|
||||
//
|
||||
// Created by P on 2025/5/15.
|
||||
//
|
||||
|
||||
#import "EventItemModel.h"
|
||||
|
||||
@implementation EventItemModel
|
||||
|
||||
@end
|
@@ -51,6 +51,8 @@ typedef NS_ENUM(NSUInteger, HomeBannerInfoSkipType) {
|
||||
///跳转的类型
|
||||
@property (nonatomic, assign)HomeBannerInfoSkipType skipType;
|
||||
|
||||
@property (nonatomic, assign) NSInteger activityShow; // = 1 时,为官方活动
|
||||
|
||||
@property(nonatomic, strong) HomeBannerFillVoInfoModel *fillVo;
|
||||
|
||||
@end
|
||||
|
@@ -6,11 +6,30 @@
|
||||
//
|
||||
|
||||
#import "BaseMvpPresenter.h"
|
||||
#import "EventItemModel.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@protocol CreateEventPresenterProcotol <NSObject>
|
||||
@optional
|
||||
- (void)eventSquareListSuccess:(NSArray <EventItemModel *>*)list;
|
||||
- (void)eventSquareListFailure:(NSString *)msg;
|
||||
|
||||
- (void)myCreateEventListSuccess:(NSArray *)list;
|
||||
- (void)myCreateEventListFailure:(NSString *)msg;
|
||||
|
||||
- (void)mySubEventListSuccess:(NSArray *)list;
|
||||
- (void)mySubEventListFailure:(NSString *)msg;
|
||||
|
||||
@end
|
||||
|
||||
@interface CreateEventPresenter : BaseMvpPresenter
|
||||
|
||||
|
||||
- (void)loadEventSquare:(NSInteger)page;
|
||||
- (void)loadMyCreateEvents:(NSInteger)page;
|
||||
- (void)loadMySubEvents:(NSInteger)page;
|
||||
|
||||
- (void)createEventWithTitle:(NSString *)title
|
||||
image:(UIImage *)image
|
||||
uploadToHome:(BOOL)uploadToHome
|
||||
|
@@ -6,20 +6,56 @@
|
||||
//
|
||||
|
||||
#import "CreateEventPresenter.h"
|
||||
#import "CreateEventViewController.h"
|
||||
#import "Api+EventCenter.h"
|
||||
|
||||
@interface CreateEventPresenter()
|
||||
|
||||
@property (nonatomic, weak) CreateEventViewController *view;
|
||||
|
||||
@end
|
||||
|
||||
@implementation CreateEventPresenter
|
||||
// Maybe 用一个方法 + 枚举指来指代一个功能类型的 api call?
|
||||
|
||||
//- (void)attachView:(id)view {
|
||||
// [super attachView:view];
|
||||
// self.view = view;
|
||||
//}
|
||||
- (void)loadEventSquare:(NSInteger)page {
|
||||
[Api usereventSquare:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) {
|
||||
[[self getView] eventSquareListSuccess:[EventItemModel modelsWithArray:data.data]];
|
||||
}
|
||||
} fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) {
|
||||
[[self getView] eventSquareListFailure:msg];
|
||||
}
|
||||
} showLoading:YES errorToast:YES] page:@(page) pageSize:@20];
|
||||
}
|
||||
|
||||
- (void)loadMyCreateEvents:(NSInteger)page {
|
||||
[Api usereventMySquare:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) {
|
||||
[[self getView] myCreateEventListSuccess:@[]];
|
||||
}
|
||||
} fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) {
|
||||
[[self getView] myCreateEventListFailure:msg];
|
||||
}
|
||||
} showLoading:YES errorToast:YES]
|
||||
page:@(page)
|
||||
pageSize:@20
|
||||
uid:[AccountInfoStorage instance].getUid];
|
||||
}
|
||||
|
||||
- (void)loadMySubEvents:(NSInteger)page {
|
||||
[Api usereventMySub:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
if ([[self getView] respondsToSelector:@selector(eventSquareListSuccess:)]) {
|
||||
[[self getView] mySubEventListSuccess:@[]];
|
||||
}
|
||||
} fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
if ([[self getView] respondsToSelector:@selector(eventSquareListFailure:)]) {
|
||||
[[self getView] myCreateEventListFailure:msg];
|
||||
}
|
||||
} showLoading:YES errorToast:YES]
|
||||
page:@(page)
|
||||
pageSize:@20
|
||||
uid:[AccountInfoStorage instance].getUid];
|
||||
}
|
||||
|
||||
- (void)createEventWithTitle:(NSString *)title
|
||||
image:(UIImage *)image
|
||||
@@ -31,32 +67,32 @@
|
||||
notifyFans:(BOOL)notifyFans {
|
||||
// 输入验证
|
||||
if (title.length == 0) {
|
||||
[self.view showError:@"请输入活动标题"];
|
||||
// [[self getView] showError:@"请输入活动标题"];
|
||||
return;
|
||||
}
|
||||
|
||||
if (!image) {
|
||||
[self.view showError:@"请选择活动横幅图片"];
|
||||
// [[self getView] showError:@"请选择活动横幅图片"];
|
||||
return;
|
||||
}
|
||||
|
||||
if (roomId.length == 0) {
|
||||
[self.view showError:@"请选择房间"];
|
||||
// [[self getView] showError:@"请选择房间"];
|
||||
return;
|
||||
}
|
||||
|
||||
if (!startTime) {
|
||||
[self.view showError:@"请选择开始时间"];
|
||||
// [[self getView] showError:@"请选择开始时间"];
|
||||
return;
|
||||
}
|
||||
|
||||
if (duration <= 0) {
|
||||
[self.view showError:@"请选择活动时长"];
|
||||
// [[self getView] showError:@"请选择活动时长"];
|
||||
return;
|
||||
}
|
||||
|
||||
if (content.length == 0) {
|
||||
[self.view showError:@"请输入活动内容"];
|
||||
// [[self getView] showError:@"请输入活动内容"];
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -67,7 +103,7 @@
|
||||
|
||||
// 模拟网络请求成功
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.view showCreateSuccess];
|
||||
// [[self getView] showCreateSuccess];
|
||||
});
|
||||
}
|
||||
|
||||
|
@@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
-(void)checkIpRegionAction;
|
||||
|
||||
- (void)getHomeTopData;
|
||||
- (void)getHomeAllTopsData;
|
||||
//- (void)getHomeAllTopsData;
|
||||
|
||||
- (void)getHomeRanks;
|
||||
@end
|
||||
|
@@ -37,84 +37,90 @@
|
||||
NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data];
|
||||
[banner sendNext:array];
|
||||
[banner sendCompleted];
|
||||
}fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
[banner sendError:nil];
|
||||
[banner sendCompleted];
|
||||
} errorToast:NO] uid:uid type:@"1"];
|
||||
|
||||
[Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
NSArray *list = [PIHomeItemModel modelsWithArray:data.data];
|
||||
[menu sendNext:list];
|
||||
[menu sendCompleted];
|
||||
}fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
[menu sendError:nil];
|
||||
[menu sendCompleted];
|
||||
}]];
|
||||
}
|
||||
|
||||
- (void)getHomeAllTopsData {
|
||||
RACSubject *banner = [RACSubject subject];
|
||||
RACSubject *menu = [RACSubject subject];
|
||||
RACSubject *rank = [RACSubject subject];
|
||||
|
||||
RACSignal *bannerSignal = [banner catch:^RACSignal *(NSError *error) {
|
||||
return [RACSignal return:nil];
|
||||
}];
|
||||
RACSignal *menuSignal = [menu catch:^RACSignal *(NSError *error) {
|
||||
return [RACSignal return:nil];
|
||||
}];
|
||||
|
||||
RACSignal *rankSignal = [rank catch:^RACSignal *(NSError *error) {
|
||||
return [RACSignal return:nil];
|
||||
}];
|
||||
|
||||
RACSignal *combinedSignal = [RACSignal combineLatest:@[bannerSignal, menuSignal, rankSignal]
|
||||
reduce:^id(NSArray* bannerList, NSArray* menuList, NSArray *rankAvatars) {
|
||||
return @[bannerList ?: @[],
|
||||
menuList ?: @[],
|
||||
rankAvatars ?: @[]];
|
||||
}];
|
||||
|
||||
@kWeakify(self);
|
||||
[[combinedSignal deliverOn:RACScheduler.mainThreadScheduler]
|
||||
subscribeNext:^(NSArray *combinedValues) {
|
||||
@kStrongify(self);
|
||||
[[self getView] getHomeTopDataSuccess:[combinedValues xpSafeObjectAtIndex:0]
|
||||
banners:[combinedValues xpSafeObjectAtIndex:1]
|
||||
rankAvatars:[combinedValues xpSafeObjectAtIndex:2]];
|
||||
} error:^(NSError * _Nullable error) {
|
||||
|
||||
}];
|
||||
|
||||
NSString * uid = [AccountInfoStorage instance].getUid;
|
||||
[Api homeBannerList:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data];
|
||||
[banner sendNext:array];
|
||||
[banner sendCompleted];
|
||||
[menu sendNext:@[]];
|
||||
[menu sendCompleted];
|
||||
}fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
[banner sendError:nil];
|
||||
[banner sendCompleted];
|
||||
} errorToast:NO] uid:uid type:@"1"];
|
||||
|
||||
[Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
NSArray *list = [PIHomeItemModel modelsWithArray:data.data];
|
||||
[menu sendNext:list];
|
||||
[menu sendCompleted];
|
||||
}fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
|
||||
[menu sendError:nil];
|
||||
[menu sendCompleted];
|
||||
}]];
|
||||
} errorToast:NO] uid:uid type:@"1"];
|
||||
|
||||
[Api getHomeRanksCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
NSArray *list = [HomeRankAvatarModel modelsWithArray:data.data];
|
||||
[rank sendNext:list];
|
||||
[rank sendCompleted];
|
||||
}fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
[rank sendError:nil];
|
||||
[rank sendCompleted];
|
||||
}]];
|
||||
// [Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
// NSArray *list = [PIHomeItemModel modelsWithArray:data.data];
|
||||
// [menu sendNext:list];
|
||||
// [menu sendCompleted];
|
||||
// }fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
// [menu sendError:nil];
|
||||
// [menu sendCompleted];
|
||||
// }]];
|
||||
}
|
||||
|
||||
//- (void)getHomeAllTopsData {
|
||||
// RACSubject *banner = [RACSubject subject];
|
||||
// RACSubject *menu = [RACSubject subject];
|
||||
// RACSubject *rank = [RACSubject subject];
|
||||
//
|
||||
// RACSignal *bannerSignal = [banner catch:^RACSignal *(NSError *error) {
|
||||
// return [RACSignal return:nil];
|
||||
// }];
|
||||
// RACSignal *menuSignal = [menu catch:^RACSignal *(NSError *error) {
|
||||
// return [RACSignal return:nil];
|
||||
// }];
|
||||
//
|
||||
// RACSignal *rankSignal = [rank catch:^RACSignal *(NSError *error) {
|
||||
// return [RACSignal return:nil];
|
||||
// }];
|
||||
//
|
||||
// RACSignal *combinedSignal = [RACSignal combineLatest:@[bannerSignal, menuSignal, rankSignal]
|
||||
// reduce:^id(NSArray* bannerList, NSArray* menuList, NSArray *rankAvatars) {
|
||||
// return @[bannerList ?: @[],
|
||||
// menuList ?: @[],
|
||||
// rankAvatars ?: @[]];
|
||||
// }];
|
||||
//
|
||||
// @kWeakify(self);
|
||||
// [[combinedSignal deliverOn:RACScheduler.mainThreadScheduler]
|
||||
// subscribeNext:^(NSArray *combinedValues) {
|
||||
// @kStrongify(self);
|
||||
// [[self getView] getHomeTopDataSuccess:[combinedValues xpSafeObjectAtIndex:0]
|
||||
// banners:[combinedValues xpSafeObjectAtIndex:1]
|
||||
// rankAvatars:[combinedValues xpSafeObjectAtIndex:2]];
|
||||
// } error:^(NSError * _Nullable error) {
|
||||
//
|
||||
// }];
|
||||
//
|
||||
// NSString * uid = [AccountInfoStorage instance].getUid;
|
||||
// [Api homeBannerList:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
// NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data];
|
||||
// [banner sendNext:array];
|
||||
// [banner sendCompleted];
|
||||
// }fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
// [banner sendError:nil];
|
||||
// [banner sendCompleted];
|
||||
// } errorToast:NO] uid:uid type:@"1"];
|
||||
//
|
||||
// [Api requestCurrentResourceListCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
// NSArray *list = [PIHomeItemModel modelsWithArray:data.data];
|
||||
// [menu sendNext:list];
|
||||
// [menu sendCompleted];
|
||||
// }fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
// [menu sendError:nil];
|
||||
// [menu sendCompleted];
|
||||
// }]];
|
||||
//
|
||||
// [Api getHomeRanksCompletion:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
// NSArray *list = [HomeRankAvatarModel modelsWithArray:data.data];
|
||||
// [rank sendNext:list];
|
||||
// [rank sendCompleted];
|
||||
// }fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
// [rank sendError:nil];
|
||||
// [rank sendCompleted];
|
||||
// }]];
|
||||
//}
|
||||
|
||||
///得到首页轮播图
|
||||
- (void)getHomeTopBannerList{
|
||||
NSString * uid = [AccountInfoStorage instance].getUid;
|
||||
@@ -122,7 +128,7 @@
|
||||
[Api homeBannerList:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
@kStrongify(self);
|
||||
NSArray * array = [HomeBannerInfoModel modelsWithArray:data.data];
|
||||
[[self getView]getHomeTopBannerListSuccess:array];
|
||||
[[self getView] getHomeTopBannerListSuccess:array];
|
||||
}fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
|
||||
} errorToast:NO] uid:uid type:@"1"];
|
||||
|
9
YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h
Normal file
9
YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.h
Normal file
@@ -0,0 +1,9 @@
|
||||
#import "UIKit/UIKit.h"
|
||||
|
||||
@interface EventCenterEmptyCell : UITableViewCell
|
||||
|
||||
+ (CGFloat)cellHeight;
|
||||
+ (void)registerTo:(UITableView *)tableView;
|
||||
+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath;
|
||||
|
||||
@end
|
48
YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m
Normal file
48
YuMi/Modules/YMNewHome/View/Cell/EventCenterEmptyCell.m
Normal file
@@ -0,0 +1,48 @@
|
||||
#import "EventCenterEmptyCell.h"
|
||||
|
||||
@implementation EventCenterEmptyCell
|
||||
{
|
||||
UILabel *titleLabel;
|
||||
UIImageView *ufoImageView;
|
||||
}
|
||||
|
||||
+ (CGFloat)cellHeight {
|
||||
return 170;
|
||||
}
|
||||
|
||||
+ (void)registerTo:(UITableView *)tableView {
|
||||
[tableView registerClass:[self class]
|
||||
forCellReuseIdentifier:NSStringFromClass([self class])];
|
||||
}
|
||||
|
||||
+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
|
||||
return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath];
|
||||
}
|
||||
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
||||
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
|
||||
|
||||
self.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
self.contentView.backgroundColor = [UIColor whiteColor];
|
||||
|
||||
titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"20.20.59_text_19")
|
||||
font:kFontRegular(14)
|
||||
textColor:UIColorFromRGB(0xafb1b3)];
|
||||
ufoImageView = [[UIImageView alloc] initWithImage:kImage(@"common_empty_UFO")];
|
||||
[self.contentView addSubview:ufoImageView];
|
||||
[self.contentView addSubview:titleLabel];
|
||||
[ufoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerX.mas_equalTo(self.contentView);
|
||||
make.top.mas_equalTo(16);
|
||||
make.size.mas_equalTo(CGSizeMake(110, 110));
|
||||
}];
|
||||
[titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerX.mas_equalTo(self.contentView);
|
||||
make.top.mas_equalTo(ufoImageView.mas_bottom).offset(16);
|
||||
make.height.mas_equalTo(20);
|
||||
}];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
@@ -6,11 +6,17 @@
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "EventItemModel.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface EventCenterEventCell : UITableViewCell
|
||||
|
||||
+ (CGFloat)cellHeight;
|
||||
+ (void)registerTo:(UITableView *)tableView;
|
||||
+ (EventCenterEventCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath;
|
||||
|
||||
- (void)updateCell:(EventItemModel *)model;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
@@ -7,17 +7,238 @@
|
||||
|
||||
#import "EventCenterEventCell.h"
|
||||
|
||||
@interface EventCenterEventCell()
|
||||
|
||||
@property (nonatomic, strong) EventItemModel *model;
|
||||
|
||||
@property (nonatomic, strong) NetImageView *bgImageView;
|
||||
@property (nonatomic, strong) NetImageView *avatarImageView;
|
||||
@property (nonatomic, strong) UILabel *nameLabel;
|
||||
@property (nonatomic, strong) UILabel *idLabel;
|
||||
@property (nonatomic, strong) UILabel *eventDescLabel;
|
||||
@property (nonatomic, strong) UILabel *timeLabel;
|
||||
@property (nonatomic, strong) UILabel *subLabel;
|
||||
|
||||
@property (nonatomic, strong) UIImageView *sexImageView;
|
||||
@property (nonatomic, strong) UIImageView *clockImageView;
|
||||
@property (nonatomic, strong) UIImageView *ringImageView;
|
||||
|
||||
@property (nonatomic, strong) UIButton *statusButton;
|
||||
|
||||
@end
|
||||
|
||||
@implementation EventCenterEventCell
|
||||
|
||||
- (void)awakeFromNib {
|
||||
[super awakeFromNib];
|
||||
// Initialization code
|
||||
+ (CGFloat)cellHeight {
|
||||
return 130;
|
||||
}
|
||||
|
||||
+ (void)registerTo:(UITableView *)tableView {
|
||||
[tableView registerClass:[self class]
|
||||
forCellReuseIdentifier:NSStringFromClass([self class])];
|
||||
}
|
||||
|
||||
+ (EventCenterEventCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
|
||||
return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class])
|
||||
forIndexPath:indexPath];
|
||||
}
|
||||
|
||||
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
|
||||
[super setSelected:selected animated:animated];
|
||||
}
|
||||
|
||||
// Configure the view for the selected state
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
||||
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
|
||||
self.selectionStyle = UITableViewCellSelectionStyleNone;
|
||||
self.separatorInset = UIEdgeInsetsZero;
|
||||
self.contentView.backgroundColor = [UIColor whiteColor];
|
||||
|
||||
[self.contentView addSubview:self.bgImageView];
|
||||
[self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.contentView).inset(12);
|
||||
make.leading.trailing.mas_equalTo(self.contentView).inset(15);
|
||||
make.height.mas_equalTo(118);
|
||||
}];
|
||||
|
||||
UIView *mask_1 = [self blackMask];
|
||||
[self.contentView addSubview:mask_1];
|
||||
[mask_1 mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.edges.mas_equalTo(self.bgImageView);
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.avatarImageView];
|
||||
[self.avatarImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.leading.mas_equalTo(self.bgImageView).offset(12);
|
||||
make.size.mas_equalTo(CGSizeMake(35, 35));
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.nameLabel];
|
||||
[self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.avatarImageView).offset(1);
|
||||
make.leading.mas_equalTo(self.avatarImageView.mas_trailing).offset(6);
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.sexImageView];
|
||||
[self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerY.mas_equalTo(self.nameLabel);
|
||||
make.leading.mas_equalTo(2);
|
||||
make.size.mas_equalTo(CGSizeMake(14, 14));
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.idLabel];
|
||||
[self.idLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.bottom.mas_equalTo(self.avatarImageView).offset(1);
|
||||
make.leading.mas_equalTo(self.nameLabel);
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.eventDescLabel];
|
||||
[self.eventDescLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.leading.trailing.mas_equalTo(self.bgImageView).inset(12);
|
||||
make.centerY.mas_equalTo(self.bgImageView);
|
||||
}];
|
||||
|
||||
UIView *mask_2 = [self blackMask];
|
||||
[self.contentView addSubview:mask_2];
|
||||
[mask_2 mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.bottom.leading.trailing.mas_equalTo(self.bgImageView);
|
||||
make.height.mas_equalTo(32);
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.clockImageView];
|
||||
[self.clockImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerY.mas_equalTo(mask_2);
|
||||
make.leading.mas_equalTo(mask_2).offset(13);
|
||||
make.size.mas_equalTo(CGSizeMake(14, 14));
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.timeLabel];
|
||||
[self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.leading.mas_equalTo(self.clockImageView.mas_trailing).offset(1);
|
||||
make.centerY.mas_equalTo(mask_2);
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.subLabel];
|
||||
[self.subLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.trailing.mas_equalTo(mask_2).offset(-13);
|
||||
make.centerY.mas_equalTo(mask_2);
|
||||
}];
|
||||
|
||||
[self.contentView addSubview:self.ringImageView];
|
||||
[self.ringImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerY.mas_equalTo(mask_2);
|
||||
make.trailing.mas_equalTo(self.subLabel.mas_leading).offset(-1);
|
||||
make.size.mas_equalTo(CGSizeMake(14, 14));
|
||||
}];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)updateCell:(EventItemModel *)model {
|
||||
_model = model;
|
||||
self.bgImageView.imageUrl = model.eventBanner;
|
||||
self.avatarImageView.imageUrl = model.roomAvatar;
|
||||
self.nameLabel.text = @"123";
|
||||
self.idLabel.text = [NSString stringWithFormat:@"ID:%@", @(model.roomErbanNo)];
|
||||
self.eventDescLabel.text = model.eventTopic;
|
||||
self.timeLabel.text = @(model.eventStartTime).stringValue;
|
||||
self.subLabel.text = @(model.subNum).stringValue;
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
- (NetImageView *)bgImageView {
|
||||
if (!_bgImageView) {
|
||||
NetImageConfig *config = [[NetImageConfig alloc] init];
|
||||
config.placeHolder = [UIImageConstant defaultBannerPlaceholder];
|
||||
_bgImageView = [[NetImageView alloc] initWithConfig:config];
|
||||
[_bgImageView setCornerRadius:12];
|
||||
}
|
||||
return _bgImageView;
|
||||
}
|
||||
|
||||
- (NetImageView *)avatarImageView {
|
||||
if (!_avatarImageView) {
|
||||
NetImageConfig *config = [[NetImageConfig alloc] init];
|
||||
config.placeHolder = [UIImageConstant defaultAvatarPlaceholder];
|
||||
_avatarImageView = [[NetImageView alloc] initWithConfig:config];
|
||||
[_avatarImageView setCornerRadius:35/2
|
||||
corners:kCALayerMaxXMaxYCorner | kCALayerMaxXMinYCorner | kCALayerMinXMaxYCorner | kCALayerMinXMinYCorner
|
||||
borderWidth:1
|
||||
borderColor:UIColorFromRGB(0xfffff)];
|
||||
}
|
||||
return _avatarImageView;
|
||||
}
|
||||
|
||||
- (UILabel *)nameLabel {
|
||||
if (!_nameLabel) {
|
||||
_nameLabel = [UILabel labelInitWithText:@""
|
||||
font:kFontRegular(14)
|
||||
textColor:[UIColor whiteColor]];
|
||||
}
|
||||
return _nameLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)idLabel {
|
||||
if (!_idLabel) {
|
||||
_idLabel = [UILabel labelInitWithText:@""
|
||||
font:kFontRegular(12)
|
||||
textColor:[UIColor colorWithWhite:1 alpha:0.6]];
|
||||
}
|
||||
return _idLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)eventDescLabel {
|
||||
if (!_eventDescLabel) {
|
||||
_eventDescLabel = [UILabel labelInitWithText:@""
|
||||
font:kFontMedium(14)
|
||||
textColor:[UIColor colorWithWhite:1 alpha:1]];
|
||||
_eventDescLabel.numberOfLines = 0;
|
||||
}
|
||||
return _eventDescLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)timeLabel {
|
||||
if (!_timeLabel) {
|
||||
_timeLabel = [UILabel labelInitWithText:@""
|
||||
font:kFontRegular(12)
|
||||
textColor:[UIColor colorWithWhite:1 alpha:0.6]];
|
||||
}
|
||||
return _timeLabel;
|
||||
}
|
||||
|
||||
- (UILabel *)subLabel {
|
||||
if (!_subLabel) {
|
||||
_subLabel = [UILabel labelInitWithText:@""
|
||||
font:kFontRegular(12)
|
||||
textColor:[UIColor colorWithWhite:1 alpha:0.6]];
|
||||
}
|
||||
return _subLabel;
|
||||
}
|
||||
|
||||
- (UIImageView *)sexImageView {
|
||||
if (!_sexImageView) {
|
||||
_sexImageView = [UIImageView new];
|
||||
}
|
||||
return _sexImageView;
|
||||
}
|
||||
|
||||
- (UIImageView *)clockImageView {
|
||||
if (!_clockImageView) {
|
||||
_clockImageView = [[UIImageView alloc] initWithImage:kImage(@"event_clock")];
|
||||
}
|
||||
return _clockImageView;
|
||||
}
|
||||
|
||||
- (UIImageView *)ringImageView {
|
||||
if (!_ringImageView) {
|
||||
_ringImageView = [[UIImageView alloc] initWithImage:kImage(@"event_ring")];
|
||||
}
|
||||
return _ringImageView;
|
||||
}
|
||||
|
||||
- (UIView *)blackMask {
|
||||
UIView *v = [[UIView alloc] init];
|
||||
v.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6];
|
||||
return v;
|
||||
}
|
||||
|
||||
@end
|
||||
|
@@ -14,7 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
@property (nonatomic, strong) HomeBannerInfoModel *cellModel;
|
||||
|
||||
// 更新倒计时天数
|
||||
- (void)updateCountdownWithDays:(NSInteger)days;
|
||||
//- (void)updateCountdownWithDays:(NSInteger)days;
|
||||
|
||||
@end
|
||||
|
||||
|
@@ -12,16 +12,16 @@
|
||||
|
||||
@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; // 倒计时定时器
|
||||
//@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
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
[self.contentView addSubview:self.coverImageView];
|
||||
[self.contentView addSubview:self.titleLabel];
|
||||
[self.contentView addSubview:self.countdownView];
|
||||
// [self.contentView addSubview:self.countdownView];
|
||||
|
||||
[self.coverImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.mas_equalTo(self.contentView).offset(6);
|
||||
@@ -49,11 +49,11 @@
|
||||
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);
|
||||
}];
|
||||
// [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;
|
||||
}
|
||||
@@ -62,10 +62,6 @@
|
||||
_cellModel = cellModel;
|
||||
self.coverImageView.imageUrl = cellModel.bannerPic;
|
||||
self.titleLabel.text = cellModel.bannerName;
|
||||
|
||||
// 假设从模型中获取倒计时天数
|
||||
NSInteger days = 30; // 这里应该从cellModel中获取实际的倒计时天数
|
||||
[self updateCountdownWithDays:days];
|
||||
}
|
||||
|
||||
#pragma mark -
|
||||
@@ -86,154 +82,154 @@
|
||||
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;
|
||||
}
|
||||
//- (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;
|
||||
//}
|
||||
|
||||
- (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)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];
|
||||
// [self stopCountdownTimer];
|
||||
}
|
||||
@end
|
||||
|
12
YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h
Normal file
12
YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.h
Normal file
@@ -0,0 +1,12 @@
|
||||
#import "UIKit/UIKit.h"
|
||||
|
||||
typedef NS_ENUM(NSInteger, CreateEventPickerType) {
|
||||
CreateEventPickerTypeDuration = 0,
|
||||
CreateEventPickerTypeStartTime = 1
|
||||
};
|
||||
|
||||
@interface CreateEventPickerContainerView : UIView <UIGestureRecognizerDelegate, UIPickerViewDataSource, UIPickerViewDelegate>
|
||||
@property (nonatomic, assign) CreateEventPickerType pickerType;
|
||||
@property (nonatomic, copy) void (^onConfirmDate)(NSDate *date, NSString *resultString);
|
||||
- (void)showInView:(UIView *)parentView initialDate:(NSDate *)date pickerType:(CreateEventPickerType)type onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm;
|
||||
@end
|
319
YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m
Normal file
319
YuMi/Modules/YMNewHome/View/CreateEventPickerContainerView.m
Normal file
@@ -0,0 +1,319 @@
|
||||
#import "CreateEventPickerContainerView.h"
|
||||
|
||||
@interface CreateEventPickerContainerView () <UIGestureRecognizerDelegate, UIPickerViewDataSource, UIPickerViewDelegate>
|
||||
@property (nonatomic, strong) UIPickerView *pickerView;
|
||||
@property (nonatomic, strong) NSDate *minDate;
|
||||
@property (nonatomic, strong) NSDate *maxDate;
|
||||
@property (nonatomic, strong) NSArray<NSDate *> *dateArray;
|
||||
@property (nonatomic, strong) NSArray<NSString *> *monthArray;
|
||||
@property (nonatomic, strong) NSArray<NSString *> *dayArray;
|
||||
@property (nonatomic, strong) NSArray<NSString *> *hourArray;
|
||||
@property (nonatomic, strong) NSDate *selectedDate;
|
||||
// StartTime 相关
|
||||
@property (nonatomic, strong) NSArray<NSDictionary *> *durationsOptions;
|
||||
@end
|
||||
|
||||
@implementation CreateEventPickerContainerView {
|
||||
UIView *_pickerBg;
|
||||
UILabel *_titleLabel;
|
||||
UIButton *_okButton;
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
[self setupUI];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)setupUI {
|
||||
self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3];
|
||||
|
||||
// 底部白色背景
|
||||
_pickerBg = [[UIView alloc] init];
|
||||
_pickerBg.backgroundColor = [UIColor whiteColor];
|
||||
_pickerBg.layer.cornerRadius = 16;
|
||||
_pickerBg.clipsToBounds = YES;
|
||||
[self addSubview:_pickerBg];
|
||||
|
||||
// 标题
|
||||
_titleLabel = [[UILabel alloc] init];
|
||||
_titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium];
|
||||
_titleLabel.textColor = [UIColor blackColor];
|
||||
_titleLabel.textAlignment = NSTextAlignmentCenter;
|
||||
[_pickerBg addSubview:_titleLabel];
|
||||
|
||||
// OK 按钮
|
||||
_okButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||||
[_okButton setTitle:@"OK" forState:UIControlStateNormal];
|
||||
[_okButton setTitleColor:UIColorFromRGB(0xe29030) forState:UIControlStateNormal];
|
||||
_okButton.titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium];
|
||||
[_okButton addTarget:self action:@selector(okTapped) forControlEvents:UIControlEventTouchUpInside];
|
||||
[_pickerBg addSubview:_okButton];
|
||||
|
||||
// Picker View
|
||||
self.pickerView = [[UIPickerView alloc] init];
|
||||
self.pickerView.dataSource = self;
|
||||
self.pickerView.delegate = self;
|
||||
[_pickerBg addSubview:self.pickerView];
|
||||
|
||||
// 点击背景关闭
|
||||
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss)];
|
||||
[self addGestureRecognizer:tap];
|
||||
tap.delegate = self;
|
||||
|
||||
// 布局
|
||||
[_pickerBg mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.left.right.bottom.equalTo(self);
|
||||
make.height.mas_equalTo(300);
|
||||
}];
|
||||
|
||||
[_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.equalTo(_pickerBg).offset(16);
|
||||
make.centerX.equalTo(_pickerBg);
|
||||
}];
|
||||
|
||||
[_okButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerY.equalTo(_titleLabel);
|
||||
make.right.equalTo(_pickerBg).offset(-16);
|
||||
}];
|
||||
|
||||
[self.pickerView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.top.equalTo(_titleLabel.mas_bottom).offset(8);
|
||||
make.left.right.bottom.equalTo(_pickerBg);
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - UIGestureRecognizerDelegate
|
||||
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
|
||||
if ([touch.view isDescendantOfView:_pickerBg]) {
|
||||
return NO;
|
||||
}
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma mark - Public Methods
|
||||
- (void)buildDurationDataSource {
|
||||
self.durationsOptions = @[
|
||||
@{@"title": @"30分钟", @"minutes": @30},
|
||||
@{@"title": @"1小时", @"minutes": @60},
|
||||
@{@"title": @"2小时", @"minutes": @120},
|
||||
@{@"title": @"3小时", @"minutes": @180},
|
||||
@{@"title": @"4小时", @"minutes": @240},
|
||||
@{@"title": @"6小时", @"minutes": @360},
|
||||
@{@"title": @"12小时", @"minutes": @720},
|
||||
@{@"title": @"1天", @"minutes": @1440},
|
||||
@{@"title": @"2天", @"minutes": @2880},
|
||||
@{@"title": @"3天", @"minutes": @4320}
|
||||
];
|
||||
}
|
||||
|
||||
- (void)buildStartTimeSourceWithInitialDate:(NSDate *)date {
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
NSDate *now = [NSDate date];
|
||||
NSDate *start = [calendar dateByAddingUnit:NSCalendarUnitHour value:1 toDate:now options:0];
|
||||
NSDateComponents *comp = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth fromDate:start];
|
||||
comp.month += 1;
|
||||
NSDate *end = [calendar dateFromComponents:comp];
|
||||
self.minDate = start;
|
||||
self.maxDate = end;
|
||||
NSMutableArray *months = [NSMutableArray array];
|
||||
NSMutableArray *days = [NSMutableArray array];
|
||||
NSMutableArray *hours = [NSMutableArray array];
|
||||
NSDate *iter = start;
|
||||
while ([iter compare:end] == NSOrderedAscending) {
|
||||
NSDateComponents *c = [calendar components:NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour fromDate:iter];
|
||||
NSString *monthStr = [NSString stringWithFormat:@"%02ld", (long)c.month];
|
||||
NSString *dayStr = [NSString stringWithFormat:@"%02ld", (long)c.day];
|
||||
NSString *hourStr = [NSString stringWithFormat:@"%02ld:00", (long)c.hour];
|
||||
if (![months containsObject:monthStr]) [months addObject:monthStr];
|
||||
if (![days containsObject:dayStr]) [days addObject:dayStr];
|
||||
if (![hours containsObject:hourStr]) [hours addObject:hourStr];
|
||||
iter = [calendar dateByAddingUnit:NSCalendarUnitHour value:1 toDate:iter options:0];
|
||||
}
|
||||
self.monthArray = months;
|
||||
self.dayArray = days;
|
||||
self.hourArray = hours;
|
||||
self.selectedDate = start;
|
||||
}
|
||||
|
||||
- (void)showInView:(UIView *)parentView initialDate:(NSDate *)date pickerType:(CreateEventPickerType)type onConfirm:(void (^)(NSDate *date, NSString *resultString))onConfirm{
|
||||
self.pickerType = type;
|
||||
self.onConfirmDate = onConfirm;
|
||||
if (type == CreateEventPickerTypeStartTime) {
|
||||
[self buildStartTimeSourceWithInitialDate:date];
|
||||
_titleLabel.text = @"Start Time";
|
||||
} else if (type == CreateEventPickerTypeDuration) {
|
||||
[self buildDurationDataSource];
|
||||
_titleLabel.text = @"Duration";
|
||||
}
|
||||
self.frame = parentView.bounds;
|
||||
[parentView addSubview:self];
|
||||
self.alpha = 0;
|
||||
[self.pickerView reloadAllComponents];
|
||||
[UIView animateWithDuration:0.25 animations:^{
|
||||
self.alpha = 1;
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - UIPickerViewDataSource & Delegate
|
||||
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
|
||||
switch (self.pickerType) {
|
||||
case CreateEventPickerTypeStartTime:
|
||||
return 3;
|
||||
break;
|
||||
case CreateEventPickerTypeDuration:
|
||||
default:
|
||||
return 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
|
||||
switch (self.pickerType) {
|
||||
case CreateEventPickerTypeStartTime: {
|
||||
if (component == 0) return self.monthArray.count;
|
||||
if (component == 1) return self.dayArray.count;
|
||||
if (component == 2) return self.hourArray.count;
|
||||
}
|
||||
break;
|
||||
case CreateEventPickerTypeDuration:
|
||||
default:
|
||||
return self.durationsOptions.count;
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
|
||||
switch (self.pickerType) {
|
||||
case CreateEventPickerTypeStartTime: {
|
||||
NSInteger monthIdx = [pickerView selectedRowInComponent:0];
|
||||
NSInteger dayIdx = [pickerView selectedRowInComponent:1];
|
||||
NSInteger hourIdx = [pickerView selectedRowInComponent:2];
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
NSDateComponents *nowComp = [calendar components:NSCalendarUnitYear fromDate:[NSDate date]];
|
||||
NSInteger year = nowComp.year;
|
||||
NSInteger month = [self.monthArray[monthIdx] integerValue];
|
||||
NSInteger day = [self.dayArray[dayIdx] integerValue];
|
||||
NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue];
|
||||
NSDateComponents *selComp = [[NSDateComponents alloc] init];
|
||||
selComp.year = year;
|
||||
selComp.month = month;
|
||||
selComp.day = day;
|
||||
selComp.hour = hour;
|
||||
selComp.minute = 0;
|
||||
self.selectedDate = [calendar dateFromComponents:selComp];
|
||||
}
|
||||
break;
|
||||
case CreateEventPickerTypeDuration: {
|
||||
NSInteger minutes = [self.durationsOptions[row][@"minutes"] integerValue];
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
self.selectedDate = [calendar dateByAddingUnit:NSCalendarUnitMinute value:minutes toDate:[NSDate date] options:0];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[pickerView reloadComponent:component];
|
||||
});
|
||||
}
|
||||
|
||||
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {
|
||||
NSInteger selectedRow = [pickerView selectedRowInComponent:component];
|
||||
BOOL isSelectedRow = selectedRow == row;
|
||||
NSString *content = @"";
|
||||
switch (self.pickerType) {
|
||||
case CreateEventPickerTypeStartTime: {
|
||||
if (component == 0) content = self.monthArray[row];
|
||||
if (component == 1) content = self.dayArray[row];
|
||||
if (component == 2) content = self.hourArray[row];
|
||||
}
|
||||
break;
|
||||
case CreateEventPickerTypeDuration:
|
||||
content = self.durationsOptions[row][@"title"];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return [[NSAttributedString alloc] initWithString:content attributes:@{
|
||||
NSFontAttributeName: isSelectedRow ? kFontMedium(15) : kFontRegular(14),
|
||||
NSForegroundColorAttributeName: isSelectedRow ? UIColorFromRGB(0x313131) : UIColorFromRGB(0x7b7b7d)
|
||||
}];
|
||||
}
|
||||
|
||||
//- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
|
||||
// __block UILabel *label = (UILabel *)view;
|
||||
//// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
// if (!label) {
|
||||
// label = [[UILabel alloc] init];
|
||||
// label.textAlignment = NSTextAlignmentCenter;
|
||||
// }
|
||||
//
|
||||
// NSString *content = @"";
|
||||
// switch (self.pickerType) {
|
||||
// case CreateEventPickerTypeStartTime: {
|
||||
// if (component == 0) content = self.monthArray[row];
|
||||
// if (component == 1) content = self.dayArray[row];
|
||||
// if (component == 2) content = self.hourArray[row];
|
||||
// }
|
||||
// break;
|
||||
// case CreateEventPickerTypeDuration:
|
||||
// content = self.durationsOptions[row][@"title"];
|
||||
// break;
|
||||
// default:
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// label.text = content;
|
||||
//
|
||||
// // 设置选中和未选中状态的样式
|
||||
// NSInteger selectedRow = [pickerView selectedRowInComponent:component];
|
||||
// if (row == selectedRow) {
|
||||
// label.textColor = UIColorFromRGB(0x313131);
|
||||
// label.font = kFontMedium(15);
|
||||
// } else {
|
||||
// label.textColor = UIColorFromRGB(0x7b7b7d);
|
||||
// label.font = kFontRegular(14);
|
||||
// }
|
||||
//// });
|
||||
// return label;
|
||||
//}
|
||||
|
||||
#pragma mark - Actions
|
||||
- (void)okTapped {
|
||||
if (self.onConfirmDate) {
|
||||
NSString *resultString = @"";
|
||||
switch (self.pickerType) {
|
||||
case CreateEventPickerTypeStartTime: {
|
||||
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
||||
formatter.dateFormat = @"yyyy-MM-dd-HH:mm";
|
||||
resultString = [formatter stringFromDate:self.selectedDate];
|
||||
}
|
||||
break;
|
||||
case CreateEventPickerTypeDuration: {
|
||||
NSInteger selectedRow = [self.pickerView selectedRowInComponent:0];
|
||||
resultString = self.durationsOptions[selectedRow][@"title"];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
self.onConfirmDate(self.selectedDate, resultString);
|
||||
}
|
||||
[self dismiss];
|
||||
}
|
||||
|
||||
- (void)dismiss {
|
||||
[UIView animateWithDuration:0.25 animations:^{
|
||||
self.alpha = 0;
|
||||
} completion:^(BOOL finished) {
|
||||
[self removeFromSuperview];
|
||||
}];
|
||||
}
|
||||
|
||||
@end
|
@@ -7,7 +7,7 @@
|
||||
|
||||
#import "CreateEventSelectRoomViewController.h"
|
||||
#import "CreateEventPresenter.h"
|
||||
|
||||
#import "EventCenterEmptyCell.h"
|
||||
@interface CreateEventSelectRoomEmptyCell : UITableViewCell
|
||||
|
||||
+ (CGFloat)cellHeight;
|
||||
@@ -159,7 +159,8 @@
|
||||
tableView.separatorInset = UIEdgeInsetsZero;
|
||||
tableView.backgroundColor = [UIColor whiteColor];
|
||||
[CreateEventSelectRoomCell registerTo:tableView];
|
||||
[CreateEventSelectRoomEmptyCell registerTo:tableView];
|
||||
// [CreateEventSelectRoomEmptyCell registerTo:tableView];
|
||||
[EventCenterEmptyCell registerTo:tableView];
|
||||
[self.view addSubview:tableView];
|
||||
}
|
||||
|
||||
@@ -223,7 +224,7 @@
|
||||
switch (indexPath.section) {
|
||||
case 0: {
|
||||
if (self.myRooms.count == 0) {
|
||||
cell = [CreateEventSelectRoomEmptyCell cellFor:tableView atIndexPath:indexPath];
|
||||
cell = [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath];
|
||||
} else {
|
||||
cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath];
|
||||
}
|
||||
@@ -231,7 +232,7 @@
|
||||
break;
|
||||
case 1: {
|
||||
if (self.adminRooms.count == 0) {
|
||||
cell = [CreateEventSelectRoomEmptyCell cellFor:tableView atIndexPath:indexPath];
|
||||
cell = [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath];
|
||||
} else {
|
||||
cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath];
|
||||
}
|
||||
|
@@ -9,14 +9,120 @@
|
||||
|
||||
#import <Masonry/Masonry.h>
|
||||
#import <PhotosUI/PhotosUI.h>
|
||||
#import "CreateEventPickerContainerView.h"
|
||||
#import "CreateEventSelectRoomViewController.h"
|
||||
|
||||
#define MAX_EVENT_TITLE_LENGTH 20
|
||||
#define MAX_EVENT_CONTENT_LENGTH 100
|
||||
|
||||
@interface CreateEventViewControllerV2 () <UITextViewDelegate, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, PHPickerViewControllerDelegate, UIPickerViewDataSource, UIPickerViewDelegate, UIScrollViewDelegate>
|
||||
//@interface CreateEventPickerContainerView : UIView <UIPickerViewDataSource, UIPickerViewDelegate>
|
||||
//@property (nonatomic, copy) void (^onConfirm)(NSInteger hour, NSInteger min);
|
||||
//@property (nonatomic, assign) NSInteger selectedHour;
|
||||
//@property (nonatomic, assign) NSInteger selectedMin;
|
||||
//@property (nonatomic, strong) UIPickerView *pickerView;
|
||||
//- (void)showInView:(UIView *)parentView initialHour:(NSInteger)hour initialMin:(NSInteger)min;
|
||||
//- (void)dismiss;
|
||||
//@end
|
||||
//
|
||||
//@implementation CreateEventPickerContainerView {
|
||||
// UIView *_pickerBg;
|
||||
// UILabel *_titleLabel;
|
||||
// UIButton *_okButton;
|
||||
//}
|
||||
//- (instancetype)init {
|
||||
// self = [super initWithFrame:CGRectZero];
|
||||
// if (self) {
|
||||
// self.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3];
|
||||
// _pickerBg = [[UIView alloc] init];
|
||||
// _pickerBg.backgroundColor = [UIColor whiteColor];
|
||||
// _pickerBg.layer.cornerRadius = 16;
|
||||
// _pickerBg.clipsToBounds = YES;
|
||||
// [self addSubview:_pickerBg];
|
||||
// [_pickerBg mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
// make.left.right.equalTo(self);
|
||||
// make.bottom.equalTo(self.mas_bottom);
|
||||
// make.height.mas_equalTo(300);
|
||||
// }];
|
||||
// _titleLabel = [[UILabel alloc] init];
|
||||
// _titleLabel.text = YMLocalizedString(@"20.20.59_text_16");
|
||||
// _titleLabel.font = kFontMedium(16);
|
||||
// _titleLabel.textAlignment = NSTextAlignmentCenter;
|
||||
// [_pickerBg addSubview:_titleLabel];
|
||||
// [_titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
// make.top.equalTo(_pickerBg.mas_top).offset(16);
|
||||
// make.centerX.equalTo(_pickerBg);
|
||||
// }];
|
||||
// _okButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||
// [_okButton setTitle:@"OK" forState:UIControlStateNormal];
|
||||
// [_okButton setTitleColor:UIColorFromRGB(0xe29030) forState:UIControlStateNormal];
|
||||
// _okButton.titleLabel.font = kFontMedium(16);
|
||||
// [_okButton addTarget:self action:@selector(okTapped) forControlEvents:UIControlEventTouchUpInside];
|
||||
// [_pickerBg addSubview:_okButton];
|
||||
// [_okButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
// make.centerY.equalTo(_titleLabel);
|
||||
// make.trailing.equalTo(_pickerBg.mas_trailing).offset(-20);
|
||||
// }];
|
||||
// self.pickerView = [[UIPickerView alloc] init];
|
||||
// self.pickerView.dataSource = self;
|
||||
// self.pickerView.delegate = self;
|
||||
// [_pickerBg addSubview:self.pickerView];
|
||||
// [self.pickerView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
// make.left.right.bottom.equalTo(_pickerBg);
|
||||
// make.top.equalTo(_titleLabel.mas_bottom).offset(8);
|
||||
// }];
|
||||
// UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss)];
|
||||
// [self addGestureRecognizer:tap];
|
||||
// tap.cancelsTouchesInView = NO;
|
||||
// }
|
||||
// return self;
|
||||
//}
|
||||
//- (void)showInView:(UIView *)parentView initialHour:(NSInteger)hour initialMin:(NSInteger)min {
|
||||
// self.selectedHour = hour;
|
||||
// self.selectedMin = min;
|
||||
// self.frame = parentView.bounds;
|
||||
// [parentView addSubview:self];
|
||||
// self.alpha = 0;
|
||||
// [self.pickerView selectRow:hour inComponent:0 animated:NO];
|
||||
// [self.pickerView selectRow:min/30 inComponent:1 animated:NO];
|
||||
// [UIView animateWithDuration:0.25 animations:^{
|
||||
// self.alpha = 1;
|
||||
// }];
|
||||
//}
|
||||
//- (void)dismiss {
|
||||
// [UIView animateWithDuration:0.25 animations:^{
|
||||
// self.alpha = 0;
|
||||
// } completion:^(BOOL finished) {
|
||||
// [self removeFromSuperview];
|
||||
// }];
|
||||
//}
|
||||
//- (void)okTapped {
|
||||
// if (self.onConfirm) self.onConfirm(self.selectedHour, self.selectedMin);
|
||||
// [self dismiss];
|
||||
//}
|
||||
//// UIPickerViewDataSource
|
||||
//- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 2; }
|
||||
//- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
|
||||
// if (component == 0) return 7;
|
||||
// return 2;
|
||||
//}
|
||||
//// UIPickerViewDelegate
|
||||
|
||||
//- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
|
||||
// if (component == 0) self.selectedHour = row;
|
||||
// else self.selectedMin = row * 30;
|
||||
// [pickerView reloadComponent:component];
|
||||
//}
|
||||
//@end
|
||||
|
||||
@interface CreateEventViewControllerV2 () <UITextViewDelegate, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, PHPickerViewControllerDelegate, UIScrollViewDelegate>
|
||||
|
||||
@property (nonatomic, strong) UIImage *selectedImage;
|
||||
//@property (nonatomic, strong) UIView *durationPickerContainerView;
|
||||
@property (nonatomic, strong) CreateEventPickerContainerView *durationPickerView;
|
||||
@property (nonatomic, strong) UILabel *durationPickerTitleLabel;
|
||||
@property (nonatomic, strong) UIButton *durationPickerOkButton;
|
||||
@property (nonatomic, assign) NSInteger selectedHour;
|
||||
@property (nonatomic, assign) NSInteger selectedMin;
|
||||
|
||||
// 添加私有方法声明
|
||||
- (UIButton *)createUploadBannerButtonWithTitle:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName tag:(NSInteger)tag;
|
||||
@@ -30,8 +136,7 @@
|
||||
- (void)setupDurationPicker;
|
||||
- (void)showDurationPicker;
|
||||
- (void)hideDurationPicker;
|
||||
- (void)durationPickerDoneTapped;
|
||||
- (void)durationPickerCancelTapped;
|
||||
- (void)durationPickerOkTapped;
|
||||
@end
|
||||
|
||||
@implementation CreateEventViewControllerV2
|
||||
@@ -46,7 +151,7 @@ static const CGFloat kSectionSpacing = 20.0;
|
||||
self.title = @"Create Event";
|
||||
|
||||
[self setupUI];
|
||||
[self setupDatePicker]; // 新增:调用日期选择器设置方法
|
||||
// [self setupDatePicker]; // 新增:调用日期选择器设置方法
|
||||
// [self setupDurationPicker]; // 新增:调用时长选择器设置方法
|
||||
[self updateEventTitleCharCount];
|
||||
[self updateEventContentCharCount];
|
||||
@@ -280,24 +385,21 @@ static const CGFloat kSectionSpacing = 20.0;
|
||||
}
|
||||
|
||||
- (void)selectStartTimeTapped {
|
||||
NSLog(@"Select Start Time Tapped");
|
||||
|
||||
|
||||
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
||||
formatter.dateFormat = @"yyyy-MM-dd HH:mm";
|
||||
self.startTimePlaceholderLabel.text = [formatter stringFromDate:[NSDate date]];
|
||||
self.startTimePlaceholderLabel.textColor = [UIColor blackColor];
|
||||
[self checkCreateEventButtonState];
|
||||
CreateEventPickerContainerView *view = [CreateEventPickerContainerView new];
|
||||
__weak typeof(self) weakSelf = self;
|
||||
[view showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeStartTime onConfirm:^(NSDate *date, NSString *resultString) {
|
||||
weakSelf.startTimePlaceholderLabel.text = resultString;
|
||||
[weakSelf checkCreateEventButtonState];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)selectDurationTapped {
|
||||
NSLog(@"Select Duration Tapped");
|
||||
// Placeholder: Show a duration picker
|
||||
// self.durationPlaceholderLabel.text = @"2 hours";
|
||||
// self.durationPlaceholderLabel.textColor = [UIColor blackColor];
|
||||
|
||||
self.datePickerContainerView.hidden = NO;
|
||||
[self checkCreateEventButtonState];
|
||||
CreateEventPickerContainerView *view = [CreateEventPickerContainerView new];
|
||||
__weak typeof(self) weakSelf = self;
|
||||
[view showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeDuration onConfirm:^(NSDate *date, NSString *resultString) {
|
||||
weakSelf.durationPlaceholderLabel.text = resultString;
|
||||
[weakSelf checkCreateEventButtonState];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)createEventButtonTapped {
|
||||
@@ -490,12 +592,21 @@ static const CGFloat kSectionSpacing = 20.0;
|
||||
}
|
||||
|
||||
- (void)showDatePicker {
|
||||
[self.view bringSubviewToFront:self.datePickerContainerView];
|
||||
self.datePickerContainerView.hidden = NO;
|
||||
self.datePickerContainerView.alpha = 0;
|
||||
[UIView animateWithDuration:0.3 animations:^{
|
||||
self.datePickerContainerView.alpha = 1;
|
||||
CreateEventPickerContainerView *picker = [[CreateEventPickerContainerView alloc] init];
|
||||
[picker showInView:self.view initialDate:[NSDate date] pickerType:CreateEventPickerTypeStartTime onConfirm:^(NSDate *date, NSString *resultString) {
|
||||
|
||||
}];
|
||||
|
||||
|
||||
// if (!_datePickerContainerView) {
|
||||
// [self setupDatePicker];
|
||||
// }
|
||||
// [self.view bringSubviewToFront:self.datePickerContainerView];
|
||||
// self.datePickerContainerView.hidden = NO;
|
||||
// self.datePickerContainerView.alpha = 0;
|
||||
// [UIView animateWithDuration:0.3 animations:^{
|
||||
// self.datePickerContainerView.alpha = 1;
|
||||
// }];
|
||||
}
|
||||
|
||||
- (void)hideDatePicker {
|
||||
@@ -542,39 +653,6 @@ static const CGFloat kSectionSpacing = 20.0;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UIPickerViewDataSource
|
||||
|
||||
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
|
||||
if (pickerView == self.durationPicker) {
|
||||
return 2; // Hours and Minutes
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
|
||||
if (pickerView == self.durationPicker) {
|
||||
if (component == 0) { // Hours component
|
||||
return 24; // 1 to 24 hours
|
||||
} else if (component == 1) { // Minutes component
|
||||
return 12; // 0, 5, 10, ..., 55 minutes (12 options)
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#pragma mark - UIPickerViewDelegate
|
||||
|
||||
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
|
||||
if (pickerView == self.durationPicker) {
|
||||
if (component == 0) { // Hours component
|
||||
return [NSString stringWithFormat:@"%ld h", (long)row + 1];
|
||||
} else if (component == 1) { // Minutes component
|
||||
return [NSString stringWithFormat:@"%02ld m", (long)row * 5];
|
||||
}
|
||||
}
|
||||
return nil;
|
||||
}
|
||||
|
||||
#pragma mark - Event Title Section
|
||||
- (void)setupEventTitleSection {
|
||||
self.eventTitleLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_9")];
|
||||
@@ -761,10 +839,10 @@ static const CGFloat kSectionSpacing = 20.0;
|
||||
[self.notifyFansSwitch mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerY.equalTo(self.notifyFansLabel);
|
||||
make.trailing.equalTo(self.contentView).offset(-kHorizontalPadding);
|
||||
make.bottom.equalTo(self.contentView).offset(-kSectionSpacing);
|
||||
make.bottom.equalTo(self.contentView).offset(-kSectionSpacing*5);
|
||||
}];
|
||||
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.bottom.greaterThanOrEqualTo(self.notifyFansSwitch.mas_bottom).offset(20 + 60);
|
||||
make.bottom.greaterThanOrEqualTo(self.notifyFansSwitch.mas_bottom).offset(kSectionSpacing*5);
|
||||
}];
|
||||
}
|
||||
|
||||
@@ -790,4 +868,55 @@ static const CGFloat kSectionSpacing = 20.0;
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Duration Picker Methods
|
||||
|
||||
- (void)setupDurationPicker {
|
||||
if (!self.durationPickerView) {
|
||||
self.durationPickerView = [[CreateEventPickerContainerView alloc] init];
|
||||
}
|
||||
__weak typeof(self) weakSelf = self;
|
||||
[self.durationPickerView showInView:self.view
|
||||
initialDate:[NSDate date]
|
||||
pickerType:CreateEventPickerTypeDuration
|
||||
onConfirm:^(NSDate *date, NSString *resultString) {
|
||||
weakSelf.durationPlaceholderLabel.text = resultString;
|
||||
[weakSelf checkCreateEventButtonState];
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)showDurationPicker {
|
||||
[self setupDurationPicker];
|
||||
[self.view bringSubviewToFront:self.durationPickerView];
|
||||
self.durationPickerView.hidden = NO;
|
||||
self.durationPickerView.alpha = 0;
|
||||
[UIView animateWithDuration:0.25 animations:^{
|
||||
self.durationPickerView.alpha = 1;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)hideDurationPicker {
|
||||
[UIView animateWithDuration:0.25 animations:^{
|
||||
self.durationPickerView.alpha = 0;
|
||||
} completion:^(BOOL finished) {
|
||||
self.durationPickerView.hidden = YES;
|
||||
}];
|
||||
}
|
||||
|
||||
- (void)durationPickerOkTapped {
|
||||
[self hideDurationPicker];
|
||||
// 更新 label
|
||||
NSString *hourStr = [NSString stringWithFormat:@"%ldHours", (long)self.selectedHour];
|
||||
NSString *minStr = [NSString stringWithFormat:@"%ldMins", (long)self.selectedMin];
|
||||
if (self.selectedHour == 0 && self.selectedMin == 0) {
|
||||
self.durationPlaceholderLabel.text = YMLocalizedString(@"XPAnchorPKTableViewCell2");
|
||||
} else if (self.selectedMin == 0) {
|
||||
self.durationPlaceholderLabel.text = hourStr;
|
||||
} else if (self.selectedHour == 0) {
|
||||
self.durationPlaceholderLabel.text = minStr;
|
||||
} else {
|
||||
self.durationPlaceholderLabel.text = [NSString stringWithFormat:@"%@ & %@", hourStr, minStr];
|
||||
}
|
||||
[self checkCreateEventButtonState];
|
||||
}
|
||||
|
||||
@end
|
||||
|
@@ -11,14 +11,14 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
@class PIHomeItemModel;
|
||||
@protocol XPNewHomeHeadViewDelegate <NSObject>
|
||||
///选择
|
||||
-(void)selectItemWithModel:(PIHomeItemModel *)model;
|
||||
-(void)selectItemAtIndexPath:(NSIndexPath *)indexPath;
|
||||
-(void)selectBannerListWithModel:(HomeBannerInfoModel *)model;
|
||||
@end
|
||||
|
||||
|
||||
@interface XPNewHomeHeadView : UIView
|
||||
@property (nonatomic,copy) NSArray<HomeBannerInfoModel *> *bannerList;
|
||||
@property(nonatomic,copy) NSArray *itemList;
|
||||
|
||||
@property (nonatomic,copy) NSArray *rankAvatars;
|
||||
@property(nonatomic,weak) id<XPNewHomeHeadViewDelegate>delegate;
|
||||
@end
|
||||
|
@@ -210,23 +210,6 @@
|
||||
_pi_BannerView.hidden = YES;
|
||||
}
|
||||
}
|
||||
- (void)setItemList:(NSArray *)itemList{
|
||||
_itemList = itemList;
|
||||
self.collectionView.scrollEnabled = _itemList.count > 2;
|
||||
self.collectionView.hidden = _itemList.count == 0;
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.collectionView reloadData];
|
||||
});
|
||||
|
||||
if (_itemList.count == 0){
|
||||
[self.collectionView mas_remakeConstraints:^(MASConstraintMaker *make) {
|
||||
make.leading.mas_equalTo(0);
|
||||
make.trailing.mas_equalTo(0);
|
||||
make.top.mas_equalTo(kGetScaleWidth(0));
|
||||
make.height.mas_equalTo(kGetScaleWidth(0));
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setRankAvatars:(NSArray *)rankAvatars {
|
||||
_rankAvatars = rankAvatars;
|
||||
@@ -234,34 +217,29 @@
|
||||
}
|
||||
|
||||
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
|
||||
return self.itemList.count > 0 ? self.itemList.count : 2;
|
||||
return 2;
|
||||
}
|
||||
|
||||
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
XPNewHomeItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass([XPNewHomeItemCell class]) forIndexPath:indexPath];
|
||||
if(indexPath.row < self.itemList.count){
|
||||
if (indexPath.row == 0) {
|
||||
cell.rankAvatarsModelArray = self.rankAvatars;
|
||||
cell.itemModel = [self.itemList xpSafeObjectAtIndex:indexPath.row];
|
||||
} else {
|
||||
cell.itemModel = [self.itemList xpSafeObjectAtIndex:indexPath.row];
|
||||
}
|
||||
if (indexPath.row == 0) {
|
||||
cell.rankAvatarsModelArray = self.rankAvatars;
|
||||
}
|
||||
[cell setCellWith:indexPath];
|
||||
|
||||
@kWeakify(self);
|
||||
cell.didTapRankArea = ^{
|
||||
@kStrongify(self);
|
||||
PIHomeItemModel *model = [self.itemList xpSafeObjectAtIndex:indexPath.row];
|
||||
if(model != nil && self.delegate && [self.delegate respondsToSelector:@selector(selectItemWithModel:)]){
|
||||
[self.delegate selectItemWithModel:model];
|
||||
if(self.delegate && [self.delegate respondsToSelector:@selector(selectItemAtIndexPath:)]){
|
||||
[self.delegate selectItemAtIndexPath:indexPath];
|
||||
}
|
||||
};
|
||||
|
||||
return cell;
|
||||
}
|
||||
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
|
||||
PIHomeItemModel *model = [self.itemList xpSafeObjectAtIndex:indexPath.row];
|
||||
if(model != nil && self.delegate && [self.delegate respondsToSelector:@selector(selectItemWithModel:)]){
|
||||
[self.delegate selectItemWithModel:model];
|
||||
if(self.delegate && [self.delegate respondsToSelector:@selector(selectItemAtIndexPath:)]){
|
||||
[self.delegate selectItemAtIndexPath:indexPath];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -277,9 +255,7 @@
|
||||
_collectionView.dataSource = self;
|
||||
_collectionView.delegate = self;
|
||||
_collectionView.pagingEnabled = NO;
|
||||
_collectionView.hidden = YES;
|
||||
_collectionView.scrollEnabled = NO;
|
||||
// _collectionView.userInteractionEnabled = NO;
|
||||
_collectionView.backgroundColor = [UIColor clearColor];
|
||||
[_collectionView registerClass:[XPNewHomeItemCell class] forCellWithReuseIdentifier:NSStringFromClass([XPNewHomeItemCell class])];
|
||||
_collectionView.showsVerticalScrollIndicator = NO;
|
||||
|
@@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
@property(nonatomic, strong) PIHomeItemModel *itemModel;
|
||||
@property (nonatomic, copy) NSArray<HomeRankAvatarModel*> *rankAvatarsModelArray;
|
||||
@property (nonatomic, copy) void(^didTapRankArea)(void);
|
||||
- (void)setCellWith:(NSIndexPath *)indexPath;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
@@ -145,6 +145,7 @@
|
||||
@property (nonatomic,strong) NSArray *avatarsList;
|
||||
|
||||
@end
|
||||
|
||||
@implementation XPNewHomeItemCell
|
||||
-(instancetype)initWithFrame:(CGRect)frame{
|
||||
self = [super initWithFrame:frame];
|
||||
@@ -186,6 +187,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setCellWith:(NSIndexPath *)indexPath {
|
||||
if (indexPath.row == 0) {
|
||||
self.bgImageView.image = [UIImage imageNamed:@"home_rank_Heads_bg"];
|
||||
} else {
|
||||
self.bgImageView.image = [UIImage getLanguageImage:@"entrance_activities"];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setRankAvatarsModelArray:(NSArray<HomeRankAvatarModel *> *)rankAvatarsModelArray {
|
||||
// if (![self.itemModel.ID isEqualToString:@"3"]) {
|
||||
// return;
|
||||
|
7
YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h
Normal file
7
YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.h
Normal file
@@ -0,0 +1,7 @@
|
||||
@interface EventCenterEmptyCell : UITableViewCell
|
||||
|
||||
+ (CGFloat)cellHeight;
|
||||
+ (void)registerTo:(UITableView *)tableView;
|
||||
+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath;
|
||||
|
||||
@end
|
44
YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m
Normal file
44
YuMi/Modules/YMNewHome/View/EventCenterEmptyCell.m
Normal file
@@ -0,0 +1,44 @@
|
||||
#import "EventCenterEmptyCell.h"
|
||||
|
||||
@implementation EventCenterEmptyCell
|
||||
{
|
||||
UILabel *titleLabel;
|
||||
UIImageView *ufoImageView;
|
||||
}
|
||||
|
||||
+ (CGFloat)cellHeight {
|
||||
return 170;
|
||||
}
|
||||
|
||||
+ (void)registerTo:(UITableView *)tableView {
|
||||
[tableView registerClass:[self class]
|
||||
forCellReuseIdentifier:NSStringFromClass([self class])];
|
||||
}
|
||||
|
||||
+ (EventCenterEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
|
||||
return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath];
|
||||
}
|
||||
|
||||
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
|
||||
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
|
||||
titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"20.20.59_text_19")
|
||||
font:kFontRegular(14)
|
||||
textColor:UIColorFromRGB(0xafb1b3)];
|
||||
ufoImageView = [[UIImageView alloc] initWithImage:kImage(@"common_empty_UFO")];
|
||||
[self.contentView addSubview:ufoImageView];
|
||||
[self.contentView addSubview:titleLabel];
|
||||
[ufoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerX.mas_equalTo(self.contentView);
|
||||
make.top.mas_equalTo(16);
|
||||
make.size.mas_equalTo(CGSizeMake(110, 110));
|
||||
}];
|
||||
[titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.centerX.mas_equalTo(self.contentView);
|
||||
make.top.mas_equalTo(ufoImageView.mas_bottom).offset(16);
|
||||
make.height.mas_equalTo(20);
|
||||
}];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
@end
|
@@ -9,17 +9,26 @@
|
||||
#import "EventCenterPresenter.h"
|
||||
#import "EventCenterEventCell.h"
|
||||
#import "EventCenterOfficialCell.h"
|
||||
#import "EventCenterEmptyCell.h"
|
||||
#import "CreateEventViewControllerV2.h"
|
||||
#import "HomeBannerInfoModel.h"
|
||||
#import "CreateEventPresenter.h"
|
||||
#import "EventCenterEventCell.h"
|
||||
#import "XPWebViewController.h"
|
||||
#import "XPRoomViewController.h"
|
||||
|
||||
@interface EventCenterViewController () <UIPageViewControllerDataSource, UIPageViewControllerDelegate, UITableViewDelegate, UITableViewDataSource>
|
||||
@interface EventCenterViewController () <UIPageViewControllerDataSource, UIPageViewControllerDelegate, UITableViewDelegate, UITableViewDataSource, CreateEventPresenterProcotol>
|
||||
|
||||
@property (nonatomic, strong) NSMutableArray *officialDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray *eventSquareDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray *myEventDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray <HomeBannerInfoModel *>*officialDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray <EventItemModel *>*eventSquareDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray *myCreateEventDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray *mySubEventDatasource;
|
||||
|
||||
@property (nonatomic, strong) UITableView *officialTableView;
|
||||
@property (nonatomic, strong) UITableView *myEventTableView;
|
||||
@property (nonatomic, strong) UITableView *eventSquareTableView;
|
||||
@property (nonatomic, assign) NSInteger myEventTableViewPage;
|
||||
@property (nonatomic, assign) NSInteger eventSquareTableViewPage;
|
||||
|
||||
@property (nonatomic, strong) UIView *tabView;
|
||||
@property (nonatomic, strong) UIImageView *indicatorImageView;
|
||||
@@ -36,8 +45,8 @@
|
||||
|
||||
@implementation EventCenterViewController
|
||||
|
||||
- (__kindof id)presenter {
|
||||
return [[EventCenterPresenter alloc] init];
|
||||
- (CreateEventPresenter *)createPresenter {
|
||||
return [[CreateEventPresenter alloc] init];
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
@@ -100,6 +109,9 @@
|
||||
}
|
||||
|
||||
- (void)setupPageViewController {
|
||||
self.myEventTableViewPage = 1;
|
||||
self.eventSquareTableViewPage = 1;
|
||||
|
||||
// 创建内容页面控制器
|
||||
NSMutableArray *viewControllers = [NSMutableArray array];
|
||||
|
||||
@@ -152,6 +164,18 @@
|
||||
#pragma mark - Setup Data
|
||||
- (void)setOfficialEventModels:(NSArray<HomeBannerInfoModel *> *)officialEventModels {
|
||||
_officialDatasource = officialEventModels.mutableCopy;
|
||||
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"activityShow == %@", @(1)];
|
||||
// [_officialDatasource filterUsingPredicate:predicate];
|
||||
|
||||
// 处理空数据状态
|
||||
if (_officialDatasource.count == 0) {
|
||||
self.officialTableView.mj_header.hidden = YES;
|
||||
self.officialTableView.mj_footer.hidden = YES;
|
||||
} else {
|
||||
self.officialTableView.mj_header.hidden = NO;
|
||||
self.officialTableView.mj_footer.hidden = NO;
|
||||
}
|
||||
|
||||
[self.officialTableView reloadData];
|
||||
}
|
||||
|
||||
@@ -205,31 +229,47 @@
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||||
if (tableView == self.officialTableView) {
|
||||
return self.officialDatasource.count > 0 ? self.officialDatasource.count : 0;
|
||||
return self.officialDatasource.count > 0 ? self.officialDatasource.count : 1;
|
||||
} else if (tableView == self.eventSquareTableView) {
|
||||
return self.eventSquareDatasource.count > 0 ? self.eventSquareDatasource.count : 0;
|
||||
return self.eventSquareDatasource.count > 0 ? self.eventSquareDatasource.count : 1;
|
||||
} else {
|
||||
return self.myEventDatasource.count > 0 ? self.myEventDatasource.count : 0;
|
||||
switch (section) {
|
||||
case 0:
|
||||
return self.myCreateEventDatasource.count > 0 ? self.myCreateEventDatasource.count : 1;
|
||||
break;
|
||||
case 1:
|
||||
return self.mySubEventDatasource.count > 0 ? self.mySubEventDatasource.count : 1;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
if (tableView == self.officialTableView) {
|
||||
EventCenterOfficialCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterOfficialCell class])];
|
||||
if (self.officialDatasource.count == 0) {
|
||||
return [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath];
|
||||
}
|
||||
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])];
|
||||
if ((tableView == self.eventSquareTableView && self.eventSquareDatasource.count == 0) ||
|
||||
(tableView == self.myEventTableView && self.myCreateEventDatasource.count == 0)) {
|
||||
return [EventCenterEmptyCell cellFor:tableView atIndexPath:indexPath];
|
||||
}
|
||||
EventCenterEventCell *cell = [EventCenterEventCell cellFor:tableView atIndexPath:indexPath];
|
||||
if (tableView == self.eventSquareTableView) {
|
||||
EventItemModel *model = [self.eventSquareDatasource xpSafeObjectAtIndex:indexPath.row];
|
||||
[cell updateCell:model];
|
||||
}
|
||||
// 配置活动广场和我的活动cell
|
||||
if ((tableView == self.eventSquareTableView && self.eventSquareDatasource.count > indexPath.row) ||
|
||||
(tableView == self.myEventTableView && self.myEventDatasource.count > indexPath.row)) {
|
||||
(tableView == self.myEventTableView && self.myCreateEventDatasource.count > indexPath.row)) {
|
||||
// cell.model = tableView == self.eventSquareTableView ? self.eventSquareDatasource[indexPath.row] : self.myEventDatasource[indexPath.row];
|
||||
}
|
||||
return cell;
|
||||
@@ -239,21 +279,79 @@
|
||||
#pragma mark - UITableViewDelegate
|
||||
|
||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
return 150;
|
||||
if (tableView == self.officialTableView) {
|
||||
return self.officialDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 120;
|
||||
}
|
||||
|
||||
if (tableView == self.eventSquareTableView) {
|
||||
return self.eventSquareDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150;
|
||||
}
|
||||
|
||||
if (tableView == self.myEventTableView) {
|
||||
switch (indexPath.section) {
|
||||
case 0:
|
||||
return self.myCreateEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150;
|
||||
break;
|
||||
case 1:
|
||||
return self.mySubEventDatasource.count == 0 ? [EventCenterEmptyCell cellHeight] : 150;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
- (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) {
|
||||
if (tableView == self.officialTableView) {
|
||||
HomeBannerInfoModel *model = [self.officialDatasource xpSafeObjectAtIndex:indexPath.row];
|
||||
if (model) {
|
||||
switch (model.skipType) {
|
||||
case HomeBannerInfoSkipType_Room:
|
||||
{
|
||||
if (model.skipUri.length > 0) {
|
||||
[XPRoomViewController openRoom:model.skipUri viewController:self];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HomeBannerInfoSkipType_Web:
|
||||
case HomeBannerInfoSkipType_Web_CP:
|
||||
case HomeBannerInfoSkipType_Web_Custom:
|
||||
case HomeBannerInfoSkipType_Web_WeekStar:
|
||||
{
|
||||
XPWebViewController *vc = [[XPWebViewController alloc]initWithRoomUID:nil];
|
||||
vc.url = model.skipUri;
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
}
|
||||
break;
|
||||
case HomeBannerInfoSkipType_APP:
|
||||
case HomeBannerInfoSkipType_None:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (tableView == self.eventSquareTableView) {
|
||||
EventItemModel *model = [self.eventSquareDatasource xpSafeObjectAtIndex:indexPath.row];
|
||||
if (model) {
|
||||
[self toEventDetail:model.id];
|
||||
}
|
||||
} else if (tableView == self.myEventTableView && self.myCreateEventDatasource.count > indexPath.row) {
|
||||
// 处理我的活动点击
|
||||
}
|
||||
}
|
||||
|
||||
- (void)toEventDetail:(NSInteger)eventId {
|
||||
XPWebViewController * webVC = [[XPWebViewController alloc] initWithRoomUID:nil];
|
||||
webVC.url = [NSString stringWithFormat:@"%@%@",
|
||||
URLWithType(kEventDetailPath),
|
||||
@(eventId)];
|
||||
[self.navigationController pushViewController:webVC animated:YES];
|
||||
}
|
||||
|
||||
#pragma mark - UIPageViewControllerDataSource
|
||||
|
||||
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
|
||||
@@ -276,9 +374,65 @@
|
||||
NSInteger index = [self.contentViewControllers indexOfObject:pageViewController.viewControllers.firstObject];
|
||||
if (index != NSNotFound) {
|
||||
[self switchToIndex:index animated:YES];
|
||||
|
||||
// 首次切换到活动广场,加载数据
|
||||
if (index == 1 && self.eventSquareDatasource.count == 0) {
|
||||
[self.presenter loadEventSquare:self.eventSquareTableViewPage];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - CreateEventPresenterProcotol
|
||||
|
||||
- (void)eventSquareListSuccess:(NSArray <EventItemModel *>*)list {
|
||||
if (self.eventSquareTableViewPage == 1) {
|
||||
[self.eventSquareDatasource removeAllObjects];
|
||||
}
|
||||
if (list.count > 0) {
|
||||
[self.eventSquareDatasource addObjectsFromArray:list];
|
||||
self.eventSquareTableViewPage++;
|
||||
self.eventSquareTableView.mj_footer.hidden = NO;
|
||||
} else {
|
||||
if (self.eventSquareTableViewPage == 1) {
|
||||
self.eventSquareTableView.mj_footer.hidden = YES;
|
||||
} else {
|
||||
// 没有更多数据了
|
||||
[self.eventSquareTableView.mj_footer endRefreshingWithNoMoreData];
|
||||
}
|
||||
}
|
||||
[self.eventSquareTableView reloadData];
|
||||
[self.eventSquareTableView.mj_header endRefreshing];
|
||||
|
||||
if (list.count < 20) {
|
||||
[self.eventSquareTableView.mj_footer endRefreshingWithNoMoreData];
|
||||
} else {
|
||||
[self.eventSquareTableView.mj_footer endRefreshing];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)eventSquareListFailure:(NSString *)errorMsg {
|
||||
[self.eventSquareTableView.mj_header endRefreshing];
|
||||
[self.eventSquareTableView.mj_footer setHidden:YES];
|
||||
}
|
||||
|
||||
- (void)myCreateEventListSuccess:(NSArray *)list {
|
||||
|
||||
}
|
||||
|
||||
- (void)myCreateEventListFailure:(NSString *)msg {
|
||||
[self.eventSquareTableView.mj_header endRefreshing];
|
||||
[self.eventSquareTableView.mj_footer setHidden:YES];
|
||||
}
|
||||
|
||||
- (void)mySubEventListSuccess:(NSArray *)list {
|
||||
|
||||
}
|
||||
|
||||
- (void)mySubEventListFailure:(NSString *)msg {
|
||||
[self.eventSquareTableView.mj_header endRefreshing];
|
||||
[self.eventSquareTableView.mj_footer setHidden:YES];
|
||||
}
|
||||
|
||||
#pragma mark - Lazy Loading
|
||||
|
||||
- (UITableView *)officialTableView {
|
||||
@@ -292,6 +446,8 @@
|
||||
_officialTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||||
}
|
||||
[_officialTableView registerClass:[EventCenterOfficialCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterOfficialCell class])];
|
||||
[EventCenterEmptyCell registerTo:_officialTableView];
|
||||
|
||||
_officialTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
|
||||
// 下拉刷新
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
@@ -319,17 +475,18 @@
|
||||
_eventSquareTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||||
}
|
||||
[_eventSquareTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])];
|
||||
[EventCenterEmptyCell registerTo:_eventSquareTableView];
|
||||
[EventCenterEventCell registerTo:_eventSquareTableView];
|
||||
|
||||
__weak typeof(self) weakSelf = self;
|
||||
_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];
|
||||
});
|
||||
// 下拉刷新,重置页码
|
||||
weakSelf.eventSquareTableViewPage = 1;
|
||||
[(CreateEventPresenter *)weakSelf.presenter loadEventSquare:weakSelf.eventSquareTableViewPage];
|
||||
}];
|
||||
_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];
|
||||
});
|
||||
[(CreateEventPresenter *)weakSelf.presenter loadEventSquare:weakSelf.eventSquareTableViewPage];
|
||||
}];
|
||||
}
|
||||
return _eventSquareTableView;
|
||||
@@ -346,10 +503,16 @@
|
||||
_myEventTableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
|
||||
}
|
||||
[_myEventTableView registerClass:[EventCenterEventCell class] forCellReuseIdentifier:NSStringFromClass([EventCenterEventCell class])];
|
||||
[EventCenterEmptyCell registerTo:_myEventTableView];
|
||||
[EventCenterEventCell registerTo:_myEventTableView];
|
||||
|
||||
_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];
|
||||
if (self.myCreateEventDatasource.count == 0) {
|
||||
self.myEventTableView.mj_footer.hidden = YES;
|
||||
}
|
||||
});
|
||||
}];
|
||||
_myEventTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
|
||||
@@ -376,4 +539,11 @@
|
||||
return _createButton;
|
||||
}
|
||||
|
||||
- (NSMutableArray <EventItemModel *>*)eventSquareDatasource {
|
||||
if (!_eventSquareDatasource) {
|
||||
_eventSquareDatasource = [NSMutableArray array];
|
||||
}
|
||||
return _eventSquareDatasource;
|
||||
}
|
||||
|
||||
@end
|
||||
|
@@ -604,12 +604,8 @@ XPHomeRecommendOtherRoomViewDelegate>
|
||||
|
||||
#pragma mark - JXCategoryViewDelegate
|
||||
- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView {
|
||||
if (self.headView.itemList.count == 0 && self.headView.bannerList.count == 0){
|
||||
return 0;
|
||||
}else if (self.headView.itemList.count > 0 && self.headView.bannerList.count == 0){
|
||||
if (self.headView.bannerList.count == 0){
|
||||
return kGetScaleWidth(80);
|
||||
}else if (self.headView.itemList.count == 0 && self.headView.bannerList.count > 0){
|
||||
return kGetScaleWidth(90);
|
||||
}
|
||||
return kGetScaleWidth(170);
|
||||
}
|
||||
@@ -686,7 +682,6 @@ XPHomeRecommendOtherRoomViewDelegate>
|
||||
}
|
||||
#pragma mark - XPHomeContainerProtocol
|
||||
- (void)getHomeTopDataSuccess:(NSArray*)list menuList:(NSArray *)memuList{
|
||||
self.headView.itemList = memuList;
|
||||
self.headView.bannerList = list;
|
||||
self.bannerInfoList = list;
|
||||
[self.pagingView reloadData];
|
||||
@@ -696,7 +691,6 @@ XPHomeRecommendOtherRoomViewDelegate>
|
||||
- (void)getHomeTopDataSuccess:(NSArray *)resourceList
|
||||
banners:(NSArray *)banners
|
||||
rankAvatars:(NSArray *)rankAvatars {
|
||||
self.headView.itemList = resourceList;
|
||||
self.headView.bannerList = banners;
|
||||
self.headView.rankAvatars = rankAvatars;
|
||||
[self.pagingView reloadData];
|
||||
@@ -792,18 +786,37 @@ XPHomeRecommendOtherRoomViewDelegate>
|
||||
}
|
||||
}
|
||||
///选择
|
||||
-(void)selectItemWithModel:(PIHomeItemModel *)model{
|
||||
switch (model.resourceType) {
|
||||
case HomeMenuResourceType_H5: {
|
||||
XPWebViewController * webVC = [[ XPWebViewController alloc] initWithRoomUID:nil];
|
||||
webVC.url = model.resourceContent;
|
||||
- (void)selectItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
switch (indexPath.row) {
|
||||
case 0: {
|
||||
XPWebViewController * webVC =[[XPWebViewController alloc] initWithRoomUID:nil];
|
||||
webVC.url = URLWithType(kHomeRankURL);
|
||||
[self.navigationController pushViewController:webVC animated:YES];
|
||||
}
|
||||
break;
|
||||
case HomeMenuResourceType_Match:
|
||||
[self.presenter homeChatPick];
|
||||
case 1: {
|
||||
EventCenterViewController *vc = [[EventCenterViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
vc.officialEventModels = self.headView.bannerList;
|
||||
}
|
||||
break;
|
||||
case HomeMenuResourceType_Room_Game: {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//-(void)selectItemWithModel:(PIHomeItemModel *)model{
|
||||
// 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);
|
||||
@@ -823,16 +836,17 @@ XPHomeRecommendOtherRoomViewDelegate>
|
||||
// [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;
|
||||
}
|
||||
}
|
||||
// }
|
||||
// default:
|
||||
// {
|
||||
// EventCenterViewController *vc = [[EventCenterViewController alloc] init];
|
||||
// [self.navigationController pushViewController:vc animated:YES];
|
||||
// vc.officialEventModels = self.headView.bannerList;
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
//}
|
||||
|
||||
-(void)selectBannerListWithModel:(HomeBannerInfoModel *)model{
|
||||
[self handleTapBannerItem:model];
|
||||
}
|
||||
|
@@ -332,8 +332,13 @@
|
||||
// 创建 GCD 定时器
|
||||
self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
|
||||
|
||||
// 设置定时器时间间隔:每 0.3 秒执行一次
|
||||
//#if DEBUG
|
||||
// dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC);
|
||||
//#else
|
||||
// 设置定时器时间间隔:每 0.25 秒执行一次
|
||||
dispatch_source_set_timer(self.timer, DISPATCH_TIME_NOW, 0.25 * NSEC_PER_SEC, 0.01 * NSEC_PER_SEC);
|
||||
//#endif
|
||||
|
||||
|
||||
// 定时器触发的事件处理
|
||||
dispatch_source_set_event_handler(self.timer, ^{
|
||||
@@ -502,15 +507,20 @@
|
||||
@"Price": @(receive.gift.goldPrice * receive.giftNum * array.count),
|
||||
@"isFromWinning":@(NO)}];
|
||||
} else {
|
||||
if (code > 500) {
|
||||
self.errorMessage = @"Over Heat!";
|
||||
if (code >= 500 && code < 600) {
|
||||
NSLog(@" ----------------------------------------------------------- error here");
|
||||
#if DEBUG
|
||||
self.errorMessage = [NSString stringWithFormat:@"Over Heat! - %@ ", msg];
|
||||
#else
|
||||
self.errorMessage = @"Over Heat & try later";
|
||||
#endif
|
||||
} else {
|
||||
self.errorMessage = msg;
|
||||
[self forceRemove];
|
||||
}
|
||||
if (self.actionCallback) {
|
||||
self.actionCallback(ComboAction_Error);
|
||||
}
|
||||
// [self forceRemove];
|
||||
}
|
||||
}
|
||||
targetUids:allUIDs
|
||||
|
@@ -28,6 +28,8 @@
|
||||
|
||||
@property(nonatomic, strong) UIImpactFeedbackGenerator *feedbackGenerator;
|
||||
|
||||
@property (nonatomic, strong) NSTimer *longPressTimer;
|
||||
|
||||
//@property (nonatomic, strong) dispatch_queue_t animationQueue; // 串行队列,确保线程安全
|
||||
|
||||
|
||||
@@ -44,6 +46,8 @@
|
||||
[self.playImageView clear];
|
||||
self.playImageView.delegate = nil;
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
[self.longPressTimer invalidate];
|
||||
self.longPressTimer = nil;
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
@@ -214,7 +218,9 @@
|
||||
// NSLog(@"点击间隔过短,忽略此次点击");
|
||||
return;
|
||||
}
|
||||
#if RELEASE
|
||||
isHandlingTap = YES;
|
||||
#endif
|
||||
[self.feedbackGenerator impactOccurred];
|
||||
|
||||
[[GiftComboManager sharedManager] sendGift];
|
||||
@@ -432,8 +438,8 @@
|
||||
duration:5];
|
||||
_countdownRingView.userInteractionEnabled = YES;
|
||||
//#if DEBUG
|
||||
// UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)];
|
||||
// longPress.minimumPressDuration = 0.2;
|
||||
// UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
|
||||
// longPress.minimumPressDuration = 0.1;
|
||||
// [_countdownRingView addGestureRecognizer:longPress];
|
||||
//#else
|
||||
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap)];
|
||||
@@ -443,4 +449,23 @@
|
||||
return _countdownRingView;
|
||||
}
|
||||
|
||||
- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
|
||||
if (gesture.state == UIGestureRecognizerStateBegan) {
|
||||
// 开始长按时创建定时器
|
||||
[self.longPressTimer invalidate];
|
||||
self.longPressTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
|
||||
target:self
|
||||
selector:@selector(handleTap)
|
||||
userInfo:nil
|
||||
repeats:YES];
|
||||
[self handleTap];
|
||||
} else if (gesture.state == UIGestureRecognizerStateEnded ||
|
||||
gesture.state == UIGestureRecognizerStateCancelled ||
|
||||
gesture.state == UIGestureRecognizerStateFailed) {
|
||||
// 长按结束时销毁定时器
|
||||
[self.longPressTimer invalidate];
|
||||
self.longPressTimer = nil;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
@@ -206,7 +206,6 @@ UIKIT_EXTERN NSString * kShowFirstRechargeView;
|
||||
if (![NSString isEmpty:message]) {
|
||||
[self showErrorToast:message];
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case ComboAction_Update_After_Send_Success: {
|
||||
|
Reference in New Issue
Block a user