827 lines
36 KiB
Objective-C
827 lines
36 KiB
Objective-C
//
|
||
// CreateEventViewControllerV2.m
|
||
// YuMi
|
||
//
|
||
// Created by P on 2025/5/9.
|
||
//
|
||
|
||
#import "CreateEventViewControllerV2.h"
|
||
|
||
#import <Masonry/Masonry.h>
|
||
#import <PhotosUI/PhotosUI.h>
|
||
#import <TZImagePickerController/TZImagePickerController.h>
|
||
|
||
#import "UploadFile.h"
|
||
#import "CreateEventPresenter.h"
|
||
#import "CreateEventPickerContainerView.h"
|
||
#import "CreateEventSelectRoomViewController.h"
|
||
#import "UIImage+Utils.h"
|
||
#import "XPIAPRechargeViewController.h"
|
||
|
||
#define MAX_EVENT_TITLE_LENGTH 50
|
||
#define MAX_EVENT_CONTENT_LENGTH 1000
|
||
@interface CreateEventViewControllerV2 () <UITextViewDelegate, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, PHPickerViewControllerDelegate, UIScrollViewDelegate, CreateEventPresenterProcotol, TZImagePickerControllerDelegate>
|
||
|
||
@property (nonatomic, strong) EventConfigModel *configModel;
|
||
@property (nonatomic, strong) EventRoomModel *selectRoomModel;
|
||
@property (nonatomic, strong) WalletInfoModel *walletInfoModel;
|
||
|
||
@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;
|
||
@property (nonatomic, assign) NSInteger durationMinutes;
|
||
|
||
|
||
// 添加私有方法声明
|
||
- (UIButton *)createUploadBannerButtonWithTitle:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName tag:(NSInteger)tag;
|
||
|
||
@end
|
||
|
||
@implementation CreateEventViewControllerV2
|
||
|
||
static const CGFloat kHorizontalPadding = 16.0;
|
||
static const CGFloat kVerticalPadding = 10.0;
|
||
static const CGFloat kSectionSpacing = 20.0;
|
||
|
||
- (CreateEventPresenter *)createPresenter {
|
||
return [CreateEventPresenter new];
|
||
}
|
||
|
||
- (void)viewDidLoad {
|
||
[super viewDidLoad];
|
||
self.view.backgroundColor = [UIColor whiteColor];
|
||
self.title = YMLocalizedString(@"20.20.59_text_8");
|
||
|
||
[self setupUI];
|
||
[self updateEventTitleCharCount];
|
||
[self updateEventContentCharCount];
|
||
|
||
// 键盘通知
|
||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
|
||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
|
||
|
||
// 点击空白收起键盘
|
||
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
|
||
tap.cancelsTouchesInView = NO;
|
||
[self.view addGestureRecognizer:tap];
|
||
|
||
// 设置 scrollView delegate
|
||
self.scrollView.delegate = self;
|
||
|
||
[self.presenter loadConfig];
|
||
}
|
||
|
||
- (void)dealloc {
|
||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||
}
|
||
|
||
- (void)keyboardWillShow:(NSNotification *)notification {
|
||
NSDictionary *userInfo = notification.userInfo;
|
||
CGRect keyboardFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
|
||
CGFloat keyboardHeight = keyboardFrame.size.height;
|
||
UIEdgeInsets insets = self.scrollView.contentInset;
|
||
insets.bottom = keyboardHeight + 20;
|
||
self.scrollView.contentInset = insets;
|
||
self.scrollView.scrollIndicatorInsets = insets;
|
||
}
|
||
|
||
- (void)keyboardWillHide:(NSNotification *)notification {
|
||
UIEdgeInsets insets = self.scrollView.contentInset;
|
||
insets.bottom = 0;
|
||
self.scrollView.contentInset = insets;
|
||
self.scrollView.scrollIndicatorInsets = insets;
|
||
}
|
||
|
||
- (void)dismissKeyboard {
|
||
[self.view endEditing:YES];
|
||
}
|
||
|
||
- (void)backButtonTapped {
|
||
[self.navigationController popViewControllerAnimated:YES];
|
||
}
|
||
|
||
- (void)setupUI {
|
||
// ScrollView and ContentView
|
||
self.scrollView = [[UIScrollView alloc] init];
|
||
[self.view addSubview:self.scrollView];
|
||
|
||
self.contentView = [[UIView alloc] init];
|
||
[self.scrollView addSubview:self.contentView];
|
||
|
||
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
|
||
UIVisualEffectView *visualView = [[UIVisualEffectView alloc]initWithEffect:blurEffect];
|
||
[self.view addSubview:visualView];
|
||
|
||
// Create Event Button (fixed at bottom)
|
||
self.createEventButton = [UIButton buttonWithType:UIButtonTypeSystem];
|
||
[self.createEventButton setTitle:YMLocalizedString(@"20.20.59_text_8") forState:UIControlStateNormal];
|
||
[self.createEventButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
||
[self.createEventButton.titleLabel setFont:kFontSemibold(16)];
|
||
[self.createEventButton addGradientBackgroundWithColors:@[
|
||
UIColorFromRGB(0xe29030),
|
||
UIColorFromRGB(0xfcc074),
|
||
] startPoint:CGPointMake(0, 0.5) endPoint:CGPointMake(1, 0.5) cornerRadius:23];
|
||
[self.createEventButton setCornerRadius:23];
|
||
self.createEventButton.userInteractionEnabled = NO;
|
||
self.createEventButton.alpha = 0.3;
|
||
[self.createEventButton addTarget:self action:@selector(createEventButtonTapped) forControlEvents:UIControlEventTouchUpInside];
|
||
[self.view addSubview:self.createEventButton];
|
||
|
||
[self.createEventButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.leading.equalTo(self.view).offset(20);
|
||
make.trailing.equalTo(self.view).offset(-20);
|
||
make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom).offset(-20);
|
||
make.height.mas_equalTo(46);
|
||
}];
|
||
|
||
[visualView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.leading.trailing.bottom.equalTo(self.view);
|
||
make.top.mas_equalTo(self.createEventButton.mas_top).offset(-20);
|
||
}];
|
||
|
||
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop);
|
||
make.bottom.leading.trailing.equalTo(self.view);
|
||
}];
|
||
|
||
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.edges.equalTo(self.scrollView);
|
||
make.width.equalTo(self.scrollView);
|
||
}];
|
||
|
||
[self setupEventTitleSection];
|
||
[self setupEventBannerSection];
|
||
[self setupUploadBannerSection];
|
||
[self setupSelectRoomSection];
|
||
[self setupStartTimeSection];
|
||
[self setupDurationSection];
|
||
[self setupEventContentSection];
|
||
[self setupNotifyMyFansSection];
|
||
}
|
||
|
||
- (void)viewDidLayoutSubviews {
|
||
[super viewDidLayoutSubviews];
|
||
}
|
||
|
||
#pragma mark - CreateEventPresenterProcotol
|
||
- (void)loadCongfigSuccess:(EventConfigModel *)model {
|
||
_configModel = model;
|
||
NSString *moneyString = @(model.goldNum).stringValue;
|
||
NSTextAttachment *icon = [[NSTextAttachment alloc] init];
|
||
icon.bounds = CGRectMake(0, -8, 24, 24);
|
||
icon.image = kImage(@"moli_money_icon");
|
||
NSDictionary *par = @{
|
||
NSFontAttributeName: self.uploadBannerLabel.font,
|
||
NSForegroundColorAttributeName: self.uploadBannerLabel.textColor
|
||
};
|
||
NSAttributedString *firstPart = [[NSAttributedString alloc] initWithString:[NSString stringWithFormat:YMLocalizedString(@"20.20.59_text_11"),
|
||
@(model.goldNum)]
|
||
attributes:par];
|
||
NSAttributedString *iconString = [NSAttributedString attributedStringWithAttachment:icon];
|
||
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithAttributedString:firstPart];
|
||
NSRange r = [string.string rangeOfString:moneyString];
|
||
[string insertAttributedString:iconString atIndex:r.location];
|
||
self.uploadBannerLabel.attributedText = string.copy;
|
||
}
|
||
|
||
- (void)loadCongfigFailure:(NSString *)msg {
|
||
[self.navigationController popViewControllerAnimated:YES];
|
||
}
|
||
|
||
- (void)createEventSuccess {
|
||
[XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"20.20.59_text_34")];
|
||
[self.navigationController popViewControllerAnimated:YES];
|
||
if (self.createSuccess) {
|
||
self.createSuccess();
|
||
}
|
||
}
|
||
|
||
- (void)createEventFailure:(NSString *)msg {
|
||
[XNDJTDDLoadingTool hideHUD];
|
||
}
|
||
|
||
#pragma mark - Helper Methods
|
||
|
||
- (UIButton *)createUploadBannerButtonWithTitle:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName tag:(NSInteger)tag {
|
||
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
[b setImage:kImage(imageName) forState:UIControlStateNormal];
|
||
[b setImage:kImage(selectedImageName) forState:UIControlStateSelected];
|
||
[b setTitle:title forState:UIControlStateNormal];
|
||
[b setTitleColor:UIColorFromRGB(0x313131) forState:UIControlStateNormal];
|
||
[b.titleLabel setFont:kFontMedium(14)];
|
||
[b setTitleEdgeInsets:UIEdgeInsetsMake(0, 8, 0, 0)];
|
||
b.tag = tag;
|
||
return b;
|
||
}
|
||
|
||
- (UILabel *)createLabelWithText:(NSString *)text {
|
||
UILabel *label = [[UILabel alloc] init];
|
||
label.text = text;
|
||
label.font = kFontMedium(14);
|
||
label.textColor = UIColorFromRGB(0x313131);
|
||
return label;
|
||
}
|
||
|
||
- (UITextField *)createTextFieldWithPlaceholder:(NSString *)placeholder {
|
||
UITextField *textField = [[UITextField alloc] init];
|
||
textField.placeholder = placeholder;
|
||
textField.font = kFontRegular(14);
|
||
textField.textColor = UIColorFromRGB(0x313131);
|
||
textField.borderStyle = UITextBorderStyleNone;
|
||
[textField setCornerRadius:8];
|
||
textField.backgroundColor = UIColorFromRGB(0xf2f3f7);
|
||
|
||
// 设置左侧内间距为16
|
||
UIView *leftPaddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 16, textField.frame.size.height)];
|
||
textField.leftView = leftPaddingView;
|
||
textField.leftViewMode = UITextFieldViewModeAlways;
|
||
|
||
// 设置右侧内间距为16
|
||
UIView *rightPaddingView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 16, textField.frame.size.height)];
|
||
textField.rightView = rightPaddingView;
|
||
textField.rightViewMode = UITextFieldViewModeAlways;
|
||
|
||
return textField;
|
||
}
|
||
|
||
- (UILabel *)createCharCountLabel {
|
||
UILabel *label = [[UILabel alloc] init];
|
||
label.font = kFontRegular(12);
|
||
label.textColor = UIColorFromRGB(0x7b7b7d);
|
||
return label;
|
||
}
|
||
|
||
- (UIView *)createSelectionViewWithPlaceholder:(NSString *)placeholder target:(id)target action:(SEL)action {
|
||
UIView *view = [[UIView alloc] init];
|
||
view.backgroundColor = UIColorFromRGB(0xf2f3f7);
|
||
view.layer.cornerRadius = 8;
|
||
|
||
UILabel *label = [[UILabel alloc] init];
|
||
label.text = placeholder;
|
||
label.font = kFontRegular(14);
|
||
label.textColor = UIColorFromRGB(0x7b7b7d);
|
||
[view addSubview:label];
|
||
|
||
UIImageView *arrowImageView = [[UIImageView alloc] initWithImage:[kImage(@"event_arrow") ms_SetImageForRTL]];
|
||
[view addSubview:arrowImageView];
|
||
|
||
[label mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.leading.equalTo(view).offset(10);
|
||
make.centerY.equalTo(view);
|
||
}];
|
||
|
||
[arrowImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.trailing.equalTo(view).offset(-10);
|
||
make.centerY.equalTo(view);
|
||
make.width.height.mas_equalTo(22);
|
||
}];
|
||
|
||
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:target action:action];
|
||
[view addGestureRecognizer:tap];
|
||
view.userInteractionEnabled = YES;
|
||
|
||
if ([placeholder isEqualToString:YMLocalizedString(@"XPAnchorPKTableViewCell2")]) { // Store placeholder label for later update
|
||
if (action == @selector(selectRoomTapped)) self.selectRoomPlaceholderLabel = label;
|
||
else if (action == @selector(selectStartTimeTapped)) self.startTimePlaceholderLabel = label;
|
||
else if (action == @selector(selectDurationTapped)) self.durationPlaceholderLabel = label;
|
||
}
|
||
|
||
return view;
|
||
}
|
||
|
||
- (void)updateEventTitleCharCount {
|
||
NSInteger currentLength = self.eventTitleTextField.text.length;
|
||
self.eventTitleCharCountLabel.text = [NSString stringWithFormat:@"%ld/%d", (long)currentLength, MAX_EVENT_TITLE_LENGTH];
|
||
}
|
||
|
||
- (void)updateEventContentCharCount {
|
||
NSInteger currentLength = self.eventContentTextView.text.length;
|
||
self.eventContentCharCountLabel.text = [NSString stringWithFormat:@"%ld/%d", (long)currentLength, MAX_EVENT_CONTENT_LENGTH];
|
||
}
|
||
|
||
#pragma mark - Actions
|
||
|
||
- (void)eventBannerTapped {
|
||
NSLog(@"Event Banner Tapped");
|
||
if (@available(iOS 14, *)) {
|
||
// 使用TZImagePickerController来选择并裁剪图片
|
||
TZImagePickerController *imagePickerVc = [[TZImagePickerController alloc] initWithMaxImagesCount:1 delegate:self];
|
||
imagePickerVc.allowCrop = YES;
|
||
imagePickerVc.maxImagesCount = 1;
|
||
|
||
// 允许拍照
|
||
imagePickerVc.allowTakePicture = NO;
|
||
imagePickerVc.allowPickingVideo = NO; // 不允许选择视频
|
||
imagePickerVc.showSelectedIndex = YES;
|
||
// 调整裁剪比例为 690:236
|
||
CGFloat aspectRatio = 690.0 / 236.0; // 约为2.92:1
|
||
|
||
// 计算裁剪框宽度,限制在屏幕宽度内
|
||
CGFloat cropWidth = MIN(self.view.frame.size.width - (kHorizontalPadding * 2 - 2), KScreenWidth);
|
||
CGFloat cropHeight = cropWidth / aspectRatio;
|
||
|
||
// 设置裁剪框的尺寸
|
||
imagePickerVc.cropRect = CGRectMake((KScreenWidth-cropWidth)/2, (KScreenHeight - cropHeight) / 2, cropWidth, cropHeight);
|
||
|
||
// 拍照裁剪设置
|
||
// imagePickerVc.needCircleCrop = NO; // 不需要圆形裁剪
|
||
// imagePickerVc.circleCropRadius = 0; // 圆形裁剪半径,不需要设置
|
||
|
||
[self presentViewController:imagePickerVc animated:YES completion:nil];
|
||
} else {
|
||
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
|
||
picker.delegate = self;
|
||
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
|
||
[self presentViewController:picker animated:YES completion:nil];
|
||
}
|
||
}
|
||
|
||
- (void)selectRoomTapped {
|
||
NSLog(@"Select Room Tapped");
|
||
|
||
CreateEventSelectRoomViewController *vc = [[CreateEventSelectRoomViewController alloc] init];
|
||
[self.navigationController pushViewController:vc animated:YES];
|
||
@kWeakify(self);
|
||
[vc setDidSelectedRoom:^(EventRoomModel * _Nonnull roomModel) {
|
||
@kStrongify(self);
|
||
self.selectRoomModel = roomModel;
|
||
self.selectRoomPlaceholderLabel.text = @(roomModel.erbanNo).stringValue;
|
||
self.selectRoomPlaceholderLabel.textColor = [UIColor blackColor];
|
||
[self checkCreateEventButtonState];
|
||
}];
|
||
}
|
||
|
||
- (void)selectStartTimeTapped {
|
||
CreateEventPickerContainerView *view = [CreateEventPickerContainerView new];
|
||
__weak typeof(self) weakSelf = self;
|
||
[view showInView:self.view
|
||
initialDate:[NSDate date]
|
||
config:self.configModel
|
||
pickerType:CreateEventPickerTypeStartTime
|
||
onConfirm:^(NSDate *date,
|
||
NSString *resultString,
|
||
NSInteger dutationMinutes) {
|
||
weakSelf.startTimePlaceholderLabel.text = resultString;
|
||
[weakSelf checkCreateEventButtonState];
|
||
}];
|
||
}
|
||
|
||
- (void)selectDurationTapped {
|
||
CreateEventPickerContainerView *view = [CreateEventPickerContainerView new];
|
||
__weak typeof(self) weakSelf = self;
|
||
[view showInView:self.view
|
||
initialDate:[NSDate date]
|
||
config:self.configModel
|
||
pickerType:CreateEventPickerTypeDuration
|
||
onConfirm:^(NSDate *date,
|
||
NSString *resultString,
|
||
NSInteger dutationMinutes) {
|
||
weakSelf.durationPlaceholderLabel.text = resultString;
|
||
weakSelf.durationMinutes = dutationMinutes;
|
||
[weakSelf checkCreateEventButtonState];
|
||
}];
|
||
}
|
||
|
||
- (void)createEventButtonTapped {
|
||
// Gather all data and proceed with event creation logic
|
||
NSString *title = self.eventTitleTextField.text;
|
||
UIImage *bannerImage = self.eventBannerImageView.image;
|
||
BOOL uploadToHomepage = self.uploadBannerYesButton.selected;
|
||
NSString *startTime = self.startTimePlaceholderLabel.text; // This is a placeholder, get actual NSDate
|
||
NSString *content = self.eventContentTextView.text;
|
||
BOOL notifyFans = self.notifyFansSwitch.isOn;
|
||
|
||
if (uploadToHomepage) {
|
||
TTAlertConfig *config = [[TTAlertConfig alloc]init];
|
||
config.title = YMLocalizedString(@"XPAnchorAudienceUpMicView2");
|
||
config.message = [NSString stringWithFormat:YMLocalizedString(@"20.20.59_text_33"),
|
||
@(self.configModel.goldNum)];
|
||
config.actionStyle = TTAlertActionBothStyle;
|
||
@kWeakify(self);
|
||
[TTPopup alertWithConfig:config showBorder:NO confirmHandler:^{
|
||
@kStrongify(self);
|
||
@kWeakify(self);
|
||
[self uploadCover:bannerImage
|
||
finish:^(NSString *path) {
|
||
@kStrongify(self);
|
||
[self.presenter createEventWithTitle:title
|
||
image:path
|
||
uploadToHome:uploadToHomepage
|
||
startTime:startTime
|
||
duration:self.durationMinutes
|
||
content:content
|
||
gold:uploadToHomepage ? self.configModel.goldNum : 0
|
||
roomUid:self.selectRoomModel.roomUid
|
||
notifyFans:notifyFans];
|
||
}];
|
||
} cancelHandler:^{ }];
|
||
} else {
|
||
@kWeakify(self);
|
||
[self uploadCover:bannerImage
|
||
finish:^(NSString *path) {
|
||
@kStrongify(self);
|
||
[self.presenter createEventWithTitle:title
|
||
image:path
|
||
uploadToHome:uploadToHomepage
|
||
startTime:startTime
|
||
duration:self.durationMinutes
|
||
content:content
|
||
gold:uploadToHomepage ? self.configModel.goldNum : 0
|
||
roomUid:self.selectRoomModel.roomUid
|
||
notifyFans:notifyFans];
|
||
}];
|
||
}
|
||
}
|
||
|
||
- (void)uploadCover:(UIImage *)cover finish:(void(^)(NSString *path))finish {
|
||
[XNDJTDDLoadingTool showLoading];
|
||
NSData *data = UIImageJPEGRepresentation(cover, 0.7);
|
||
NSString *format = [UIImage getImageTypeWithImageData:data];
|
||
NSString *name = [NSString stringWithFormat:@"banner/%@.%@",[NSString createUUID],format];
|
||
|
||
[[UploadFile share]QCloudUploadImage:data named:name success:^(NSString * _Nonnull key, NSDictionary * _Nonnull resp) {
|
||
[XNDJTDDLoadingTool hideHUD];
|
||
if (finish) {
|
||
finish(key);
|
||
}
|
||
} failure:^(NSNumber * _Nonnull resCode, NSString * _Nonnull message) {
|
||
[XNDJTDDLoadingTool showErrorWithMessage:message];
|
||
}];
|
||
}
|
||
|
||
|
||
#pragma mark - UITextFieldDelegate
|
||
|
||
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
|
||
if (textField == self.eventTitleTextField) {
|
||
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
|
||
if (newString.length > MAX_EVENT_TITLE_LENGTH) {
|
||
return NO;
|
||
}
|
||
}
|
||
return YES;
|
||
}
|
||
|
||
- (void)textFieldDidChangeSelection:(UITextField *)textField {
|
||
if (textField == self.eventTitleTextField) {
|
||
[self updateEventTitleCharCount];
|
||
[self checkCreateEventButtonState];
|
||
}
|
||
}
|
||
|
||
#pragma mark - UITextViewDelegate
|
||
|
||
- (void)textViewDidChange:(UITextView *)textView {
|
||
if (textView == self.eventContentTextView) {
|
||
[self updateEventContentCharCount];
|
||
[self checkCreateEventButtonState];
|
||
// Optional: Add placeholder behavior for UITextView if needed
|
||
}
|
||
}
|
||
|
||
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
|
||
if (textView == self.eventContentTextView) {
|
||
NSString *newText = [textView.text stringByReplacingCharactersInRange:range withString:text];
|
||
if (newText.length > MAX_EVENT_CONTENT_LENGTH) {
|
||
return NO;
|
||
}
|
||
}
|
||
return YES;
|
||
}
|
||
|
||
- (void)uploadBannerButtonTapped:(UIButton *)sender {
|
||
if (sender == self.uploadBannerYesButton) {
|
||
if (!self.uploadBannerYesButton.selected) {
|
||
self.uploadBannerYesButton.selected = YES;
|
||
self.uploadBannerNoButton.selected = NO;
|
||
}
|
||
} else if (sender == self.uploadBannerNoButton) {
|
||
if (!self.uploadBannerNoButton.selected) { // 避免重复设置
|
||
self.uploadBannerYesButton.selected = NO;
|
||
self.uploadBannerNoButton.selected = YES;
|
||
}
|
||
}
|
||
[self checkCreateEventButtonState];
|
||
}
|
||
|
||
|
||
- (void)checkWalletToUploadBanner {
|
||
if (self.walletInfoModel.diamonds.integerValue >= self.configModel.goldNum) {
|
||
self.uploadBannerYesButton.selected = YES;
|
||
self.uploadBannerNoButton.selected = NO;
|
||
} else {
|
||
TTAlertConfig *config = [[TTAlertConfig alloc]init];
|
||
config.title = YMLocalizedString(@"UserDetail_CP_Toast_0");
|
||
config.message = YMLocalizedString(@"XPNobleCenterViewController3");
|
||
config.actionStyle = TTAlertActionBothStyle;
|
||
@kWeakify(self);
|
||
[TTPopup alertWithConfig:config showBorder:NO confirmHandler:^{
|
||
@kStrongify(self);
|
||
XPIAPRechargeViewController * webVC =[[XPIAPRechargeViewController alloc] init];
|
||
webVC.type = @"4";
|
||
[self.navigationController pushViewController:webVC animated:YES];
|
||
} cancelHandler:^{ }];
|
||
}
|
||
}
|
||
|
||
#pragma mark - UIImagePickerControllerDelegate (Legacy)
|
||
|
||
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
|
||
UIImage *selectedImage = info[UIImagePickerControllerOriginalImage];
|
||
if (selectedImage) {
|
||
// 对于iOS 14以下版本,选择图片后手动裁剪
|
||
CGFloat aspectRatio = 690.0 / 236.0; // 约为2.92:1
|
||
CGFloat viewWidth = self.view.frame.size.width - (kHorizontalPadding * 2 - 2);
|
||
CGFloat viewHeight = viewWidth / aspectRatio;
|
||
CGSize cropSize = CGSizeMake(viewWidth, viewHeight);
|
||
|
||
UIImage *croppedImage = [selectedImage cutImage:cropSize];
|
||
self.selectedImage = croppedImage;
|
||
self.eventBannerImageView.image = croppedImage;
|
||
self.eventBannerCamearImageView.hidden = NO;
|
||
}
|
||
[picker dismissViewControllerAnimated:YES completion:nil];
|
||
[self checkCreateEventButtonState];
|
||
}
|
||
|
||
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
|
||
[picker dismissViewControllerAnimated:YES completion:nil];
|
||
}
|
||
|
||
#pragma mark - PHPickerViewControllerDelegate (iOS 14+)
|
||
|
||
- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results API_AVAILABLE(ios(14)) {
|
||
[picker dismissViewControllerAnimated:YES completion:nil];
|
||
// 我们使用TZImagePickerController代替了PHPickerViewController,这个方法不再需要
|
||
[self checkCreateEventButtonState];
|
||
}
|
||
|
||
#pragma mark - Event Title Section
|
||
- (void)setupEventTitleSection {
|
||
self.eventTitleLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_9")];
|
||
[self.contentView addSubview:self.eventTitleLabel];
|
||
self.eventTitleTextField = [self createTextFieldWithPlaceholder:@""];
|
||
self.eventTitleTextField.delegate = self;
|
||
[self.contentView addSubview:self.eventTitleTextField];
|
||
self.eventTitleCharCountLabel = [self createCharCountLabel];
|
||
[self.contentView addSubview:self.eventTitleCharCountLabel];
|
||
|
||
[self.eventTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.contentView.mas_top).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
|
||
[self.eventTitleTextField mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.eventTitleLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding);
|
||
make.height.mas_equalTo(40);
|
||
}];
|
||
|
||
[self.eventTitleCharCountLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.centerY
|
||
.equalTo(self.eventTitleLabel);
|
||
make.trailing.equalTo(self.eventTitleTextField);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Event Banner Section
|
||
- (void)setupEventBannerSection {
|
||
self.eventBannerLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_10")];
|
||
[self.contentView addSubview:self.eventBannerLabel];
|
||
|
||
self.eventBannerImageView = [[UIImageView alloc] initWithImage:kImage(@"event_take_photo")];
|
||
self.eventBannerImageView.contentMode = UIViewContentModeScaleAspectFill;
|
||
self.eventBannerImageView.clipsToBounds = YES;
|
||
self.eventBannerImageView.layer.cornerRadius = 8;
|
||
self.eventBannerImageView.userInteractionEnabled = YES;
|
||
UITapGestureRecognizer *bannerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(eventBannerTapped)];
|
||
[self.eventBannerImageView addGestureRecognizer:bannerTap];
|
||
[self.contentView addSubview:self.eventBannerImageView];
|
||
|
||
self.eventBannerCamearImageView = [[UIImageView alloc] initWithImage:kImage(@"event_camear")];
|
||
self.eventBannerCamearImageView.hidden = YES;
|
||
[self.eventBannerImageView addSubview:self.eventBannerCamearImageView];
|
||
|
||
[self.eventBannerLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.eventTitleTextField.mas_bottom).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
|
||
[self.eventBannerImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.eventBannerLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding-1);
|
||
|
||
// 设置高度为宽度除以690:236的比例
|
||
make.height.equalTo(self.eventBannerImageView.mas_width).multipliedBy(236.0/690.0);
|
||
}];
|
||
[self.eventBannerCamearImageView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.bottom.trailing.equalTo(self.eventBannerImageView);
|
||
make.width.height.mas_equalTo(32);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Upload Banner Section
|
||
- (void)setupUploadBannerSection {
|
||
self.uploadBannerLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_11")];
|
||
|
||
[self.contentView addSubview:self.uploadBannerLabel];
|
||
self.uploadBannerYesButton = [self createUploadBannerButtonWithTitle:YMLocalizedString(@"20.20.59_text_12") imageName:@"event_non_select" selectedImageName:@"event_selected" tag:0];
|
||
self.uploadBannerYesButton.selected = NO;
|
||
[self.uploadBannerYesButton addTarget:self action:@selector(uploadBannerButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
|
||
[self.contentView addSubview:self.uploadBannerYesButton];
|
||
|
||
self.uploadBannerNoButton = [self createUploadBannerButtonWithTitle:YMLocalizedString(@"20.20.59_text_13") imageName:@"event_non_select" selectedImageName:@"event_selected" tag:1];
|
||
self.uploadBannerNoButton.selected = YES;
|
||
[self.uploadBannerNoButton addTarget:self action:@selector(uploadBannerButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
|
||
[self.contentView addSubview:self.uploadBannerNoButton];
|
||
|
||
[self.uploadBannerLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.eventBannerImageView.mas_bottom).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
[self.uploadBannerYesButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.uploadBannerLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
make.height.mas_equalTo(20);
|
||
make.width.mas_greaterThanOrEqualTo(80);
|
||
}];
|
||
[self.uploadBannerNoButton mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.uploadBannerLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.equalTo(self.uploadBannerYesButton.mas_trailing).offset(70);
|
||
make.height.equalTo(self.uploadBannerYesButton);
|
||
make.width.mas_greaterThanOrEqualTo(80);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Select Room Section
|
||
- (void)setupSelectRoomSection {
|
||
self.selectRoomLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_14")];
|
||
[self.contentView addSubview:self.selectRoomLabel];
|
||
self.selectRoomView = [self createSelectionViewWithPlaceholder:YMLocalizedString(@"XPAnchorPKTableViewCell2") target:self action:@selector(selectRoomTapped)];
|
||
[self.contentView addSubview:self.selectRoomView];
|
||
[self.selectRoomLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.uploadBannerYesButton.mas_bottom).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
[self.selectRoomView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.selectRoomLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding);
|
||
make.height.mas_equalTo(44);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Start Time Section
|
||
- (void)setupStartTimeSection {
|
||
self.startTimeLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_15")];
|
||
[self.contentView addSubview:self.startTimeLabel];
|
||
self.startTimeView = [self createSelectionViewWithPlaceholder:YMLocalizedString(@"XPAnchorPKTableViewCell2")
|
||
target:self
|
||
action:@selector(selectStartTimeTapped)];
|
||
[self.contentView addSubview:self.startTimeView];
|
||
[self.startTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.selectRoomView.mas_bottom).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
[self.startTimeView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.startTimeLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding);
|
||
make.height.mas_equalTo(40);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Duration Section
|
||
- (void)setupDurationSection {
|
||
self.durationLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_16")];
|
||
[self.contentView addSubview:self.durationLabel];
|
||
self.durationView = [self createSelectionViewWithPlaceholder:YMLocalizedString(@"XPAnchorPKTableViewCell2") target:self action:@selector(selectDurationTapped)];
|
||
[self.contentView addSubview:self.durationView];
|
||
[self.durationLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.startTimeView.mas_bottom).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
[self.durationView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.durationLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding);
|
||
make.height.mas_equalTo(40);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Event Content Section
|
||
- (void)setupEventContentSection {
|
||
self.eventContentLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_17")];
|
||
[self.contentView addSubview:self.eventContentLabel];
|
||
|
||
self.eventContentTextView = [[UITextView alloc] init];
|
||
self.eventContentTextView.backgroundColor = UIColorFromRGB(0xf2f3f7);
|
||
self.eventContentTextView.font = kFontRegular(14);
|
||
self.eventContentTextView.textColor = UIColorFromRGB(0x313131);
|
||
self.eventContentTextView.layer.cornerRadius = 8;
|
||
self.eventContentTextView.delegate = self;
|
||
[self.contentView addSubview:self.eventContentTextView];
|
||
|
||
self.eventContentCharCountLabel = [self createCharCountLabel];
|
||
[self.contentView addSubview:self.eventContentCharCountLabel];
|
||
|
||
[self.eventContentLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.durationView.mas_bottom).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
[self.eventContentTextView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.eventContentLabel.mas_bottom).offset(kVerticalPadding);
|
||
make.leading.trailing.equalTo(self.contentView).inset(kHorizontalPadding);
|
||
make.height.mas_equalTo(152);
|
||
}];
|
||
[self.eventContentCharCountLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.centerY.equalTo(self.eventContentLabel);
|
||
make.trailing.equalTo(self.eventContentTextView.mas_trailing);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - Notify My Fans Section
|
||
- (void)setupNotifyMyFansSection {
|
||
self.notifyFansLabel = [self createLabelWithText:YMLocalizedString(@"20.20.59_text_18")];
|
||
[self.contentView addSubview:self.notifyFansLabel];
|
||
self.notifyFansSwitch = [[UISwitch alloc] init];
|
||
self.notifyFansSwitch.tintColor = UIColorRGBAlpha(0xFFE3AF, 0.4);
|
||
self.notifyFansSwitch.onTintColor = UIColorFromRGB(0xff8c03);
|
||
self.notifyFansSwitch.transform = CGAffineTransformMakeScale(0.8, 0.8);
|
||
[self.contentView addSubview:self.notifyFansSwitch];
|
||
[self.notifyFansLabel mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.top.equalTo(self.eventContentTextView.mas_bottom).offset(kSectionSpacing);
|
||
make.leading.equalTo(self.contentView).offset(kHorizontalPadding);
|
||
}];
|
||
[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*5);
|
||
}];
|
||
[self.contentView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
make.bottom.greaterThanOrEqualTo(self.notifyFansSwitch.mas_bottom).offset(kSectionSpacing*5);
|
||
}];
|
||
}
|
||
|
||
#pragma mark - UIScrollViewDelegate
|
||
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
|
||
[self dismissKeyboard];
|
||
}
|
||
|
||
- (void)checkCreateEventButtonState {
|
||
|
||
NSString *placeholder = YMLocalizedString(@"XPAnchorPKTableViewCell2");
|
||
BOOL hasTitle = self.eventTitleTextField.text.length > 0;
|
||
BOOL hasBanner = self.selectedImage != nil;
|
||
BOOL hasRoom = self.selectRoomPlaceholderLabel.text.length > 0 && ![self.selectRoomPlaceholderLabel.text isEqualToString:placeholder];
|
||
BOOL hasStartTime = self.startTimePlaceholderLabel.text.length > 0 && ![self.startTimePlaceholderLabel.text isEqualToString:placeholder];
|
||
BOOL hasDuration = self.durationPlaceholderLabel.text.length > 0 && ![self.durationPlaceholderLabel.text isEqualToString:placeholder];
|
||
BOOL hasContent = self.eventContentTextView.text.length > 0;
|
||
if (hasTitle && hasBanner && hasRoom && hasStartTime && hasDuration && hasContent) {
|
||
self.createEventButton.alpha = 1.0;
|
||
self.createEventButton.userInteractionEnabled = YES;
|
||
} else {
|
||
self.createEventButton.alpha = 0.3;
|
||
self.createEventButton.userInteractionEnabled = NO;
|
||
}
|
||
}
|
||
|
||
|
||
#pragma mark - TZImagePickerControllerDelegate
|
||
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingPhotos:(NSArray<UIImage *> *)photos sourceAssets:(NSArray *)assets isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto infos:(NSArray<NSDictionary *> *)infos {
|
||
if (photos.count > 0) {
|
||
UIImage *croppedImage = photos.firstObject;
|
||
self.selectedImage = croppedImage;
|
||
self.eventBannerImageView.image = croppedImage;
|
||
self.eventBannerCamearImageView.hidden = NO;
|
||
[self checkCreateEventButtonState];
|
||
}
|
||
}
|
||
|
||
// 添加拍照结果的处理方法
|
||
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingVideo:(UIImage *)coverImage sourceAssets:(PHAsset *)asset {
|
||
// 不处理视频
|
||
}
|
||
|
||
// 处理用户拍照的情况
|
||
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingImage:(UIImage *)image {
|
||
// 直接使用拍照的图片
|
||
self.selectedImage = image;
|
||
self.eventBannerImageView.image = image;
|
||
self.eventBannerCamearImageView.hidden = NO;
|
||
[self checkCreateEventButtonState];
|
||
}
|
||
|
||
// 处理拍照或摄像完成的回调
|
||
- (void)imagePickerController:(TZImagePickerController *)picker didFinishTakePhoto:(UIImage *)image sourceType:(TZAssetModelMediaType)sourceType cutImage:(UIImage *)cutImage isSelectOriginalPhoto:(BOOL)isSelectOriginalPhoto {
|
||
// 优先使用裁剪后的图片,如果有的话
|
||
UIImage *finalImage = cutImage ? cutImage : image;
|
||
self.selectedImage = finalImage;
|
||
self.eventBannerImageView.image = finalImage;
|
||
self.eventBannerCamearImageView.hidden = NO;
|
||
[self checkCreateEventButtonState];
|
||
}
|
||
|
||
@end
|