结构调整

This commit is contained in:
启星
2025-10-20 10:29:42 +08:00
parent 2c66709436
commit fdeed970d4
145 changed files with 4 additions and 4 deletions

View File

@@ -0,0 +1,61 @@
//
// QXRoomSeatContentView.h
// QXLive
//
// Created by 启星 on 2025/6/7.
//
#import <UIKit/UIKit.h>
#import "QXRoomModel.h"
#import "QXSongListModel.h"
#import "QXRoomSeatDelegate.h"
typedef NS_ENUM(NSInteger) {
/// 名称名称在下显示魅力
QXRoomSeatContentViewTypeNormal = 0,
/// 名称在右
QXRoomSeatContentViewTypeAuction = 1,
/// 交友房
QXRoomSeatContentViewTypeFriend
}QXRoomSeatContentViewType;
NS_ASSUME_NONNULL_BEGIN
@interface QXRoomSeatContentView : UIView
@property (nonatomic,strong)NSString *tagString;
@property (nonatomic,assign)NSInteger number;
@property (nonatomic,strong)QXRoomPitModel *pitModel;
@property (nonatomic,assign)BOOL onlyShowHeader;
@property (nonatomic,assign) BOOL isSeatSpeaking;
@property (nonatomic,strong)NSString *is_lock;
@property (nonatomic,strong)UIImageView *noUserImageView;
/// 是否为拍卖位
@property (nonatomic,assign) BOOL isAutionSeat;
@property (nonatomic,strong) NSString* numberString;
@property (nonatomic,assign) BOOL isPK;
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
/// 麦位视图类型
@property (nonatomic,assign)QXRoomSeatContentViewType type;
/// 是否展示离线状态 需求暂定二卡八不展示离线状态
@property (nonatomic,assign)BOOL noOffLine;
//@property (nonatomic,strong)QXRoomOwnerModel *userModel ;
-(void)updateUserCharm:(NSString*)charm;
- (void)startAudioAnimation ;
/// 暂停麦位动画
- (void)stopAudioAnimation ;
-(void)hideCharm;
-(void)destroyViews;
-(void)stopHWDMP4;
-(void)playHWDMP4;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,537 @@
//
// QXRoomSeatContentView.m
// QXLive
//
// Created by on 2025/6/7.
//
#import "QXRoomSeatContentView.h"
#import "QXSeatHeaderView.h"
#import "QXEffectSvgaView.h"
#import "UIView+VAP.h"
#import "QXFileManager.h"
#import <AgoraRtcKit/AgoraRtcEngineKit.h>
@interface QXRoomSeatContentView()
///
//@property (nonatomic,strong)UIView *headerContentView;
@property (nonatomic,strong)QXSeatHeaderView *headerView;
@property (nonatomic,strong)UIImageView *lockImageView;
@property (nonatomic,strong)UIImageView *muteImageView;
@property (nonatomic,strong)UIImageView *offlineImageView;
/// /
@property (nonatomic,strong)UILabel *tagLabel;
///
@property (nonatomic,strong)UILabel *nameLabel;
///
@property (nonatomic,strong)UIView *charmBgView;
///
@property (nonatomic,strong)UIImageView *charmIcon;
/// num
@property (nonatomic,strong)UILabel *charmLabel;
///
@property (nonatomic,strong)UILabel *numberLabel;
@property (nonatomic,strong) QXEffectSvgaView *micSvgaView;
@property (nonatomic,strong) VAPView *micMp4View;
@property (nonatomic,strong)UIButton *headerBtn;
@end
@implementation QXRoomSeatContentView
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(speakInfo:) name:noticeUserSpeak object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onlineStatusDidChanged:) name:noticeRoomUserOnlineStatusDidChanged object:nil];
self.clipsToBounds = NO;
[self addSubview:self.noUserImageView];
[self.noUserImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self).offset(5);
make.right.equalTo(self).offset(-5);
make.height.equalTo(self.noUserImageView.mas_width);
}];
self.lockImageView.hidden = YES;
[self addSubview:self.lockImageView];
[self.lockImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.height.equalTo(self.noUserImageView);
}];
[self addSubview:self.headerView];
[self.headerView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self).offset(5);
make.right.equalTo(self).offset(-5);
make.height.equalTo(self.noUserImageView.mas_width);
}];
[self insertSubview:self.micSvgaView belowSubview:self.headerView];
[self.micSvgaView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.headerView).offset(-10);
make.right.bottom.equalTo(self.headerView).offset(10);
}];
[self addSubview:self.micMp4View];
[self.micMp4View mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(self.headerView).offset(-8);
make.right.bottom.equalTo(self.headerView).offset(8);
}];
self.muteImageView.hidden = YES;
[self addSubview:self.muteImageView];
[self.muteImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.height.equalTo(self.noUserImageView);
}];
self.offlineImageView.hidden = YES;
[self addSubview:self.offlineImageView];
[self.offlineImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.left.right.height.equalTo(self.noUserImageView);
}];
self.tagLabel = [[UILabel alloc] init];
self.tagLabel.textColor = [UIColor whiteColor];
self.tagLabel.backgroundColor = RGB16(0xC134EE);
self.tagLabel.textAlignment = NSTextAlignmentCenter;
self.tagLabel.font = [UIFont systemFontOfSize:ScaleWidth(10.0)];
[self.tagLabel addRoundedCornersWithRadius:ScaleWidth(6.5)];
self.tagLabel.hidden = YES;
[self addSubview:self.tagLabel];
[self.tagLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
// make.left.right.equalTo(self);
make.centerX.equalTo(self.noUserImageView);
make.top.equalTo(self.noUserImageView.mas_bottom).offset(-8);
make.height.mas_equalTo(ScaleWidth(13));
}];
self.nameLabel = [[UILabel alloc] init];
self.nameLabel.textColor = [UIColor whiteColor];
self.nameLabel.font = [UIFont systemFontOfSize:ScaleWidth(12.0)];
self.nameLabel.text = @"张三李四";
self.nameLabel.lineBreakMode = NSLineBreakByClipping;
self.nameLabel.textAlignment = NSTextAlignmentCenter;
// self.nameLabel.adjustsFontSizeToFitWidth = YES;
self.nameLabel.hidden = YES;
[self addSubview:self.nameLabel];
[self.nameLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.noUserImageView.mas_bottom).offset(5);
// make.centerX.equalTo(self.noUserImageView);
make.height.mas_equalTo(18);
make.left.right.equalTo(self);
}];
self.numberLabel = [[UILabel alloc] init];
self.numberLabel.textColor = RGB16(0xffffff);
self.numberLabel.font = [UIFont systemFontOfSize:ScaleWidth(12.0)];
self.numberLabel.text = @"";
[self addSubview:self.numberLabel];
[self.numberLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.noUserImageView.mas_bottom).offset(5);
make.centerX.equalTo(self.noUserImageView);
make.height.mas_equalTo(18);
}];
MJWeakSelf
self.charmBgView = [[UIView alloc] init];
[self.charmBgView addTapBlock:^(id _Nonnull obj) {
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(previewRoomUserCharmListWithUserId:)]) {
[weakSelf.delegate previewRoomUserCharmListWithUserId:weakSelf.pitModel.user_id];
}
}];
self.charmBgView.backgroundColor = RGB16A(0xffffff, 0.2);
[self.charmBgView addRoundedCornersWithRadius:ScaleWidth(7.5)];
self.charmBgView.hidden = YES;
[self addSubview:self.charmBgView];
[self.charmBgView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(self.nameLabel.mas_bottom).offset(3);
make.height.mas_equalTo(ScaleWidth(15));
}];
self.charmIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_seat_charm"]];
[self.charmBgView addSubview:self.charmIcon];
[self.charmIcon mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(5);
make.size.mas_equalTo(CGSizeMake(14, 14));
make.centerY.equalTo(self.charmBgView).offset(-1);
}];
self.charmLabel = [[UILabel alloc] init];
self.charmLabel.textColor = [UIColor whiteColor];
self.charmLabel.text = @"0";
self.charmLabel.font = [UIFont systemFontOfSize:ScaleWidth(10.0)];
[self.charmBgView addSubview:self.charmLabel];
[self.charmLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
// make.left.equalTo(self.charmIcon.mas_right).offset(1);
make.centerY.equalTo(self.charmBgView);
make.centerX.equalTo(self.charmBgView).offset(7);
}];
self.headerBtn = [[UIButton alloc] init];
[self.headerBtn addTarget:self action:@selector(headerAction) forControlEvents:(UIControlEventTouchUpInside)];
[self addSubview:self.headerBtn];
[self.headerBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.noUserImageView);
}];
}
-(void)headerAction{
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickUserHeaderWithPitModel:seatView:)]) {
[self.delegate didClickUserHeaderWithPitModel:self.pitModel seatView:self];
}
}
-(void)onlineStatusDidChanged:(NSNotification*)notice{
if (self.noOffLine) {
return;
}
NSDictionary *parm = notice.object;
NSString *uid = [NSString stringWithFormat:@"%@",[parm objectForKey:@"user_id"]];
BOOL isOnline = [[parm objectForKey:@"is_online"] boolValue];
[QXGlobal.shareGlobal.offLineDict setObject:[NSNumber numberWithBool:!isOnline] forKey:uid];
if ([uid isEqualToString:self.pitModel.user_id]) {
if (isOnline) {
self.offlineImageView.hidden = YES;
}else{
self.offlineImageView.hidden = NO;
[self stopAudioAnimation];
}
}
QXLOG(@"在线状态%@",QXGlobal.shareGlobal.offLineDict);
}
-(void)speakInfo:(NSNotification*)notice{
id object = notice.object;
if ([object isKindOfClass:[AgoraRtcAudioVolumeInfo class]]) {
AgoraRtcAudioVolumeInfo *info = (AgoraRtcAudioVolumeInfo*)object;
if (info.uid == 0) {
info.uid = [QXGlobal shareGlobal].loginModel.user_id.longLongValue;
}
if ((info.uid == self.pitModel.user_id.longLongValue)) {
if (info.volume > 0) {
self.offlineImageView.hidden = YES;
[QXGlobal.shareGlobal.offLineDict setObject:[NSNumber numberWithBool:NO] forKey:[NSString stringWithFormat:@"%ld",info.uid]];
[self startAudioAnimation];
}else{
[self stopAudioAnimation];
}
}
}
if (self.pitModel.user_id.longLongValue <= 0) {
[self stopAudioAnimation];
}
}
-(void)setNoOffLine:(BOOL)noOffLine{
_noOffLine = noOffLine;
}
-(void)setIsPK:(BOOL)isPK{
_isPK = isPK;
self.nameLabel.font = [UIFont systemFontOfSize:10];
self.numberLabel.font = [UIFont systemFontOfSize:10];
self.charmLabel.font = [UIFont systemFontOfSize:8];
[self.nameLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(ScaleWidth(15));
}];
[self.numberLabel mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(ScaleWidth(15));
}];
[self.charmBgView mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(ScaleWidth(12));
make.top.equalTo(self.nameLabel.mas_bottom).offset(1);
}];
[self.charmBgView addRoundedCornersWithRadius:ScaleWidth(6)];
}
///
- (void)startAudioAnimation {
if (self.isSeatSpeaking == YES) {
return;
}
self.isSeatSpeaking = YES;
[self.micSvgaView setHidden:NO];
[self.micSvgaView startEffectSvgaPlay];
}
///
- (void)stopAudioAnimation {
if (self.isSeatSpeaking == NO) {
return;
}
self.isSeatSpeaking = NO;
[self.micSvgaView setHidden:YES];
[self.micSvgaView pauseEffectSvgaPlay];
}
-(void)setTagString:(NSString *)tagString{
_tagString = tagString;
self.tagLabel.hidden = NO;
self.numberLabel.hidden = YES;
self.tagLabel.text = tagString;
[self.tagLabel sizeToFit];
[self.tagLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.noUserImageView);
make.top.equalTo(self.noUserImageView.mas_bottom).offset(-8);
make.height.mas_equalTo(ScaleWidth(13));
make.width.mas_equalTo(self.tagLabel.width+16);
}];
}
-(void)setType:(QXRoomSeatContentViewType)type{
_type = type;
switch (type) {
case QXRoomSeatContentViewTypeNormal:{
}
break;
case QXRoomSeatContentViewTypeAuction:{
[self.noUserImageView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.left.equalTo(self).offset(5);
make.bottom.equalTo(self).offset(-5);
make.width.equalTo(self.noUserImageView.mas_height);
}];
[self.headerView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.bottom.equalTo(self.noUserImageView);
}];
[self.nameLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.noUserImageView.mas_right).offset(2);
make.right.equalTo(self);
make.height.mas_equalTo(18);
make.centerY.equalTo(self.noUserImageView);
}];
[self.numberLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.noUserImageView.mas_right).offset(2);
make.right.equalTo(self);
make.height.mas_equalTo(18);
make.centerY.equalTo(self.noUserImageView);
}];
}
break;
case QXRoomSeatContentViewTypeFriend:{
self.charmBgView.backgroundColor = RGB16A(0x000000,0.65);
// self.charmBgView.hidden = NO;
[self.charmBgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(self.noUserImageView.mas_bottom).offset(-8);
make.height.mas_equalTo(ScaleWidth(15));
}];
[self.nameLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.charmBgView.mas_bottom).offset(0);
// make.centerX.equalTo(self.noUserImageView);
make.height.mas_equalTo(18);
make.left.right.equalTo(self);
}];
self.nameLabel.textColor = RGB16(0xEFEAFF);
self.numberLabel.textColor = RGB16(0xEFEAFF);
[self.numberLabel mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.charmBgView.mas_bottom).offset(0);
make.centerX.equalTo(self.noUserImageView);
make.height.mas_equalTo(18);
}];
}
break;
default:
break;
}
}
-(void)setNumber:(NSInteger)number{
_number = number;
if (number>8) {
return;
}
self.numberLabel.text = [NSString localizedStringWithFormat:QXText(@"%@号麦"),[NSString stringWithFormat:@"%ld",number]];
}
-(void)setOnlyShowHeader:(BOOL)onlyShowHeader{
_onlyShowHeader = onlyShowHeader;
self.charmBgView.hidden = onlyShowHeader;
self.nameLabel.font = onlyShowHeader?[UIFont systemFontOfSize:8]:[UIFont systemFontOfSize:ScaleWidth(12.0)];;
}
-(void)setPitModel:(QXRoomPitModel *)pitModel{
_pitModel = pitModel;
if (pitModel.is_lock.intValue == 1) {
self.lockImageView.hidden = NO;
}else{
self.lockImageView.hidden = YES;
}
if (pitModel.user_id.longValue > 0) {
BOOL is_offline = [[[QXGlobal shareGlobal].offLineDict objectForKey:pitModel.user_id?pitModel.user_id:@"0"] boolValue];
if (is_offline) {
if (self.noOffLine) {
self.offlineImageView.hidden = YES;
}else{
self.offlineImageView.hidden = NO;
}
}else{
self.offlineImageView.hidden = YES;
}
self.numberLabel.hidden = YES;
self.headerView.hidden = NO;
self.nameLabel.hidden = NO;
[self.headerView setHeadIcon:pitModel.avatar dress:pitModel.dress];
self.nameLabel.text = pitModel.nickname;
self.charmBgView.hidden = NO;
self.charmLabel.text = [NSString qx_showHotCountNum:pitModel.charm.longLongValue];
// if (pitModel.is_mute.intValue == 1) {
// self.muteImageView.hidden = NO;
// }else{
// self.muteImageView.hidden = YES;
// }
}else{
self.noUserImageView.hidden = NO;
self.offlineImageView.hidden = YES;
self.numberLabel.hidden = NO;
self.headerView.hidden = YES;
self.nameLabel.hidden = YES;
self.charmBgView.hidden = YES;
// if (pitModel.is_mute.intValue == 1) {
// self.muteImageView.hidden = YES;
// }else{
// self.muteImageView.hidden = YES;
// }
}
if (self.type == QXRoomSeatContentViewTypeAuction) {
self.charmBgView.hidden = YES;
}
}
-(void)updateUserCharm:(NSString *)charm{
self.pitModel.charm = charm;
self.charmLabel.text = [NSString qx_showHotCountNum:self.pitModel.charm.longLongValue];
}
-(void)hideCharm{
self.charmBgView.hidden = YES;
}
//-(void)setUserModel:(QXRoomOwnerModel *)userModel{
// _userModel = userModel;
// self.noUserImageView.hidden = YES;
// self.numberLabel.hidden = YES;
// self.headerView.hidden = NO;
// self.nameLabel.hidden = NO;
//
// [self.headerView setHeadIcon:userModel.avatar dress:userModel.dress];
// self.nameLabel.text = userModel.nickname;
// self.charmBgView.hidden = NO;
// self.charmLabel.text = [NSString qx_showHotCountNum:userModel.charm.longLongValue];
//}
-(void)setIs_lock:(NSString *)is_lock{
_is_lock = is_lock;
self.pitModel.is_lock = is_lock;
if (self.pitModel.is_lock.intValue == 1) {
self.lockImageView.hidden = NO;
}else{
self.lockImageView.hidden = YES;
}
}
-(void)setIsAutionSeat:(BOOL)isAutionSeat{
_isAutionSeat = isAutionSeat;
self.noUserImageView.image = [UIImage imageNamed:@"room_seat_auction_icon"];
self.charmBgView.hidden = YES;
}
-(void)setNumberString:(NSString *)numberString{
self.numberLabel.text = numberString;
}
//-(void)setSinger:(QXSongListModel *)singer{
// _singer = singer;
// self.noUserImageView.hidden = YES;
// self.numberLabel.hidden = YES;
// self.headerView.hidden = NO;
// self.nameLabel.hidden = NO;
//
// [self.headerView setHeadIcon:singer.avatar dress:singer.dress];
// self.nameLabel.text = singer.nickname;
// self.charmBgView.hidden = NO;
// self.charmLabel.text = [NSString qx_showHotCountNum:singer.charm.longLongValue];
//}
-(QXSeatHeaderView *)headerView{
if (!_headerView) {
_headerView = [[QXSeatHeaderView alloc] init];
_headerView.hidden = YES;
}
return _headerView;
}
-(UIImageView *)noUserImageView{
if (!_noUserImageView) {
UIImage *image = [UIImage imageNamed:@"room_seat_icon"];
// image = [image imageByTintColor:QXConfig.themeColor];
_noUserImageView = [[UIImageView alloc] initWithImage:image];
}
return _noUserImageView;
}
-(UIImageView *)offlineImageView{
if (!_offlineImageView) {
UIImage *image = [UIImage imageNamed:@"room_user_offline"];
// image = [image imageByTintColor:QXConfig.themeColor];
_offlineImageView = [[UIImageView alloc] initWithImage:image];
_offlineImageView.contentMode = UIViewContentModeScaleToFill;
_offlineImageView.hidden = YES;
}
return _offlineImageView;
}
-(UIImageView *)lockImageView{
if (!_lockImageView) {
_lockImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_seat_lock"]];
}
return _lockImageView;
}
-(UIImageView *)muteImageView{
if (!_muteImageView) {
_muteImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_seat_mute"]];
}
return _muteImageView;
}
- (QXEffectSvgaView *)micSvgaView {
if (!_micSvgaView) {
_micSvgaView = [[QXEffectSvgaView alloc] initWithFrame:CGRectZero isAutoPlay:NO];
_micSvgaView.hidden = YES;
[_micSvgaView loadSVGAPlayerWith:@"mic" inBundle:[NSBundle mainBundle] loop:10000000];
__weak typeof(self)weakSelf = self;
_micSvgaView.didFinishedDisplay = ^(QXEffectSvgaView * _Nonnull svgaView) {
weakSelf.isSeatSpeaking = NO;
};
}
return _micSvgaView;
}
- (VAPView *)micMp4View {
if (!_micMp4View) {
_micMp4View = [[VAPView alloc] initWithFrame:CGRectZero];
_micMp4View.hwd_enterBackgroundOP = HWDMP4EBOperationTypePauseAndResume;
_micMp4View.contentMode = UIViewContentModeScaleAspectFit;
_micMp4View.userInteractionEnabled = NO;
_micMp4View.backgroundColor = [UIColor clearColor];
_micMp4View.hidden = YES;
}
return _micMp4View;
}
-(void)destroyViews{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self.micMp4View stopHWDMP4];
[self.micMp4View removeFromSuperview];
self.micMp4View = nil;
[self.micSvgaView destroySvga];
}
-(void)stopHWDMP4{
[self.headerView stopHWDMP4];
}
-(void)playHWDMP4{
[self.headerView playHWDMP4];
}
@end

View File

@@ -0,0 +1,40 @@
//
// QXRoomSeatDelegate.h
// QXLive
//
// Created by 启星 on 2025/6/24.
//
#import "QXRoomModel.h"
//#import "QXRoomSeatContentView.h"
@class QXRoomSeatContentView;
@protocol QXRoomSeatDelegate <NSObject>
@optional
//-(void)didClickUserHeaderWithPitModel:(QXRoomPitModel*)pitModel userModel:(id)userModel;
/// 麦位视图
-(void)didClickUserHeaderWithPitModel:(QXRoomPitModel*)pitModel seatView:(QXRoomSeatContentView*)seatView;
-(void)didClickUserHeaderWithPitModel:(QXRoomPitModel*)pitModel userModel:(id)userModel isPkRoom:(BOOL)isPkRoom pkRoomId:(NSString*)pkRoomId isNoTakeOff:(BOOL)isNoTakeOff;
-(void)didHugSeatWithPitNumber:(NSString*)pitNumber;
/// 点击立即竞拍
-(void)auctionGiftAction:(QXRoomPitModel *)user auctionId:(NSString*)auctionId;
/// 送礼
-(void)sendGiftWithUser:(QXRoomPitModel *)user;
/// 查看个人信息
-(void)previewUserInfoWithUserId:(NSString*)userId;
/// 助力
-(void)friendPowerSendGiftWithUser:(QXRoomPitModel *)user heartId:(NSString*)heartId;
/// 查看房间内用户魅力
-(void)previewRoomUserCharmListWithUserId:(NSString *)userId;
@end

View File

@@ -0,0 +1,72 @@
//
// QXRoomSeatPKView.h
// QXLive
//
// Created by 启星 on 2025/7/2.
//
#import <UIKit//UIKit.h>
#import "QXRoomSeatContentView.h"
#import "QXRoomSeatTypeNormalView.h"
NS_ASSUME_NONNULL_BEGIN
@class QXPKIconView;
@interface QXRoomSeatPKView : UIView
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
@property (nonatomic,strong)QXRoomModel *roomModel;
@property (nonatomic,strong)QXRoomModel *pkRoomModel;
@property (nonatomic,assign)NSInteger myPitNumber;
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number;
/// 清除魅力
-(void)clearCharm;
/// 清除个人魅力
-(void)roomClearUserCharmWithUserId:(NSString *)userId;
/// 设置魅力
-(void)setSeatCharmWithUser:(QXUserHomeModel *)model;
/// 设置多人魅力
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel*>*)users;
/// 设置麦位锁麦状态
-(void)setSeatIsLock:(NSString*)isLock pitNumber:(NSString*)pitNumber;
/// 房间内换麦
-(void)roomSeatExchangedWithFromPitNumber:(NSInteger)fromPitNumber toPitNumber:(NSInteger)toPitNumber userInfo:(QXUserHomeModel*)userInfo;
/// pk开始
-(void)pkStartWithPkEndTimes:(NSString *)pk_end_times pk_id:(NSString*)pk_id;
-(void)roomPKValueDidChangedWithRoomIdA:(NSString*)room_id_a create_value_a:(NSString*)create_value_a room_id_b:(NSString*)room_id_b receive_value_b:(NSString*)receive_value_b;
/// pk结果
-(void)pkResultWithIsVictory:(NSInteger)isVictory
end_time:(NSString*)end_time
victory_name:(NSString*)victory_name
victory_cover:(NSString*)victory_cover
defeated_name:(NSString*)defeated_name
defeated_cover:(NSString*)defeated_cover;
/// 房间内用户信息发生变化
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user;
-(void)stopHWDMP4;
-(void)playHWDMP4;
-(void)destroyViews;
@end
/// 穿透视图
@interface QXPKIconView : UIView
@property (nonatomic,strong)UIImageView *pkImageView;
@end
@interface QXRoomSeatPKSubView : UIView
@property (nonatomic,strong)UIImageView *bgImageView;
@property (nonatomic,strong)UILabel *titleLabel;
@property (nonatomic,assign)BOOL isMyRoom;
-(instancetype)initWithMyRoom:(BOOL)isMyRoom;
@end
@interface QXRoomSeatPKProgress : UIView
@property (nonatomic,strong)UILabel* leftTitleLabel;
@property (nonatomic,strong)UIView* leftView;
@property (nonatomic,strong)UILabel* rightTitleLabel;
@property (nonatomic,strong)UIView* rightView;
-(void)setLeftProgressWithLeftValue:(NSString*)leftValue rightValue:(NSString*)rightValue;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,625 @@
//
// QXRoomSeatPKView.m
// QXLive
//
// Created by on 2025/7/2.
//
#import "QXRoomSeatPKView.h"
#import "UIColor+QX.h"
#import "QXRoomPKTimeSetView.h"
#import "QXTimer.h"
#import "QXMineNetwork.h"
#import "QXRoomPKResultView.h"
#import "QXRoomMessageManager.h"
#import "QXAgoraEngineEx.h"
#import "QXAgoraEngine.h"
#import "QXAlertView.h"
@interface QXRoomSeatPKView()<QXRoomSeatDelegate>
@property (nonatomic,strong)UIButton *startBtn;
@property (nonatomic,strong)UIButton *endBtn;
@property (nonatomic,strong)UIImageView *topImageView;
@property (nonatomic,strong)UIButton *pkTimeBtn;
@property (nonatomic,strong)UIImageView *leftResult;
@property (nonatomic,strong)UIImageView *rightResult;
@property (nonatomic,strong)UIImageView *bgImageView;
@property (nonatomic,strong)UILabel *titleLabel;
@property (nonatomic,strong)QXRoomSeatPKProgress *progressView;
@property (nonatomic,strong)QXRoomSeatPKSubView *leftRoomView;
@property (nonatomic,strong)QXPKIconView *pkIconView;
@property (nonatomic,strong)QXRoomSeatPKSubView *rightRoomView;
@property (nonatomic,strong)QXRoomSeatTypeNormalView *leftSeatView;
@property (nonatomic,strong)QXRoomSeatTypeNormalView *rightSeatView;
@property (nonatomic,strong)QXRoomPKTimeSetView *timeSetView;
@property (nonatomic,strong)QXTimer *timer;
@property (nonatomic,assign)long startTime;
@property (nonatomic,strong)QXRoomPKResultView *resultView;
@property (nonatomic,strong)UIButton *muteRemoteBtn;
@property (nonatomic,strong)NSString *pk_userId;
@property (nonatomic,strong)QXAlertView *alertView;
@property (nonatomic,assign)BOOL isDefeat;
@end
@implementation QXRoomSeatPKView
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.startBtn = [[UIButton alloc] init];
self.startBtn.hidden = YES;
self.startBtn.backgroundColor = QXConfig.themeColor;
[self.startBtn addRoundedCornersWithRadius:12];
[self.startBtn setTitle:@"开始" forState:(UIControlStateNormal)];
[self.startBtn setTitleColor:QXConfig.btnTextColor forState:(UIControlStateNormal)];
[self.startBtn addTarget:self action:@selector(startAction) forControlEvents:(UIControlEventTouchUpInside)];
self.startBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[self addSubview:self.startBtn];
[self.startBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(7);
make.width.mas_equalTo(46);
make.height.mas_equalTo(24);
make.top.equalTo(self);
}];
self.endBtn = [[UIButton alloc] init];
self.endBtn.hidden = YES;
self.endBtn.backgroundColor = RGB16(0x333333);
[self.endBtn addRoundedCornersWithRadius:12];
[self.endBtn setTitle:@"结束" forState:(UIControlStateNormal)];
[self.endBtn setTitleColor:UIColor.whiteColor forState:(UIControlStateNormal)];
self.endBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[self.endBtn addTarget:self action:@selector(endAction) forControlEvents:(UIControlEventTouchUpInside)];
[self addSubview:self.endBtn];
[self.endBtn mas_makeConstraints:^(MASConstraintMaker *make) {
// [make.left.equalTo(self.startBtn.mas_right).offset(10) priorityHigh];
// [make.left.mas_equalTo(7) priorityLow];
make.left.equalTo(self.startBtn.mas_right).offset(10);
make.width.mas_equalTo(46);
make.height.mas_equalTo(24);
make.top.equalTo(self);
}];
self.topImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_pk_top_bg"]];
[self addSubview:self.topImageView];
[self.topImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.startBtn.mas_bottom);
make.size.mas_equalTo(CGSizeMake(ScaleWidth(122), ScaleWidth(26)));
make.centerX.equalTo(self);
}];
self.pkTimeBtn = [[UIButton alloc] init];
[self.pkTimeBtn setTitle:@"未开始" forState:(UIControlStateNormal)];
self.pkTimeBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[self.pkTimeBtn setTitleColor:UIColor.whiteColor forState:(UIControlStateNormal)];
[self addSubview:self.pkTimeBtn];
[self.pkTimeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.bottom.equalTo(self.topImageView);
}];
self.leftResult.hidden = YES;
[self addSubview:self.leftResult];
[self.leftResult mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.topImageView.mas_left);
make.width.mas_equalTo(ScaleWidth(15));
make.height.mas_equalTo(ScaleWidth(17));
make.centerY.equalTo(self.topImageView);
}];
self.rightResult.hidden = YES;
[self addSubview:self.rightResult];
[self.rightResult mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.topImageView.mas_right);
make.width.mas_equalTo(ScaleWidth(15));
make.height.mas_equalTo(ScaleWidth(17));
make.centerY.equalTo(self.topImageView);
}];
self.leftRoomView = [[QXRoomSeatPKSubView alloc] initWithMyRoom:YES];
[self addSubview:self.leftRoomView];
[self.leftRoomView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self).offset(7);
make.width.mas_equalTo((SCREEN_WIDTH-7*2-4)/2);
make.bottom.equalTo(self);
make.top.equalTo(self.startBtn.mas_bottom).offset(8);
}];
self.rightRoomView = [[QXRoomSeatPKSubView alloc] initWithMyRoom:NO];
[self addSubview:self.rightRoomView];
[self.rightRoomView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self).offset(-7);
make.width.mas_equalTo((SCREEN_WIDTH-7*2-4)/2);
make.bottom.equalTo(self);
make.top.equalTo(self.leftRoomView);
}];
self.progressView = [[QXRoomSeatPKProgress alloc] init];
[self.progressView addRoundedCornersWithRadius:ScaleWidth(8)];
[self addSubview:self.progressView];
[self.progressView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.leftRoomView);
make.right.equalTo(self.rightRoomView);
make.top.equalTo(self.leftRoomView).offset(18);
make.height.mas_equalTo(ScaleWidth(16));
}];
self.pkIconView = [[QXPKIconView alloc] init];
[self addSubview:self.pkIconView];
[self.pkIconView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(ScaleWidth(72), ScaleWidth(72)));
make.centerX.centerY.equalTo(self);
}];
self.leftSeatView = [[QXRoomSeatTypeNormalView alloc] init];
self.leftSeatView.isPKMyRoom = YES;
self.leftSeatView.delegate = self;
[self addSubview:self.leftSeatView];
[self.leftSeatView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self).offset(7);
make.top.equalTo(self.progressView.mas_bottom);
make.bottom.equalTo(self);
make.width.mas_equalTo((SCREEN_WIDTH-7*2-4)/2);
}];
self.rightSeatView = [[QXRoomSeatTypeNormalView alloc] init];
self.rightSeatView.isPKOtherRoom = YES;
self.rightSeatView.delegate = self;
[self addSubview:self.rightSeatView];
[self.rightSeatView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self).offset(-7);
make.top.equalTo(self.progressView.mas_bottom);
make.bottom.equalTo(self);
make.width.mas_equalTo((SCREEN_WIDTH-7*2-4)/2);
}];
self.muteRemoteBtn = [[UIButton alloc] init];
[self.muteRemoteBtn setImage:[UIImage imageNamed:@"room_event_mute_audio_sel"] forState:(UIControlStateNormal)];
[self.muteRemoteBtn setImage:[UIImage imageNamed:@"room_event_mute_audio_nor"] forState:(UIControlStateSelected)];
[self.muteRemoteBtn addTarget:self action:@selector(muteRemoteAction:) forControlEvents:(UIControlEventTouchUpInside)];
self.muteRemoteBtn.hidden = YES;
[self addSubview:self.muteRemoteBtn];
[self.muteRemoteBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(self.rightRoomView).offset(20+ScaleWidth(50));
make.top.equalTo(self.progressView.mas_bottom);
make.size.mas_equalTo(CGSizeMake(30, 30));
}];
}
-(void)setRoomModel:(QXRoomModel *)roomModel{
_roomModel = roomModel;
[self.progressView setLeftProgressWithLeftValue:self.roomModel.pk_info.my_room_value rightValue:self.roomModel.pk_info.pk_room_value];
NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970];
long long milliseconds = (long long)(timeInterval);
self.startTime = self.roomModel.pk_info.pk_end_times.longLongValue - milliseconds;
[self startTimerWithPart:roomModel.pk_info.pk_part];;
self.leftSeatView.roomModel = roomModel;
[self configBtn];
if (roomModel.pk_info.my_room_value.longLongValue > roomModel.pk_info.pk_room_value.longLongValue) {
self.leftResult.image = [UIImage imageNamed:@"room_pk_victory"];
self.rightResult.image = [UIImage imageNamed:@"room_pk_defeated"];
}else if (roomModel.pk_info.my_room_value.longLongValue < roomModel.pk_info.pk_room_value.longLongValue) {
//
self.resultView.type = QXRoomPKResulttTypeDefeated;
self.leftResult.image = [UIImage imageNamed:@"room_pk_defeated"];
}else{
self.leftResult.image = [UIImage imageNamed:@"room_pk_tie"];
self.rightResult.image = [UIImage imageNamed:@"room_pk_tie"];
}
}
-(void)configBtn{
if (self.roomModel.pk_info.pk_part.intValue == 2) {
if ([self.roomModel.pk_info.invite_pk_user_id isEqualToString:QXGlobal.shareGlobal.loginModel.user_id] && self.leftSeatView.myPitNumber == 9) {
self.startBtn.hidden = NO;
}else{
self.startBtn.hidden = YES;
}
if (self.leftSeatView.myPitNumber == 9) {
self.endBtn.hidden = NO;
}else{
self.endBtn.hidden = YES;
}
}else if (self.roomModel.pk_info.pk_part.intValue == 3) {
if (self.leftSeatView.myPitNumber == 9) {
self.endBtn.hidden = NO;
}else{
self.endBtn.hidden = YES;
}
self.startBtn.hidden = YES;
}else if (self.roomModel.pk_info.pk_part.intValue == 4) {
if (self.leftSeatView.myPitNumber == 9) {
self.endBtn.hidden = NO;
}else{
self.endBtn.hidden = YES;
}
self.startBtn.hidden = YES;
}
if (self.leftSeatView.myPitNumber == 9) {
self.muteRemoteBtn.hidden = NO;
}else{
self.muteRemoteBtn.hidden = YES;
}
}
-(void)setPkRoomModel:(QXRoomModel *)pkRoomModel{
_pkRoomModel = pkRoomModel;
for (QXRoomPitModel*model in pkRoomModel.room_info.pit_list) {
if (model.pit_number.intValue == 9) {
self.pk_userId = model.user_id;
break;
}
}
self.rightSeatView.roomModel = pkRoomModel;
}
-(void)setMyPitNumber:(NSInteger)myPitNumber{
_myPitNumber = myPitNumber;
self.leftSeatView.myPitNumber = myPitNumber;
}
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number{
if ([user.user_id isEqualToString:[QXGlobal shareGlobal].loginModel.user_id]) {
if (isUpSeat) {
self.myPitNumber = pit_number;
if (self.myPitNumber == 9) {
self.muteRemoteBtn.hidden = NO;
}
}else{
self.myPitNumber = -1;
self.muteRemoteBtn.hidden = YES;
}
}
[self.leftSeatView didUpDownSeatWithUser:user isUpSeat:isUpSeat pit_number:pit_number];
}
-(void)roomSeatExchangedWithFromPitNumber:(NSInteger)fromPitNumber toPitNumber:(NSInteger)toPitNumber userInfo:(QXUserHomeModel*)userInfo{
[self.leftSeatView roomSeatExchangedWithFromPitNumber:fromPitNumber toPitNumber:toPitNumber userInfo:userInfo];
}
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user{
[self.leftSeatView roomUserInfoDidChanged:user];
}
-(void)clearCharm{
[self.leftSeatView clearCharm];
}
-(void)playHWDMP4{
[self.leftSeatView playHWDMP4];
}
-(void)stopHWDMP4{
[self.leftSeatView stopHWDMP4];
}
-(void)roomClearUserCharmWithUserId:(NSString *)userId{
[self.leftSeatView roomClearUserCharmWithUserId:userId];
}
-(void)setSeatIsLock:(NSString *)isLock pitNumber:(NSString *)pitNumber{
[self.leftSeatView setSeatIsLock:isLock pitNumber:pitNumber];
}
-(void)setSeatCharmWithUser:(QXUserHomeModel *)model{
[self.leftSeatView setSeatCharmWithUser:model];
}
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel *> *)users{
[self.leftSeatView setSeatCharmWithUsers:users];
}
-(void)startAction{
self.timeSetView.pkId = self.roomModel.pk_info.pk_id;
[self.timeSetView showInView:self.viewController.view];
}
-(void)endAction{
MJWeakSelf
if (self.roomModel.pk_info.pk_part.intValue == 4 && self.isDefeat) {
self.alertView.message = @"惩罚阶段结束PK需对方主持同意是否发起结束";
}else{
self.alertView.message = @"是否提前结束本场PK";
}
self.alertView.commitBlock = ^{
[QXMineNetwork roomPkEndWithPk_id:weakSelf.roomModel.pk_info.pk_id type:@"3" user_id:[QXGlobal shareGlobal].loginModel.user_id successBlock:^(NSDictionary * _Nonnull dict) {
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
showToast(msg);
}];
};
[[QXGlobal shareGlobal] showView:self.alertView controller:self.viewController.navigationController popType:(PopViewTypePopFromCenter) tapDismiss:NO finishBlock:^{
}];
}
-(void)muteRemoteAction:(UIButton*)sender{
// [[QXAgoraEngineEx sharedEngine] muteRemoteEXAudioStream:sender.selected];
// return;
sender.selected = !sender.selected;
NSDictionary *dict = @{
@"is_mute":[NSNumber numberWithInteger:sender.selected?1:0],
};
NSString *jsonStr = [dict jsonStringEncoded];
[[QXRoomMessageManager shared] sendC2CMessage:jsonStr messageType:QXRoomMessageTypeMuteRemoteAudio userId:self.pk_userId];
[[QXAgoraEngineEx sharedEngine] muteRemoteEXAudioStream:sender.selected];
}
-(void)didClickUserHeaderWithPitModel:(QXRoomPitModel *)pitModel userModel:(id)userModel isPkRoom:(BOOL)isPkRoom pkRoomId:(NSString *)pkRoomId isNoTakeOff:(BOOL)isNoTakeOff{
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickUserHeaderWithPitModel:userModel:isPkRoom:pkRoomId:isNoTakeOff:)]) {
[self.delegate didClickUserHeaderWithPitModel:pitModel userModel:nil isPkRoom:isPkRoom pkRoomId:pkRoomId isNoTakeOff:isNoTakeOff];
}
}
-(void)didHugSeatWithPitNumber:(NSString *)pitNumber{
if (self.delegate && [self.delegate respondsToSelector:@selector(didHugSeatWithPitNumber:)]) {
[self.delegate didHugSeatWithPitNumber:pitNumber];
}
}
-(void)pkStartWithPkEndTimes:(NSString *)pk_end_times pk_id:(nonnull NSString *)pk_id{
self.roomModel.pk_info.pk_id = pk_id;
self.roomModel.pk_info.pk_part = @"3";
// [self.pkTimeBtn setTitle:@"未开始" forState:(UIControlStateNormal)];
NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970];
long long milliseconds = (long long)(timeInterval);
self.startTime = pk_end_times.longLongValue - milliseconds;
[self startTimerWithPart:@"3"];
[self configBtn];
}
-(void)roomPKValueDidChangedWithRoomIdA:(NSString *)room_id_a create_value_a:(NSString *)create_value_a room_id_b:(NSString *)room_id_b receive_value_b:(NSString *)receive_value_b{
if ([room_id_a isEqualToString:self.roomModel.room_info.room_id]) {
self.roomModel.pk_info.my_room_value = create_value_a;
self.roomModel.pk_info.pk_room_value = receive_value_b;
[self.progressView setLeftProgressWithLeftValue:self.roomModel.pk_info.my_room_value rightValue:self.roomModel.pk_info.pk_room_value];
}else{
self.roomModel.pk_info.my_room_value = receive_value_b;
self.roomModel.pk_info.pk_room_value = create_value_a;
[self.progressView setLeftProgressWithLeftValue:self.roomModel.pk_info.my_room_value rightValue:self.roomModel.pk_info.pk_room_value];
}
}
/// pk
-(void)pkResultWithIsVictory:(NSInteger)isVictory
end_time:(NSString*)end_time
victory_name:(NSString*)victory_name
victory_cover:(NSString*)victory_cover
defeated_name:(NSString*)defeated_name
defeated_cover:(NSString*)defeated_cover{
self.leftResult.hidden = NO;
self.rightResult.hidden = NO;
if (isVictory == 1) {
//
self.resultView.type = QXRoomPKResulttTypeVictory;
self.leftResult.image = [UIImage imageNamed:@"room_pk_victory"];
self.rightResult.image = [UIImage imageNamed:@"room_pk_defeated"];
}else if (isVictory == 0){
//
self.resultView.type = QXRoomPKResulttTypeDefeated;
self.leftResult.image = [UIImage imageNamed:@"room_pk_defeated"];
self.rightResult.image = [UIImage imageNamed:@"room_pk_victory"];
self.isDefeat = YES;
}else{
self.leftResult.image = [UIImage imageNamed:@"room_pk_tie"];
self.rightResult.image = [UIImage imageNamed:@"room_pk_tie"];
self.resultView.type = QXRoomPKResulttTypeTie;
}
[self.resultView setResultWithVictory_name:victory_name victory_cover:victory_cover defeated_name:defeated_name defeated_cover:defeated_cover];
[self.resultView showInView:self.viewController.view];
self.roomModel.pk_info.pk_part = @"4";
self.roomModel.pk_info.pk_end_times = end_time;
NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970];
long long milliseconds = (long long)(timeInterval);
self.startTime = end_time.longLongValue - milliseconds;
[self startTimerWithPart:@"4"];
}
-(void)startTimerWithPart:(NSString*)part{
__block NSString *str = @"";
if (part.intValue == 2) {
str = @"等待开始";
}else if (part.intValue == 3){
str = @"进行中";
}else if (part.intValue == 4){
str = @"惩罚时间";
}
if (_timer) {
[_timer invalidate];
_timer = nil;
}
MJWeakSelf
_timer = [QXTimer scheduledTimerWithTimeInterval:1 repeats:YES queue:dispatch_get_main_queue() block:^{
weakSelf.startTime--;
if (weakSelf.startTime <= 0) {
[weakSelf endTimer];
}else{
[self.pkTimeBtn setTitle:[NSString stringWithFormat:@"%@ %02ld:%02ld",str,weakSelf.startTime/60,weakSelf.startTime%60] forState:(UIControlStateNormal)];
}
}];
}
-(void)endTimer{
if (_timer) {
[self->_timer invalidate];
self->_timer = nil;
[self.pkTimeBtn setTitle:@"00:00" forState:(UIControlStateNormal)];
}
}
-(void)destroyViews{
[self.leftSeatView destroyViews];
[self.rightSeatView destroyViews];
}
-(QXRoomPKTimeSetView *)timeSetView{
if (!_timeSetView) {
_timeSetView = [[QXRoomPKTimeSetView alloc] init];
}
return _timeSetView;
}
-(QXRoomPKResultView *)resultView{
if (!_resultView ) {
_resultView = [[QXRoomPKResultView alloc] initWithType:(QXRoomPKResulttTypeTie)];
}
return _resultView;
}
-(UIImageView *)leftResult{
if (!_leftResult) {
_leftResult = [[UIImageView alloc] init];
}
return _leftResult;
}
-(UIImageView *)rightResult{
if (!_rightResult) {
_rightResult = [[UIImageView alloc] init];
}
return _rightResult;
}
-(QXAlertView *)alertView{
if (!_alertView) {
_alertView = [[QXAlertView alloc] initWithFrame:CGRectMake(0, 0, ScaleWidth(300), ScaleWidth(175))];
}
return _alertView;
}
@end
@implementation QXPKIconView
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.pkImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_pk_icon"]];
[self addSubview:self.pkImageView];
[self.pkImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.right.left.equalTo(self);
}];
}
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
UIView *hitView= [super hitTest:point withEvent:event];
if (hitView== self)
{
return nil;
}
else
{
return hitView;
}
}
@end
@implementation QXRoomSeatPKSubView
-(instancetype)initWithMyRoom:(BOOL)isMyRoom{
if (self = [super init]) {
_isMyRoom = isMyRoom;
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:self.isMyRoom?@"room_pk_left_bg":@"room_pk_right_bg"]];
self.bgImageView.contentMode = UIViewContentModeScaleToFill;
[self addSubview:self.bgImageView];
[self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.left.right.equalTo(self);
}];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.font = [UIFont systemFontOfSize:12];
self.titleLabel.textColor = UIColor.whiteColor;
[self addSubview:self.titleLabel];
if (self.isMyRoom) {
self.titleLabel.text = @"我方";
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self).offset(6);
make.top.equalTo(self).offset(2);
}];
}else{
self.titleLabel.text = @"对方";
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self).offset(-6);
make.top.equalTo(self).offset(2);
}];
}
}
@end
@implementation QXRoomSeatPKProgress
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.leftView = [[UIView alloc] init];
self.leftView.backgroundColor = [UIColor sh_getColorOfPercent:0.5 between:RGB16(0x72C1F8) and:RGB16(0x6785F6)];
[self addSubview:self.leftView];
[self.leftView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self);
make.top.bottom.equalTo(self);
make.width.equalTo(self.mas_width).multipliedBy(0.5);
}];
self.rightView = [[UIView alloc] init];
self.rightView.backgroundColor = [UIColor sh_getColorOfPercent:0.5 between:RGB16(0x3F1D71) and:RGB16(0x3F1D73)];
[self addSubview:self.rightView];
[self.rightView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.leftView.mas_right);
make.top.bottom.equalTo(self);
make.right.equalTo(self);
}];
self.leftTitleLabel = [[UILabel alloc] init];
self.leftTitleLabel.font = [UIFont systemFontOfSize:12];
self.leftTitleLabel.textColor = UIColor.whiteColor;
self.leftTitleLabel.text = @"0";
[self addSubview:self.leftTitleLabel];
[self.leftTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self).offset(6);
make.top.bottom.equalTo(self);
}];
self.rightTitleLabel = [[UILabel alloc] init];
self.rightTitleLabel.font = [UIFont systemFontOfSize:12];
self.rightTitleLabel.textColor = UIColor.whiteColor;
self.rightTitleLabel.text = @"0";
[self addSubview:self.rightTitleLabel];
[self.rightTitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self).offset(-6);
make.top.bottom.equalTo(self);
}];
}
-(void)setLeftProgressWithLeftValue:(NSString *)leftValue rightValue:(NSString *)rightValue{
self.leftTitleLabel.text = leftValue;
self.rightTitleLabel.text = rightValue;
if (leftValue.longLongValue==0 && rightValue.longLongValue==0) {
return;
}
CGFloat ratio = (double)leftValue.longLongValue/(leftValue.longLongValue + rightValue.longLongValue);
[UIView animateWithDuration:0.2 animations:^{
[self.leftView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self);
make.top.bottom.equalTo(self);
make.width.equalTo(self.mas_width).multipliedBy(ratio);
}];
}];
}
@end

View File

@@ -0,0 +1,72 @@
//
// QXRoomSeatTypeAuctionView.h
// QXLive
//
// Created by 启星 on 2025/6/23.
//
#import <UIKit/UIKit.h>
#import "QXRoomSeatContentView.h"
#import "QXRoomSeatDelegate.h"
#import "QXUserModel.h"
#import "QXSelectAuctionInfoView.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXRoomSeatTypeAuctionView : UIView
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
@property (nonatomic,strong)QXRoomModel *roomModel;
@property (nonatomic,assign)NSInteger myPitNumber;
@property (nonatomic,strong)QXSelectAuctionInfoView *auctionInfoView;
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number;
/// 拍卖者上麦
-(void)didAuctiontUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat;
/// 开始
-(void)auctionStartOrEndIsStart:(BOOL)isStart user:(QXRoomAuctionUser *)user getUser:(QXRoomAuctionUser *)getUser;
/// 竞拍列表发生变化
-(void)auctionListDidChanged:(NSArray<QXRoomPitModel*> *)list;
/// 拍卖时间发生延时
-(void)auctionDelayTimeWithEndTime:(NSString *)endTime;
/// 拍卖类型发生变化
-(void)auctionTypeDidChanged:(NSString *)type;
-(void)setSeatCharmWithUser:(QXUserHomeModel *)model;
/// 设置多人魅力
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel*>*)users;
/// 清除魅力
-(void)clearCharm;
/// 清除个人魅力
-(void)roomClearUserCharmWithUserId:(NSString *)userId;
/// 房间内用户信息发生变化
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user;
-(void)stopHWDMP4;
-(void)playHWDMP4;
-(void)destroyViews;
@end
@interface QXRoomAuctionSeatView : UIView
@property (nonatomic,strong)UIView* bgView;
@property (nonatomic,strong)UIImageView* bgImageView;
@property (nonatomic,strong)UIImageView* rankView;
@property (nonatomic,strong)QXRoomSeatContentView *seatView;
/// 人气
@property (nonatomic,strong)UIView *auctionCharmView;
@property (nonatomic,strong)UIImageView *auctionCharmBgImageView;
@property (nonatomic,strong)UILabel *charmLabel;
@property (nonatomic,strong)QXRoomPitModel *pitModel;
-(void)resetViews;
@end
@interface QXRoomAuctionPriceView : UIView
@property (nonatomic,strong)UIImageView* imageView;
@property (nonatomic,strong)UILabel* titleLabel;
@end
NS_ASSUME_NONNULL_END

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,25 @@
//
// QXRoomSeatTypeCabinView.h
// QXLive
//
// Created by 启星 on 2025/7/1.
//
#import <UIKit/UIKit.h>
#import "QXRoomModel.h"
#import "QXRoomSeatDelegate.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXRoomSeatTypeCabinView : UIView
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
@property (nonatomic,strong)QXRoomModel *roomModel;
-(void)cabinRoomHotValueDidChanged:(NSString*)hot_value;
-(void)friendCabinRoomTimeDelayWithTime:(NSString*)end_time;
-(void)friendCabinRoomIsQuit;
-(void)stopHWDMP4;
-(void)playHWDMP4;
-(void)destroyViews;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,373 @@
//
// QXRoomSeatTypeCabinView.m
// QXLive
//
// Created by on 2025/7/1.
//
#import "QXRoomSeatTypeCabinView.h"
#import "QXRoomSeatContentView.h"
#import "QXTimer.h"
#import "QXAgoraEngine.h"
@interface QXRoomSeatTypeCabinView()
//
@property (nonatomic,strong)UIImageView *timeDownBgView;
@property (nonatomic,strong)UILabel *timeDownLabel;
@property (nonatomic,strong)QXRoomSeatContentView *leftSeatView;
@property (nonatomic,strong)UIImageView *bgImageView;
@property (nonatomic,strong)UIImageView *heartCenterImageView;
@property (nonatomic,strong)UILabel *numberLabel;
@property (nonatomic,strong)UIButton *giftBtn;
@property (nonatomic,strong)UIButton *micBtn;
@property (nonatomic,strong)UIButton *movieBtn;
@property (nonatomic,strong)QXRoomSeatContentView *rightSeatView;
@property (nonatomic,strong)QXTimer *timer;
@property (nonatomic,assign)long startTime;
/// 退
@property (nonatomic,strong) UIButton *closeBtn;
///
@property (nonatomic,strong) UILabel *titleLabel;
@end
@implementation QXRoomSeatTypeCabinView
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.text = @"房间名称";
self.titleLabel.font = [UIFont systemFontOfSize:14];
self.titleLabel.textColor = [UIColor whiteColor];
[self addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(2);
make.left.mas_equalTo(16);
make.height.mas_equalTo(ScaleWidth(30));
}];
self.closeBtn = [[UIButton alloc] init];
[self.closeBtn addTarget:self action:@selector(closeAction) forControlEvents:(UIControlEventTouchUpInside)];
[self.closeBtn setImage:[UIImage imageNamed:@"room_close"] forState:(UIControlStateNormal)];
[self addSubview:self.closeBtn];
[self.closeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.height.mas_equalTo(ScaleWidth(40));
make.right.mas_equalTo(-5);
make.centerY.equalTo(self.titleLabel);
}];
self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_friend_cabin_bg"]];
self.bgImageView.contentMode = UIViewContentModeScaleToFill;
[self addSubview:self.bgImageView];
[self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.equalTo(self);
make.height.mas_equalTo(ScaleWidth(330));
}];
self.heartCenterImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_cabin_heart"]];
[self addSubview:self.heartCenterImageView];
[self.heartCenterImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self.bgImageView);
make.centerY.equalTo(self.bgImageView);
make.height.mas_equalTo(ScaleWidth(80));
make.width.mas_equalTo(ScaleWidth(160));
}];
self.numberLabel = [[UILabel alloc] init];
self.numberLabel.text = @"0";
self.numberLabel.textAlignment = NSTextAlignmentCenter;
self.numberLabel.textColor = [UIColor colorWithHexString:@"#ffffff"];
self.numberLabel.font = [UIFont fontWithName:@"DIN Alternate" size:18];
[self addSubview:self.numberLabel];
[self.numberLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.heartCenterImageView).offset(-5);
make.centerX.equalTo(self.heartCenterImageView);
}];
self.leftSeatView = [[QXRoomSeatContentView alloc] init];
[self addSubview:self.leftSeatView];
[self.leftSeatView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.heartCenterImageView.mas_left);
make.width.mas_equalTo(ScaleWidth(75));
make.height.mas_equalTo(ScaleWidth(75)+25);
make.top.equalTo(self.heartCenterImageView).offset(-7);
}];
self.rightSeatView = [[QXRoomSeatContentView alloc] init];
[self addSubview:self.rightSeatView];
[self.rightSeatView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.heartCenterImageView.mas_right);
make.width.mas_equalTo(ScaleWidth(75));
make.height.mas_equalTo(ScaleWidth(75)+25);
make.top.equalTo(self.leftSeatView);
}];
self.timeDownLabel = [[UILabel alloc] initWithFrame:self.timeDownBgView.frame];
self.timeDownLabel.textColor = [UIColor colorWithHexString:@"#ffffff"];
self.timeDownLabel.font = [UIFont systemFontOfSize:12];
self.timeDownLabel.text = @"到期时间00:00:00";
self.timeDownLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:self.timeDownLabel];
[self.timeDownLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.top.equalTo(self.heartCenterImageView.mas_bottom).offset(21);
make.height.mas_equalTo(24);
}];
self.timeDownBgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"room_cabin_timedown_bg"]];
self.timeDownBgView.contentMode = UIViewContentModeScaleToFill;
[self insertSubview:self.timeDownBgView belowSubview:self.timeDownLabel];
[self.timeDownBgView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.timeDownLabel);
}];
CGFloat margin = (SCREEN_WIDTH-88*3)/4;
self.micBtn = [[UIButton alloc] init];
[self.micBtn setImage:[UIImage imageNamed:@"room_cabin_open"] forState:(UIControlStateNormal)];
[self.micBtn setImage:[UIImage imageNamed:@"room_cabin_close"] forState:(UIControlStateSelected)];
[self.micBtn addTarget:self action:@selector(micAction) forControlEvents:(UIControlEventTouchUpInside)];
[self addSubview:self.micBtn];
[self.micBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(0);
make.left.mas_equalTo(margin);
make.width.mas_equalTo(88);
make.height.mas_equalTo(108);
}];
self.giftBtn = [[UIButton alloc] init];
[self.giftBtn setImage:[UIImage imageNamed:@"room_cabin_gift"] forState:(UIControlStateNormal)];
[self.giftBtn addTarget:self action:@selector(giftAction) forControlEvents:(UIControlEventTouchUpInside)];
[self addSubview:self.giftBtn];
[self.giftBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.micBtn);
make.left.equalTo(self.micBtn.mas_right).offset(margin);
make.width.mas_equalTo(88);
make.height.mas_equalTo(108);
}];
self.movieBtn = [[UIButton alloc] init];
[self.movieBtn setImage:[UIImage imageNamed:@"room_cabin_movie"] forState:(UIControlStateNormal)];
[self.movieBtn addTarget:self action:@selector(movieAction) forControlEvents:(UIControlEventTouchUpInside)];
[self addSubview:self.movieBtn];
[self.movieBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.giftBtn.mas_right).offset(margin);
make.bottom.equalTo(self.micBtn);
make.width.mas_equalTo(88);
make.height.mas_equalTo(108);
}];
// [[QXAgoraEngine sharedEngine].agoraKit muteAllRemoteVideoStreams:NO];
// [[QXAgoraEngine sharedEngine] startPreViewWithUid:54 view:self];
}
-(void)setRoomModel:(QXRoomModel *)roomModel{
_roomModel = roomModel;
QXRoomPitModel *pit1 = [[QXRoomPitModel alloc] init];
QXRoomPitModel *pit2 = [[QXRoomPitModel alloc] init];;
if ([roomModel.cp_user.user_id isEqualToString:QXGlobal.shareGlobal.loginModel.user_id]) {
pit1.user_id = roomModel.cp_user.user_id;
pit1.nickname = roomModel.cp_user.nickname;
pit1.dress = roomModel.cp_user.dress;
pit1.avatar = roomModel.cp_user.avatar;
pit2.user_id = roomModel.cp_user.user_id1;
pit2.nickname = roomModel.cp_user.nickname1;
pit2.dress = roomModel.cp_user.dress1;
pit2.avatar = roomModel.cp_user.avatar1;
}else{
pit2.user_id = roomModel.cp_user.user_id;
pit2.nickname = roomModel.cp_user.nickname;
pit2.dress = roomModel.cp_user.dress;
pit2.avatar = roomModel.cp_user.avatar;
pit1.user_id = roomModel.cp_user.user_id1;
pit1.nickname = roomModel.cp_user.nickname1;
pit1.dress = roomModel.cp_user.dress1;
pit1.avatar = roomModel.cp_user.avatar1;
}
self.leftSeatView.pitModel = pit1;
self.rightSeatView.pitModel = pit2;
[self.leftSeatView hideCharm];
[self.rightSeatView hideCharm];
self.titleLabel.text = self.roomModel.room_info.room_name;
self.numberLabel.text = self.roomModel.room_info.hot_value;
if ([self.roomModel.room_info.label_id isEqualToString:@"5"]) {
///
[self startTimer];
}else{
NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970];
long long milliseconds = (long long)(timeInterval);
long long time = roomModel.cp_user.time_day.longLongValue - milliseconds;
self.timeDownLabel.text = [NSString stringWithFormat:@"到期时间:%@",[NSString getTimeWithSecond:time]];
}
if (![roomModel.room_owner.user_id isEqualToString:QXGlobal.shareGlobal.loginModel.user_id]) {
self.movieBtn.hidden = YES;
CGFloat margin = (SCREEN_WIDTH-88*2)/3;
[self.micBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(0);
make.left.mas_equalTo(margin);
make.width.mas_equalTo(88);
make.height.mas_equalTo(108);
}];
[self.giftBtn mas_remakeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self.micBtn);
make.left.equalTo(self.micBtn.mas_right).offset(margin);
make.width.mas_equalTo(88);
make.height.mas_equalTo(108);
}];
}
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.viewController.view endEditing:YES];
}
-(void)giftAction{
if (self.delegate && [self.delegate respondsToSelector:@selector(sendGiftWithUser:)]) {
[self.delegate sendGiftWithUser:self.rightSeatView.pitModel];
}
}
-(void)micAction{
self.micBtn.selected = !self.micBtn.selected;
[[QXAgoraEngine sharedEngine] enableAudio:self.micBtn.selected];
if (self.micBtn.isSelected) {
[[QXAgoraEngine sharedEngine] setClientRoleBroadcaster:YES];
[[QXAgoraEngine sharedEngine] muteLocalAudioStream:NO];
}else{
}
}
-(void)movieAction{
//
[[QXAgoraEngine sharedEngine] startScreenCapture];
}
-(void)startTimer{
MJWeakSelf
NSTimeInterval timeInterval = [[NSDate date] timeIntervalSince1970];
//
long long milliseconds = (long long)(timeInterval);
self.startTime = self.roomModel.cp_user.time_day.longLongValue - milliseconds;
if (self.startTime <= 0) {
//
self.timeDownLabel.text = @"倒计时00:00:00";
return;
}
[self stopTimer];
_timer = [QXTimer scheduledTimerWithTimeInterval:1 repeats:YES queue:dispatch_get_main_queue() block:^{
dispatch_async(dispatch_get_main_queue(), ^{
weakSelf.startTime--;
NSInteger hour = self.startTime/60/60;
NSInteger min = (self.startTime % 3600) / 60;
NSInteger second = self.startTime % 60;
weakSelf.timeDownLabel.text = [NSString stringWithFormat:@"倒计时:%02ld:%02ld:%02ld",hour,min,(long)second];
if (weakSelf.startTime<=0) {
[weakSelf stopTimer];
weakSelf.timeDownLabel.text = @"00:00:00";
}
});
}];
}
-(void)stopTimer{
if (_timer) {
[self->_timer invalidate];
self->_timer= nil;
}
}
-(void)cabinRoomHotValueDidChanged:(NSString *)hot_value{
self.roomModel.room_info.hot_value = hot_value;
self.numberLabel.text = self.roomModel.room_info.hot_value;
}
-(void)friendCabinRoomTimeDelayWithTime:(NSString*)end_time{
self.roomModel.cp_user.time_day = end_time;
[self startTimer];
}
-(void)closeAction{
MJWeakSelf
UIAlertController *al = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:(UIAlertControllerStyleActionSheet)];
// [al addAction:[UIAlertAction actionWithTitle:@"最小化房间" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
// [weakSelf miniRoom];
// [[QXGlobal shareGlobal] miniRoomWithRoomId:weakSelf.roomModel.room_info.room_id roomCover:weakSelf.roomModel.room_info.room_cover];
// }]];
[al addAction:[UIAlertAction actionWithTitle:@"退出房间" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {
[weakSelf leaveRoom];
}]];
[al addAction:[UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {
}]];
[self.viewController presentViewController:al animated:YES completion:nil];
}
-(void)friendCabinRoomIsQuit{
}
-(void)miniRoom{
// self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.navigationController popViewControllerAnimated:YES];
}
-(void)leaveRoom{
UINavigationController *na = (UINavigationController *)KEYWINDOW.rootViewController;
if ([self.roomModel.room_info.type_id isEqualToString:@"6"] && [self.roomModel.room_info.label_id isEqualToString:@"5"]) {
[[QXGlobal shareGlobal]quitRoomWithRoomId:self.roomModel.room_info.room_id];
NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:na.viewControllers];
for (int i = 0; i < viewControllers.count; i++) {
UIViewController *vc = [viewControllers objectAtIndex:i];
if ([vc isEqual:self.viewController]) {
QXRoomViewController *roomVc = [[QXRoomViewController alloc] init];
roomVc.roomId = QXGlobal.shareGlobal.superRoomId;
[viewControllers insertObject:roomVc atIndex:i];
break;
}
}
[UIApplication sharedApplication].idleTimerDisabled = YES;
na.viewControllers = viewControllers;
[na popViewControllerAnimated:YES];
QXGlobal.shareGlobal.superRoomId = @"";
}else{
[[QXGlobal shareGlobal]quitRoomWithRoomId:self.roomModel.room_info.room_id];
// self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[na popViewControllerAnimated:YES];
}
}
-(void)stopHWDMP4{
[self.leftSeatView stopHWDMP4];
[self.rightSeatView stopHWDMP4];
}
-(void)playHWDMP4{
[self.leftSeatView playHWDMP4];
[self.rightSeatView playHWDMP4];
}
-(void)destroyViews{
if (_leftSeatView) {
[_leftSeatView destroyViews];
_leftSeatView = nil;
}
if (_rightSeatView) {
[_rightSeatView destroyViews];
_rightSeatView = nil;
}
[self stopTimer];
}
@end

View File

@@ -0,0 +1,73 @@
//
// QXRoomSeatTypeFrientView.h
// QXLive
//
// Created by 启星 on 2025/8/18.
//
#import <UIKit/UIKit.h>
#import "QXUserModel.h"
#import "QXRoomModel.h"
#import "QXRoomSeatDelegate.h"
#import "QXRoomSeatContentView.h"
typedef NS_ENUM(NSInteger) {
/// 等待
QXSeatTypeFrientPartTypeWait = 1,
/// 心动
QXSeatTypeFrientPartTypeHeart = 2,
/// 牵手
QXSeatTypeFrientPartTypeHand = 3,
}QXSeatTypeFrientPartType;
@interface QXRoomSeatTypeFrientView : UIView
/// 房间数据
@property (nonatomic,strong)QXRoomModel *roomModel;
/// 我自己的麦位
@property (nonatomic,assign)NSInteger myPitNumber;
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
/// 上下麦
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number;
/// 交友房阶段发生变化 step 阶段 1等待 2心动 3牵手 friend_id 场次id
-(void)friendPartDidChangedWithType:(NSString*)step friend_id:(NSString*)friend_id end_time:(NSString*)end_time relationModel:(QXRoomFriendRelationModel*)relationModel;
/// 交友房时间发生延时 end_time 截止时间
-(void)friendTimeDelayWithTime:(NSString*)end_time;
/// 交友房麦位发生变化
-(void)friendSeatDidChanged:(NSArray<QXRoomPitModel*>*)pitArray;
/// 交友心动发生变化 [1000,100,50] 三组数据
-(void)friendHeartNumberDidChanged:(NSArray<QXRoomFriendHeartListModel *> *)heartArray;
/// 关系创建完成
-(void)friendRelationIsCreatedWithrelationModel:(QXRoomFriendRelationModel*)relationModel;
/// 清除魅力
-(void)clearCharm;
/// 清除个人魅力
-(void)roomClearUserCharmWithUserId:(NSString *)userId;
/// 设置魅力
-(void)setSeatCharmWithUser:(QXUserHomeModel*)model;
/// 设置多人魅力
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel*>*)users;
/// 用户信息发生改变
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user;
/// 房间内换麦
-(void)roomSeatExchangedWithFromPitNumber:(NSInteger)fromPitNumber toPitNumber:(NSInteger)toPitNumber userInfo:(QXUserHomeModel*)userInfo;
-(void)stopHWDMP4;
-(void)playHWDMP4;
/// 销毁视图
-(void)destroyViews;
@end
@interface QXFrientSeatView : UIView
@property (nonatomic,strong)QXRoomSeatContentView *contentView;
@property (nonatomic,strong)UIButton *powerBtn;
@property (nonatomic,assign)BOOL isLeft;
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
@property (nonatomic,strong)QXRoomFriendHeartListModel *heartModel;
@end

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,52 @@
//
// QXRoomSeatTypeNormalView.h
// QXLive
//
// Created by 启星 on 2025/6/7.
//
#import <UIKit/UIKit.h>
#import "QXRoomModel.h"
#import "QXUserModel.h"
#import "QXRoomSeatContentView.h"
#import "QXRoomSeatDelegate.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXRoomSeatTypeNormalView : UIView
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
@property (nonatomic,assign)BOOL isPKMyRoom;
@property (nonatomic,assign)BOOL isPKOtherRoom;
@property (nonatomic,strong)QXRoomModel *roomModel;
/// seatArray
@property (nonatomic,strong)NSMutableArray *seatArray;
@property (nonatomic,assign)NSInteger myPitNumber;
@property (nonatomic,strong)QXRoomSeatContentView* mySeatView;
/// 上下麦
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number;
/// 清除魅力
-(void)clearCharm;
/// 清除个人魅力
-(void)roomClearUserCharmWithUserId:(NSString *)userId;
/// 设置魅力
-(void)setSeatCharmWithUser:(QXUserHomeModel *)model;
/// 设置多人魅力
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel*>*)users;
/// 设置麦位锁麦状态
-(void)setSeatIsLock:(NSString*)isLock pitNumber:(NSString*)pitNumber;
/// 房间内用户信息发生变化
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user;
/// 房间内换麦
-(void)roomSeatExchangedWithFromPitNumber:(NSInteger)fromPitNumber toPitNumber:(NSInteger)toPitNumber userInfo:(QXUserHomeModel*)userInfo;
-(void)stopHWDMP4;
-(void)playHWDMP4;
-(void)destroyViews;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,460 @@
//
// QXRoomSeatTypeNormalView.m
// QXLive
//
// Created by on 2025/6/7.
//
#import "QXRoomSeatTypeNormalView.h"
#import "QXRoomSeatContentView.h"
#import "QXMineNetwork.h"
#import "QXRoomSeatSettingView.h"
static NSInteger maxSeat = 8;
@interface QXRoomSeatTypeNormalView()<QXRoomSeatDelegate>
///
@property (nonatomic,strong)QXRoomSeatContentView *compereView;
///
@property (nonatomic,strong)QXRoomSeatContentView *guestView;
@property (nonatomic,strong)UIScrollView *scrollView;
@property (nonatomic,strong)QXRoomSeatSettingView *settingView;
@end
@implementation QXRoomSeatTypeNormalView
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
MJWeakSelf
self.compereView = [[QXRoomSeatContentView alloc] init];
// [self.compereView addTapBlock:^(id _Nonnull obj) {
// [weakSelf didClickSeatView:obj];
// }];
self.compereView.delegate = self;
self.compereView.tagString = QXText(@"主持");
self.compereView.number = 9;
[self addSubview:self.compereView];
CGFloat margin = (SCREEN_WIDTH/2-ScaleWidth(70))/2;
[self.compereView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self);
make.width.mas_equalTo(ScaleWidth(70));
make.height.mas_equalTo(ScaleWidth(70-10)+51);
make.left.mas_equalTo(margin);
}];
self.guestView = [[QXRoomSeatContentView alloc] init];
self.guestView.tagString = QXText(@"嘉宾");
self.guestView.number = 10;
// [self.guestView addTapBlock:^(id _Nonnull obj) {
// [weakSelf didClickSeatView:obj];
// }];
self.guestView.delegate = self;
[self addSubview:self.guestView];
[self.guestView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self);
make.width.mas_equalTo(ScaleWidth(70));
make.height.mas_equalTo(ScaleWidth(70-10)+51);
make.right.mas_equalTo(-margin);
}];
NSInteger lineItemCount = 4;
CGFloat leftMargin = 20;
CGFloat topSpace = 0;
CGFloat seatWidth = ScaleWidth(60);
CGFloat seatHeight = ScaleWidth(60-10)+51;
CGFloat itemSpace = (SCREEN_WIDTH-leftMargin*2-seatWidth*lineItemCount)/(lineItemCount-1);
for (int i = 0 ; i < maxSeat ; i++) {
QXRoomSeatContentView *contentView = [[QXRoomSeatContentView alloc] init];
contentView.number = i+1;
contentView.noOffLine = YES;
// [contentView addTapBlock:^(id _Nonnull obj) {
// [weakSelf didClickSeatView:obj];
// }];
contentView.delegate = self;
[self addSubview:contentView];
[contentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.compereView.mas_bottom).offset(1+(seatHeight+topSpace)*(i/4));
make.left.equalTo(self).offset(leftMargin+(seatWidth+itemSpace)*(i%4));
make.size.mas_equalTo(CGSizeMake(seatWidth, seatHeight));
}];
[self.seatArray addObject:contentView];
}
[self.seatArray addObject:self.compereView];
[self.seatArray addObject:self.guestView];
self.compereView.noOffLine = YES;
self.guestView.noOffLine = YES;
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.viewController.view endEditing:YES];
}
-(void)didClickUserHeaderWithPitModel:(QXRoomPitModel *)pitModel seatView:(QXRoomSeatContentView *)seatView{
NSString *pit_number = [NSString stringWithFormat:@"%ld",seatView.number] ;
QXLOG(@"点击了%ld麦位",seatView.number);
if (seatView.pitModel.user_id.longLongValue > 0) {
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickUserHeaderWithPitModel:userModel:isPkRoom:pkRoomId:isNoTakeOff:)]) {
if (self.isPKOtherRoom) {
[self.delegate didClickUserHeaderWithPitModel:seatView.pitModel userModel:nil isPkRoom:YES pkRoomId:self.roomModel.room_info.room_id isNoTakeOff:NO];
}else{
[self.delegate didClickUserHeaderWithPitModel:seatView.pitModel userModel:nil isPkRoom:NO pkRoomId:@"" isNoTakeOff:NO];
}
}
}else{
if (self.isPKOtherRoom) {
return;
}
if (seatView.number == 9) {
/// 9
[QXMineNetwork roomUpSeatWithRoomId:self.roomModel.room_info.room_id pit_number:pit_number isUpSeat:YES successBlock:^(NSDictionary * _Nonnull dict) {
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
showToast(msg);
}];
return;
}else if (seatView.number == 10) {
if (self.myPitNumber == 9 || self.roomModel.user_info.is_room_owner.intValue == 1 || self.roomModel.user_info.is_management.intValue == 1) {
if (self.delegate && [self.delegate respondsToSelector:@selector(didHugSeatWithPitNumber:)]) {
[self.delegate didHugSeatWithPitNumber:@"10"];
}
}else{
showToast(@"请等待主持抱麦");
}
return;
}else{
if (self.myPitNumber == 9) {
MJWeakSelf
/// 9
QXRoomPitModel *pitModel = seatView.pitModel;
self.settingView.roomId = self.roomModel.room_info.room_id;
self.settingView.pitModel = pitModel;
self.settingView.setSuccessBlock = ^(QXRoomPitModel * _Nonnull pitModel) {
seatView.pitModel = pitModel;
// if (self.isPKMyRoom || self.isPKOtherRoom) {
// [seatView hideCharm];
// }
};
self.settingView.clickHugBlock = ^(QXRoomPitModel * _Nonnull pitModel) {
// [weakSelf showOnlineListWithPitNumber:pitModel.pit_number];
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didHugSeatWithPitNumber:)]) {
[weakSelf.delegate didHugSeatWithPitNumber:pitModel.pit_number];
}
};
[self.settingView showInView:self.viewController.view];
}else{
if (self.roomModel.room_info.room_up_pit_type.intValue == 2) {
///
[QXMineNetwork roomUpSeatWithRoomId:self.roomModel.room_info.room_id pit_number:pit_number isUpSeat:YES successBlock:^(NSDictionary * _Nonnull dict) {
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
showToast(msg);
}];
}else{
//
if (self.myPitNumber == 9 || self.roomModel.user_info.is_room_owner.intValue == 1 || self.roomModel.user_info.is_management.intValue == 1 || self.roomModel.user_info.is_host.intValue == 1) {
MJWeakSelf
/// 9
QXRoomPitModel *pitModel = seatView.pitModel;
self.settingView.roomId = self.roomModel.room_info.room_id;
self.settingView.pitModel = pitModel;
self.settingView.setSuccessBlock = ^(QXRoomPitModel * _Nonnull pitModel) {
seatView.pitModel = pitModel;
// if (self.isPKMyRoom || self.isPKOtherRoom) {
// [seatView hideCharm];
// }
};
self.settingView.clickHugBlock = ^(QXRoomPitModel * _Nonnull pitModel) {
// [weakSelf showOnlineListWithPitNumber:pitModel.pit_number];
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didHugSeatWithPitNumber:)]) {
[weakSelf.delegate didHugSeatWithPitNumber:pitModel.pit_number];
}
};
[self.settingView showInView:self.viewController.view];
}
}
}
}
}
}
-(void)previewRoomUserCharmListWithUserId:(NSString *)userId{
if (self.delegate && [self.delegate respondsToSelector:@selector(previewRoomUserCharmListWithUserId:)]) {
[self.delegate previewRoomUserCharmListWithUserId:userId];
}
}
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number{
if (pit_number > 10) {
return;
}
QXRoomSeatContentView *contentView = self.seatArray[pit_number-1];
QXRoomPitModel *model = contentView.pitModel;
if (isUpSeat) {
model.user_id = user.user_id;
model.avatar = user.avatar;
model.dress = user.dress;
model.sex = user.sex;
model.nickname = user.nickname;
model.user_code = user.user_code;
model.charm = user.charm;
}else{
model.user_id = @"0";
model.avatar = @"";
model.dress = @"";
model.sex = @"";
model.nickname = @"";
model.user_code = @"";
model.charm = @"";
if (contentView.isSeatSpeaking) {
[contentView stopAudioAnimation];
}
}
if ([user.user_id isEqualToString:[QXGlobal shareGlobal].loginModel.user_id]) {
if (isUpSeat) {
self.myPitNumber = pit_number;
}else{
self.myPitNumber = -1;
}
}
contentView.pitModel = model;
// if (self.isPKMyRoom || self.isPKOtherRoom) {
// [contentView hideCharm];
// }
}
- (QXRoomSeatContentView *)mySeatView{
if (self.myPitNumber > 0) {
return self.seatArray[self.myPitNumber-1];;
}
return nil;
}
-(void)setIsPKMyRoom:(BOOL)isPKMyRoom{
_isPKMyRoom = isPKMyRoom;
self.compereView.isPK = YES;
[self.compereView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self).offset(0);
make.width.mas_equalTo(ScaleWidth(60));
make.height.mas_equalTo(ScaleWidth(60-10)+51-8);
make.right.mas_equalTo(-15);
}];
self.guestView.isPK = YES;
[self.guestView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.compereView).offset(15);
make.width.mas_equalTo(ScaleWidth(55));
make.height.mas_equalTo(ScaleWidth(55-10)+51-8);
make.left.mas_equalTo(15);
}];
CGFloat leftMargin = 7;
CGFloat topSpace = -4;
CGFloat seatWidth = ((SCREEN_WIDTH-7*2-4)/2 - 8*2)/4;
// CGFloat seatHeight = seatWidth-10+51;
CGFloat seatHeight = seatWidth-10+51-8;
CGFloat itemSpace = 0;
for (int i = 0 ; i < self.seatArray.count ; i++) {
if (i < 8) {
QXRoomSeatContentView *contentView = self.seatArray[i];
contentView.isPK = YES;
[contentView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.guestView.mas_bottom).offset(topSpace+(seatHeight+topSpace)*(i/4));
make.left.equalTo(self).offset(leftMargin+(seatWidth+itemSpace)*(i%4));
make.size.mas_equalTo(CGSizeMake(seatWidth, seatHeight));
}];
}
}
}
-(void)setIsPKOtherRoom:(BOOL)isPKOtherRoom{
_isPKOtherRoom = isPKOtherRoom;
self.compereView.isPK = YES;
[self.compereView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self).offset(0);
make.width.mas_equalTo(ScaleWidth(60));
make.height.mas_equalTo(ScaleWidth(60-10)+51-8);
make.left.mas_equalTo(15);
}];
self.guestView.isPK = YES;
[self.guestView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.compereView).offset(15);
make.width.mas_equalTo(ScaleWidth(55));
make.height.mas_equalTo(ScaleWidth(55-10)+51-8);
make.right.mas_equalTo(-15);
}];
CGFloat leftMargin = 7;
CGFloat topSpace = -4;
CGFloat seatWidth = ((SCREEN_WIDTH-7*2-4)/2 - 8*2)/4;
// CGFloat seatHeight = seatWidth+21;
// CGFloat seatHeight = seatWidth-10+51;
CGFloat seatHeight = seatWidth-10+51-8;
CGFloat itemSpace = 0;
for (int i = 0 ; i < self.seatArray.count ; i++) {
if (i < 8) {
QXRoomSeatContentView *contentView = self.seatArray[i];
contentView.isPK = YES;
[contentView mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.guestView.mas_bottom).offset(topSpace+(seatHeight+topSpace)*(i/4));
make.left.equalTo(self).offset(leftMargin+(seatWidth+itemSpace)*(i%4));
make.size.mas_equalTo(CGSizeMake(seatWidth, seatHeight));
}];
}
}
}
-(void)setRoomModel:(QXRoomModel *)roomModel{
_roomModel = roomModel;
for (int i = 0 ; i < roomModel.room_info.pit_list.count;i++) {
QXRoomPitModel *pitModel = roomModel.room_info.pit_list[i];
QXRoomSeatContentView *contentView = self.seatArray[i];
contentView.pitModel = pitModel;
// if (self.isPKMyRoom || self.isPKOtherRoom) {
// [contentView hideCharm];
// }
}
self.myPitNumber = roomModel.user_info.pit_number.integerValue;
}
-(void)clearCharm{
for (QXRoomSeatContentView *seatView in self.seatArray) {
QXRoomPitModel *model = seatView.pitModel;
model.charm = @"0";
seatView.pitModel = model;
// if (self.isPKMyRoom || self.isPKOtherRoom) {
// [seatView hideCharm];
// }
}
}
-(void)roomClearUserCharmWithUserId:(NSString *)userId{
for (QXRoomSeatContentView *seatView in self.seatArray) {
QXRoomPitModel *model = seatView.pitModel;
if ([model.user_id isEqualToString:userId]) {
model.charm = @"0";
seatView.pitModel = model;
break;
}
// if (self.isPKMyRoom || self.isPKOtherRoom) {
// [seatView hideCharm];
// }
}
}
-(void)setSeatCharmWithUser:(QXUserHomeModel *)model{
for (QXRoomSeatContentView *seatView in self.seatArray) {
QXRoomPitModel *md = seatView.pitModel;
if ([model.user_id isEqualToString:md.user_id]) {
// md.charm = model.charm;
// seatView.pitModel = md;
[seatView updateUserCharm:model.charm];
// if (self.isPKMyRoom || self.isPKOtherRoom) {
// [seatView hideCharm];
// }
break;
}
}
}
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel *> *)users{
for (QXUserHomeModel*model in users) {
[self setSeatCharmWithUser:model];
}
}
-(void)roomSeatExchangedWithFromPitNumber:(NSInteger)fromPitNumber toPitNumber:(NSInteger)toPitNumber userInfo:(QXUserHomeModel*)userInfo{
if (fromPitNumber == 0 || toPitNumber == 0) {
return;
}
QXRoomSeatContentView *fromSeatView = self.seatArray[fromPitNumber-1];
QXRoomSeatContentView *toSeatView = self.seatArray[toPitNumber-1];
QXRoomPitModel *fromPitModel = fromSeatView.pitModel;
QXRoomPitModel *totModel = toSeatView.pitModel;
NSString* tmpPitNum = [NSString stringWithFormat:@"%@",fromPitModel.pit_number];
fromPitModel.pit_number = totModel.pit_number;
totModel.pit_number = tmpPitNum;
toSeatView.pitModel = fromPitModel;
fromSeatView.pitModel = totModel;
if ([userInfo.user_id isEqualToString:QXGlobal.shareGlobal.loginModel.user_id]) {
self.myPitNumber = toPitNumber;
}
///
for (UIView *view in self.seatArray) {
///
if ([view isKindOfClass:[QXRoomSeatContentView class]]) {
QXRoomSeatContentView *seatView = (QXRoomSeatContentView*)view;
/// idid
if ([userInfo.user_id isEqualToString:seatView.pitModel.user_id]) {
///
if (seatView.pitModel.pit_number.intValue != toPitNumber) {
///
QXRoomPitModel *model = seatView.pitModel;
model.user_id = @"0";
model.avatar = @"";
model.dress = @"";
model.sex = @"";
model.nickname = @"";
model.user_code = @"";
model.charm = @"";
seatView.pitModel = model;
}
}
}
}
}
-(void)setSeatIsLock:(NSString *)isLock pitNumber:(NSString *)pitNumber{
NSInteger pit_number = pitNumber.integerValue;
QXRoomSeatContentView *contentView = self.seatArray[pit_number-1];
contentView.is_lock = isLock;
}
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user{
for (QXRoomSeatContentView *seatView in self.seatArray) {
QXRoomPitModel *md = seatView.pitModel;
if ([user.user_id isEqualToString:md.user_id]) {
md.dress = user.dress;
md.nickname = user.nickname;
md.sex = user.sex;
md.avatar = user.avatar;
seatView.pitModel = md;
break;
}
}
}
-(void)stopHWDMP4{
for (QXRoomSeatContentView *seatView in self.seatArray) {
[seatView stopHWDMP4];
}
}
-(void)playHWDMP4{
for (QXRoomSeatContentView *seatView in self.seatArray) {
[seatView playHWDMP4];
}
}
-(void)destroyViews{
for (QXRoomSeatContentView *seatView in self.seatArray) {
[seatView destroyViews];
}
}
-(NSMutableArray *)seatArray{
if (!_seatArray) {
_seatArray = [NSMutableArray array];
}
return _seatArray;
}
-(QXRoomSeatSettingView *)settingView{
if (!_settingView) {
_settingView = [[QXRoomSeatSettingView alloc] init];
}
return _settingView;
}
@end

View File

@@ -0,0 +1,45 @@
//
// QXRoomSeatTypeSongView.h
// QXLive
//
// Created by 启星 on 2025/6/18.
//
#import <UIKit/UIKit.h>
#import "QXRoomModel.h"
#import "QXRoomSeatDelegate.h"
#import "QXUserModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXRoomSeatTypeSongView : UIView
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
@property (nonatomic,strong)QXRoomModel *roomModel;
@property (nonatomic,strong)NSString *lrcUrl;
@property (nonatomic,assign)NSUInteger progress;
@property (nonatomic,assign)double speakerPitch;
@property (nonatomic,assign)NSInteger myPitNumber;
@property (nonatomic,strong)QXSongListModel *songInfo;
@property (nonatomic,strong)QXSongListModel *nextInfo;
-(void)stopHWDMP4;
-(void)playHWDMP4;
-(void)destroyViews;
/// 清除魅力
-(void)clearCharm;
/// 清除个人魅力
-(void)roomClearUserCharmWithUserId:(NSString *)userId;
/// 设置魅力
-(void)setSeatCharmWithUser:(QXUserHomeModel *)model;
/// 设置多人魅力
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel*>*)users;
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number;
/// 榜单发生变化
-(void)songRoomCharmRankListDidChanged:(NSArray<QXRoomPitModel *>*)list;
/// 房间内用户信息发生变化
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,899 @@
//
// QXRoomSeatTypeSongView.m
// QXLive
//
// Created by on 2025/6/18.
//
#import "QXRoomSeatTypeSongView.h"
#import "QXFileManager.h"
#import "UIButton+QX.h"
#import "QXAgoraEngine.h"
#import "QXRoomSeatContentView.h"
#import "MarqueeLabel.h"
#import "QXSongSeatCell.h"
#import "QXMineNetwork.h"
#import "QXRoomUserInfoView.h"
@import AgoraLyricsScore;
@interface QXRoomSeatTypeSongView()<KaraokeDelegate
,UICollectionViewDelegate,UICollectionViewDataSource,
QXRoomSeatDelegate
>
///
@property (nonatomic,strong)UIView *leftBgView;
@property (nonatomic,strong)UIImageView *leftBgImageView;
///
@property (nonatomic,strong)UILabel *tipsLabel;
///
@property (nonatomic,strong)UIImageView *songCoverImageView;
///
@property (nonatomic,strong)UIImageView *songCoverCycleImageView;
///
@property (nonatomic,strong)MarqueeLabel *currentInfoLabel;
///
@property (nonatomic,strong)KaraokeView *karaokeView;
///
@property (nonatomic,strong)UIButton *originalBtn;
///
@property (nonatomic,strong)UIButton *nextBtn;
///
@property (nonatomic,strong)UIButton *endBtn;
///
@property (nonatomic,strong)UIButton *giveBtn;
/// k
//@property (nonatomic,strong)UIButton *ktvConifgBtn;
///
@property (nonatomic,strong)QXRoomSeatContentView *singerSeatView;
///
@property (nonatomic,strong)MarqueeLabel *nextInfoLabel;
///
@property (nonatomic,strong)QXRoomSeatContentView *compereView;
///
@property (nonatomic,strong)QXRoomSeatContentView *guestView;
///
@property (nonatomic,strong)UICollectionView *collectionView;
///
@property (nonatomic,strong)NSMutableArray *dataArray;
@property (nonatomic,strong)QXRoomUserInfoView *userInfoView;
@end
@implementation QXRoomSeatTypeSongView
- (instancetype)init
{
self = [super init];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.leftBgView = [[UIView alloc] init];
self.leftBgView.backgroundColor = RGB16A(0x000000,0.2);
[self.leftBgView addRoundedCornersWithRadius:4];
[self addSubview:self.leftBgView];
self.leftBgImageView = [[UIImageView alloc] init];
self.leftBgImageView.alpha = 0.3;
self.leftBgImageView.contentMode = UIViewContentModeScaleAspectFill;
[self.leftBgImageView addRoundedCornersWithRadius:4];
[self.leftBgView addSubview:self.leftBgImageView];
self.currentInfoLabel = [[MarqueeLabel alloc] initWithFrame:CGRectZero];
self.currentInfoLabel.scrollDuration = 2;
self.currentInfoLabel.marqueeType = MLLeftRight;
self.currentInfoLabel.text = QXText(@"当前播放");
self.currentInfoLabel.textColor = UIColor.whiteColor;
self.currentInfoLabel.font = [UIFont systemFontOfSize:12];
[self.leftBgView addSubview:self.currentInfoLabel];
self.songCoverCycleImageView = [[UIImageView alloc] init];
self.songCoverCycleImageView.contentMode = UIViewContentModeScaleAspectFill;
// self.songCoverImageView.backgroundColor = [UIColor redColor];
self.songCoverCycleImageView.image = [UIImage imageNamed:@"room_music_cycle"];
[self.songCoverCycleImageView addRoundedCornersWithRadius:27.5];
[self.leftBgView addSubview:self.songCoverCycleImageView];
self.songCoverImageView = [[UIImageView alloc] init];
self.songCoverImageView.contentMode = UIViewContentModeScaleAspectFill;
// self.songCoverImageView.backgroundColor = [UIColor redColor];
self.songCoverImageView.image = [UIImage imageNamed:@"user_header_placehoulder"];
[self.songCoverImageView addRoundedCornersWithRadius:12.5];
CABasicAnimation* rotationAnimation;
//y ---> transform.rotation.y
rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
//
rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI];
//
rotationAnimation.duration = 2;
rotationAnimation.cumulative = YES;
rotationAnimation.removedOnCompletion = NO;
//MAXFLOAT
rotationAnimation.repeatCount = MAXFLOAT;
[self.songCoverImageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
[self.songCoverCycleImageView addSubview:self.songCoverImageView];
FileLogger *fileLogger = [[FileLogger alloc] init];
KaraokeView *karaokeView = [[KaraokeView alloc] initWithFrame:CGRectZero
loggers:@[[ConsoleLogger new],fileLogger]];
karaokeView.backgroundImage = [UIImage imageNamed:@"ktv_top_bgIcon"];
karaokeView.spacing = 0;
karaokeView.scoringEnabled = NO;
[self.leftBgView addSubview:karaokeView];
karaokeView.delegate = self;
self.karaokeView = karaokeView;
// ScoringView *sView = karaokeView.scoringView;
LyricsView *lView= karaokeView.lyricsView;
// sView.viewHeight = ScaleWidth(160);
// sView.topSpaces = ScaleWidth(60);
karaokeView.lyricsView.waitingViewHidden = NO;
karaokeView.lyricsView.firstToneHintViewStyle.size = 8;
karaokeView.lyricsView.inactiveLineFontSize = [UIFont fontWithName:@"PingFangSC-Semibold" size:12];
karaokeView.lyricsView.activeLineUpcomingFontSize = [UIFont fontWithName:@"PingFangSC-Semibold" size:14];
karaokeView.lyricsView.lyricLineSpacing = 5;
karaokeView.lyricsView.firstToneHintViewStyle.bottomMargin = 0;
karaokeView.lyricsView.firstToneHintViewStyle.backgroundColor = QXConfig.themeColor;
// karaokeView.lyricsView.activeLinePlayedTextColor = RGB16A(0xFFFFFF, 1);
karaokeView.lyricsView.activeLinePlayedTextColor = QXConfig.themeColor;
karaokeView.lyricsView.inactiveLineTextColor = RGB16A(0xFFFFFF, 0.5);
lView.draggable = NO;
lView.noLyricTipsFont = [UIFont systemFontOfSize:15];
lView.noLyricTipsText = @"没有歌词呢";
lView.noLyricTipsColor = [UIColor whiteColor];
self.nextInfoLabel = [[MarqueeLabel alloc] initWithFrame:CGRectZero];
self.nextInfoLabel.scrollDuration = 2;
self.nextInfoLabel.marqueeType = MLLeftRight;
self.nextInfoLabel.text = QXText(@"下一首");
self.nextInfoLabel.textColor = UIColor.whiteColor;
self.nextInfoLabel.font = [UIFont systemFontOfSize:12];
[self.leftBgView addSubview:self.nextInfoLabel];
MJWeakSelf
self.singerSeatView = [[QXRoomSeatContentView alloc] init];
self.singerSeatView.tagString = QXText(@"演唱者");
self.singerSeatView.delegate = self;
[self.leftBgView addSubview:self.singerSeatView];
[self.leftBgView addSubview:self.originalBtn];
[self.leftBgView addSubview:self.giveBtn];
[self.leftBgView addSubview:self.nextBtn];
[self.leftBgView addSubview:self.endBtn];
// self.ktvConifgBtn.hidden = YES;
// [self.leftBgView addSubview:self.ktvConifgBtn];
[self.leftBgView addSubview:self.tipsLabel];
self.compereView = [[QXRoomSeatContentView alloc] init];
self.compereView.delegate = self;
self.compereView.tagString = QXText(@"主持");
self.compereView.number = 9;
[self addSubview:self.compereView];
self.guestView = [[QXRoomSeatContentView alloc] init];
self.guestView.tagString = QXText(@"嘉宾");
self.guestView.number = 10;
self.guestView.delegate = self;
[self addSubview:self.guestView];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.itemSize = CGSizeMake(ScaleWidth(52), 51+ScaleWidth(52-10));
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, ScaleWidth(52), 51+ScaleWidth(52-10)) collectionViewLayout:layout];
// [self.collectionView registerNib:[ forCellWithReuseIdentifier:@"QXGiftCell"];
[self.collectionView registerClass:[QXSongSeatCell class] forCellWithReuseIdentifier:@"QXSongSeatCell"];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
self.collectionView.showsHorizontalScrollIndicator = NO;
self.collectionView.showsVerticalScrollIndicator = NO;
self.collectionView.bounces = NO;
self.collectionView.backgroundColor = [UIColor clearColor];
[self addSubview:self.collectionView];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.viewController.view endEditing:YES];
}
-(void)didClickUserHeaderWithPitModel:(QXRoomPitModel *)pitModel seatView:(QXRoomSeatContentView *)seatView{
NSString *pit_number = [NSString stringWithFormat:@"%ld",seatView.number] ;
QXLOG(@"点击了%ld麦位",seatView.number);
if (seatView.pitModel.user_id.longLongValue > 0) {
if (self.delegate && [self.delegate respondsToSelector:@selector(didClickUserHeaderWithPitModel:userModel:isPkRoom:pkRoomId:isNoTakeOff:)]) {
[self.delegate didClickUserHeaderWithPitModel:seatView.pitModel userModel:nil isPkRoom:NO pkRoomId:@"" isNoTakeOff:NO];
}
}else{
if (seatView.number == 9) {
[QXMineNetwork roomUpSeatWithRoomId:self.roomModel.room_info.room_id pit_number:pit_number isUpSeat:YES successBlock:^(NSDictionary * _Nonnull dict) {
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
showToast(msg);
}];
}else if (seatView.number == 10) {
if (self.myPitNumber == 9) {
if (self.delegate && [self.delegate respondsToSelector:@selector(didHugSeatWithPitNumber:)]) {
[self.delegate didHugSeatWithPitNumber:@"10"];
}
}else{
showToast(@"请等待主持抱麦");
}
return;
}else{
// if (self.roomModel.room_info.room_up_pit_type.intValue == 2) {
// ///
// [QXMineNetwork roomUpSeatWithRoomId:self.roomModel.room_info.room_id pit_number:pit_number isUpSeat:YES successBlock:^(NSDictionary * _Nonnull dict) {
//
// } failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
//
// }];
// }
}
}
}
-(void)previewRoomUserCharmListWithUserId:(NSString *)userId{
if (self.delegate && [self.delegate respondsToSelector:@selector(previewRoomUserCharmListWithUserId:)]) {
[self.delegate previewRoomUserCharmListWithUserId:userId];
}
}
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number{
// if (pit_number==9999) {
// for (<#type *object#> in <#collection#>) {
// <#statements#>
// }
// return;
// }
QXRoomSeatContentView *contentView;
if (pit_number == 9) {
contentView = self.compereView;
}else if (pit_number == 10) {
contentView = self.guestView;
}else{
}
QXRoomPitModel *model = contentView.pitModel;
if (isUpSeat) {
if (model == nil) {
model = [[QXRoomPitModel alloc] init];
}
model.user_id = user.user_id;
model.avatar = user.avatar;
model.dress = user.dress;
model.sex = user.sex;
model.nickname = user.nickname;
model.user_code = user.user_code;
model.charm = user.charm;
// [self.dataArray removeAllObjects];
// [self.dataArray addObjectsFromArray:self.roomModel.song_pit_list];
if (contentView == nil) {
[self.dataArray addObject:model];
}
}else{
model.user_id = @"0";
model.avatar = @"";
model.dress = @"";
model.sex = @"";
model.nickname = @"";
model.user_code = @"";
model.charm = @"";
if (contentView) {
if (contentView.isSeatSpeaking) {
[contentView stopAudioAnimation];
}
}
for (QXRoomPitModel *md in self.dataArray) {
if ([md.user_id isEqualToString:user.user_id]) {
[self.dataArray removeObject:md];
break;
}
}
}
if ([user.user_id isEqualToString:[QXGlobal shareGlobal].loginModel.user_id]) {
if (isUpSeat) {
self.myPitNumber = pit_number;
}else{
self.myPitNumber = -1;
}
}
if (contentView) {
contentView.pitModel = model;
}else{
[self.collectionView reloadData];
}
[self resetBtnWithSongInfo:self.roomModel.song_user_info];
}
-(void)setLrcUrl:(NSString *)lrcUrl{
_lrcUrl = lrcUrl;
MJWeakSelf
[[QXRequset shareInstance] downloadVideoPlayerWithUrl:lrcUrl completion:^(BOOL result, NSString * _Nonnull fileName) {
weakSelf.tipsLabel.hidden = YES;
NSString *path = [QXFileManager getGiftVideoPath:fileName];
NSData *data = [NSData dataWithContentsOfFile:path];
// [weakSelf.karaokeView reset];
[weakSelf layoutSubviews];
[weakSelf.karaokeView setProgressWithProgress:0];
LyricModel *model = [KaraokeView parseLyricDataWithLyricFileData:data pitchFileData:nil lyricOffset:0 includeCopyrightSentence:YES];
[weakSelf.karaokeView setLyricDataWithData:model usingInternalScoring:NO];
}];
}
-(void)setProgress:(NSUInteger)progress{
_progress = progress;
[self.karaokeView setProgressWithProgress:progress];
if ([self.songInfo.user_id isEqualToString:QXGlobal.shareGlobal.loginModel.user_id]) {
double time = progress/1000.0+1;
if (ceil(time) >= self.songInfo.duration) {
[self nextAction];
}
}
}
-(void)setSpeakerPitch:(double)speakerPitch{
_speakerPitch = speakerPitch;
[self.karaokeView setPitchWithSpeakerPitch:speakerPitch progressInMs:1];
}
-(void)layoutSubviews{
[super layoutSubviews];
self.leftBgView.frame = CGRectMake(16, 44, ScaleWidth(263), ScaleWidth(277));
self.leftBgImageView.frame = self.leftBgView.bounds;
self.currentInfoLabel.frame = CGRectMake(12, 12, ScaleWidth(134), 18);
self.nextInfoLabel.frame = CGRectMake(12, self.leftBgView.height-18-12, ScaleWidth(134), 18);
self.tipsLabel.frame = CGRectMake(12, (self.nextInfoLabel.top-self.currentInfoLabel.bottom-30)/2+18, ScaleWidth(183), 30);
self.songCoverCycleImageView.frame = CGRectMake((ScaleWidth(183)-12-55)/2+12, self.currentInfoLabel.bottom+10, 55, 55);
self.songCoverImageView.frame = CGRectMake(15, 15, 25, 25);
self.karaokeView.frame = CGRectMake(12, self.songCoverCycleImageView.bottom+10, ScaleWidth(183), self.nextInfoLabel.top-self.songCoverCycleImageView.bottom-20);
// self.songCoverImageView.centerX = self.karaokeView.centerX;
// self.karaokeView.lyricsView.frame = self.karaokeView.bounds;
self.singerSeatView.frame = CGRectMake(self.leftBgView.width-ScaleWidth(52)-12, 12, ScaleWidth(52), 51+ScaleWidth(52-10));
self.originalBtn.frame = CGRectMake(self.leftBgView.width-12-35, self.singerSeatView.bottom+5, 50, 35);
self.giveBtn.frame = CGRectMake(self.originalBtn.left, self.originalBtn.bottom+5, 50, 35);
self.nextBtn.frame = CGRectMake(self.originalBtn.left, self.giveBtn.bottom+5, 50, 35);
self.endBtn.frame = CGRectMake(self.originalBtn.left, self.nextBtn.bottom+5, 50, 35);
// self.ktvConifgBtn.frame = CGRectMake(self.originalBtn.left, self.nextBtn.bottom+5, 50, 35);
self.originalBtn.centerX = self.singerSeatView.centerX;
self.giveBtn.centerX = self.singerSeatView.centerX;
self.nextBtn.centerX = self.singerSeatView.centerX;
self.endBtn.centerX = self.singerSeatView.centerX;
// self.ktvConifgBtn.centerX = self.singerSeatView.centerX;
[self.originalBtn qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyleTop) imageTitleSpace:2];
[self.giveBtn qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyleTop) imageTitleSpace:2];
[self.nextBtn qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyleTop) imageTitleSpace:2];
[self.endBtn qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyleTop) imageTitleSpace:2];
// [self.ktvConifgBtn qx_layoutButtonNOSizeToFitWithEdgeInsetsStyle:(QXButtonEdgeInsetsStyleTop) imageTitleSpace:2];
self.compereView.frame = CGRectMake(self.width-10-ScaleWidth(52), 0, ScaleWidth(52), 51+ScaleWidth(52-10));
self.guestView.frame = CGRectMake(self.width-10-ScaleWidth(52), self.compereView.bottom, ScaleWidth(52), 51+ScaleWidth(52-10));
self.collectionView.frame = CGRectMake(self.width-10-ScaleWidth(52), self.guestView.bottom, ScaleWidth(52), self.height-self.guestView.bottom);
[self resetBtnWithSongInfo:self.songInfo];
}
-(void)onKaraokeViewWithView:(KaraokeView *)view didDragTo:(NSUInteger)position{
}
- (void)onKaraokeViewWithView:(KaraokeView *)view
didFinishLineWith:(LyricLineModel *)model
score:(NSInteger)score
cumulativeScore:(NSInteger)cumulativeScore
lineIndex:(NSInteger)lineIndex lineCount:(NSInteger)lineCount {}
- (void)onLogWithContent:(NSString *)content tag:(NSString *)tag time:(NSString *)time level:(enum LoggerLevel)level {
}
-(void)originalAction:(UIButton*)sender{
sender.selected = !sender.selected;
[[QXAgoraEngine sharedEngine] ktv_OriginalSingSetting:sender.selected];
}
-(void)setRoomModel:(QXRoomModel *)roomModel{
_roomModel = roomModel;
QXRoomPitModel *singer = self.singerSeatView.pitModel;
if (singer == nil) {
singer = [[QXRoomPitModel alloc] init];
}
singer.user_id = self.roomModel.song_user_info.user_id;
singer.avatar = self.roomModel.song_user_info.avatar;
singer.nickname = self.roomModel.song_user_info.nickname;
singer.charm = self.roomModel.song_user_info.charm;
singer.dress = self.roomModel.song_user_info.dress;
[self.dataArray removeAllObjects];
self.singerSeatView.pitModel = singer;
for (QXRoomPitModel *model in roomModel.room_info.pit_list) {
if (model.pit_number.intValue == 9) {
self.compereView.pitModel = model;
continue;
}
if (model.pit_number.intValue == 10) {
self.guestView.pitModel = model;
continue;
}
// if (model.user_id.longLongValue > 0) {
// [self.dataArray addObject:model];
// }
}
if (self.roomModel.user_info.pit_number.intValue > 0) {
self.myPitNumber = self.roomModel.user_info.pit_number.intValue;
}else{
self.myPitNumber = -1;
}
self.songInfo = self.roomModel.song_user_info;
self.dataArray= [NSMutableArray arrayWithArray:self.roomModel.song_pit_list];
self.roomModel.song_pit_list = self.dataArray;
// [self getRoomRankList];
[self.collectionView reloadData];
if (self.songInfo == nil) {
[self resetBtnWithSongInfo:nil];
}
}
-(void)songRoomCharmRankListDidChanged:(NSArray<QXRoomPitModel *> *)list{
// [self.dataArray removeAllObjects];
// [self.dataArray addObjectsFromArray:list];
// [self.collectionView reloadData];
}
-(void)getRoomRankList{
// MJWeakSelf
// [QXMineNetwork roomCharmRankListWithRoomId:self.roomModel.room_info.room_id successBlock:^(NSArray<QXRoomPitModel *> * _Nonnull list) {
// [weakSelf.dataArray removeAllObjects];
// [weakSelf.dataArray addObjectsFromArray:list];
// [weakSelf.collectionView reloadData];
// } failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
//
// }];
}
-(void)clearCharm{
QXRoomPitModel *singerModel = self.singerSeatView.pitModel;
singerModel.charm = @"0";
self.singerSeatView.pitModel = singerModel;
QXRoomPitModel *compereModel = self.compereView.pitModel;
compereModel.charm = @"0";
self.compereView.pitModel = compereModel;
QXRoomPitModel *guestModel = self.guestView.pitModel;
guestModel.charm = @"0";
self.guestView.pitModel = guestModel;
for (QXRoomPitModel *md in self.dataArray) {
md.charm = @"0";
}
[self.collectionView reloadData];
}
-(void)roomClearUserCharmWithUserId:(NSString *)userId{
QXRoomPitModel *singerModel = self.singerSeatView.pitModel;
if ([singerModel.user_id isEqualToString:userId]) {
singerModel.charm = @"0";
self.singerSeatView.pitModel = singerModel;
}
QXRoomPitModel *compereModel = self.compereView.pitModel;
if ([compereModel.user_id isEqualToString:userId]) {
compereModel.charm = @"0";
self.compereView.pitModel = compereModel;
}
QXRoomPitModel *guestModel = self.guestView.pitModel;
if ([guestModel.user_id isEqualToString:userId]) {
guestModel.charm = @"0";
self.guestView.pitModel = guestModel;
}
for (QXRoomPitModel *md in self.dataArray) {
if ([userId isEqualToString:md.user_id]) {
md.charm = @"0";
break;
}
}
[self.collectionView reloadData];
}
-(void)setSeatCharmWithUser:(QXUserHomeModel *)model{
QXRoomPitModel *singerModel = self.singerSeatView.pitModel;
if ([singerModel.user_id isEqualToString:model.user_id]) {
// singerModel.charm = model.charm;
// self.singerSeatView.pitModel = singerModel;
[self.singerSeatView updateUserCharm:model.charm];
}
QXRoomPitModel *compereModel = self.compereView.pitModel;
if ([compereModel.user_id isEqualToString:model.user_id]) {
// compereModel.charm = model.charm;
// self.compereView.pitModel = compereModel;
[self.compereView updateUserCharm:model.charm];
return;
}
QXRoomPitModel *guestModel = self.guestView.pitModel;
if ([guestModel.user_id isEqualToString:model.user_id]) {
// guestModel.charm = model.charm;
// self.guestView.pitModel = guestModel;
[self.guestView updateUserCharm:model.charm];
return;
}
for (QXRoomPitModel *md in self.dataArray) {
if ([model.user_id isEqualToString:md.user_id]) {
md.charm = model.charm;
break;
}
}
[self.collectionView reloadData];
}
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel *> *)users{
for (QXUserHomeModel*model in users) {
[self setSeatCharmWithUser:model];
}
[self.collectionView reloadData];
}
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user{
QXRoomPitModel *singerModel = self.singerSeatView.pitModel;
if ([singerModel.user_id isEqualToString:user.user_id]) {
singerModel.dress = user.dress;
singerModel.nickname = user.nickname;
singerModel.sex = user.sex;
singerModel.avatar = user.avatar;
self.singerSeatView.pitModel = singerModel;
}
QXRoomPitModel *compereModel = self.compereView.pitModel;
if ([compereModel.user_id isEqualToString:user.user_id]) {
compereModel.dress = user.dress;
compereModel.nickname = user.nickname;
compereModel.sex = user.sex;
compereModel.avatar = user.avatar;
self.compereView.pitModel = compereModel;
}
QXRoomPitModel *guestModel = self.guestView.pitModel;
if ([guestModel.user_id isEqualToString:user.user_id]) {
guestModel.dress = user.dress;
guestModel.nickname = user.nickname;
guestModel.sex = user.sex;
guestModel.avatar = user.avatar;
self.guestView.pitModel = guestModel;
}
for (QXRoomPitModel *md in self.dataArray) {
if ([user.user_id isEqualToString:md.user_id]) {
md.dress = user.dress;
md.nickname = user.nickname;
md.sex = user.sex;
md.avatar = user.avatar;
break;
}
}
[self.collectionView reloadData];
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return self.dataArray.count;
}
-(__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
QXSongSeatCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"QXSongSeatCell" forIndexPath:indexPath];
QXRoomPitModel *model = self.dataArray[indexPath.row];
cell.seatContentView.pitModel = model;
cell.seatContentView.delegate = self;
return cell;
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
// QXRoomPitModel *model = self.dataArray[indexPath.row];
// self.userInfoView.isUpSeat = YES;
// self.userInfoView.roomId = self.roomModel.room_info.room_id;
//// self.userInfoView.pitNumber = [NSString stringWithFormat:@"%ld",seatView.number];
// self.userInfoView.userId = model.user_id;
// [self.userInfoView showInView:self.viewController.view];
// if (self.delegate && [self.delegate respondsToSelector:@selector(didClickUserHeaderWithPitModel:userModel:isPkRoom:pkRoomId:isNoTakeOff:)]) {
// [self.delegate didClickUserHeaderWithPitModel:model userModel:nil isPkRoom:NO pkRoomId:@"" isNoTakeOff:NO];
// }
}
-(void)nextAction{
if (self.songInfo) {
[QXMineNetwork nextSongWithRoomId:self.roomModel.room_info.room_id now_did:self.songInfo.did successBlock:^(NSDictionary * _Nonnull dict) {
showToast(@"成功");
// [[QXAgoraEngine sharedEngine] ktv_EndSing];
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
showToast(msg);
}];
}
}
-(void)endAction{
[QXMineNetwork endSongWithRoomId:self.roomModel.room_info.room_id successBlock:^(NSDictionary * _Nonnull dict) {
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(void)setSongInfo:(QXSongListModel *)songInfo{
[self.singerSeatView stopAudioAnimation];
[self.karaokeView reset];
_songInfo = songInfo;
self.roomModel.song_user_info = songInfo;
if ([songInfo.user_id isEqualToString:[QXGlobal shareGlobal].loginModel.user_id]) {
if (self.myPitNumber > 0) {
///
[[QXAgoraEngine sharedEngine] setClientRoleBroadcaster:YES];
[[QXAgoraEngine sharedEngine] muteLocalAudioStream:NO];
[[QXAgoraEngine sharedEngine] ktv_EndSing];
[[QXAgoraEngine sharedEngine] ktv_StartSing:YES withSong:songInfo];
}else{
//
[[QXAgoraEngine sharedEngine] setClientRoleBroadcaster:YES];
[[QXAgoraEngine sharedEngine] muteLocalAudioStream:NO];
[[QXAgoraEngine sharedEngine] enableAudio:YES];
[[QXAgoraEngine sharedEngine] ktv_EndSing];
[[QXAgoraEngine sharedEngine] ktv_StartSing:YES withSong:songInfo];
}
self.originalBtn.selected = NO;
}else{
if (self.myPitNumber > 0) {
}else{
[[QXAgoraEngine sharedEngine] setClientRoleBroadcaster:NO];
[[QXAgoraEngine sharedEngine] enableAudio:NO];
}
[[QXAgoraEngine sharedEngine] ktv_EndSing];
[[QXAgoraEngine sharedEngine] ktv_LoadLrcWithSong:songInfo];
}
if (songInfo) {
self.currentInfoLabel.text = [NSString stringWithFormat:@"当前播放 %@",songInfo.song_name];
[self.songCoverImageView sd_setImageWithURL:[NSURL URLWithString:songInfo.poster]];
[self.leftBgImageView sd_setImageWithURL:[NSURL URLWithString:songInfo.poster]];
}else{
self.currentInfoLabel.text = @"当前播放 无";
self.songCoverImageView.image = [UIImage imageNamed:@"user_header_placehoulder"];
self.leftBgImageView.image = nil;
[self.singerSeatView stopAudioAnimation];
}
QXRoomPitModel *singer = self.singerSeatView.pitModel;
if (singer == nil) {
singer = [[QXRoomPitModel alloc] init];
}
singer.user_id = songInfo.user_id;
singer.avatar = songInfo.avatar;
singer.nickname = songInfo.nickname;
singer.charm = songInfo.charm;
singer.dress = songInfo.dress;
self.singerSeatView.pitModel = singer;
// if (singer.user_id.intValue > 0) {
// [self.seatDict setObject:self.singerSeatView forKey:singer.user_id];
// }
// [self resetBtnWithSongInfo:songInfo];
// if (self.songInfo == nil) {
[self resetBtnWithSongInfo:songInfo];
// }
}
-(void)setNextInfo:(QXSongListModel *)nextInfo{
_nextInfo = nextInfo;
if (nextInfo) {
self.nextInfoLabel.text = [NSString stringWithFormat:@"下一首 %@",nextInfo.song_name];
}else{
self.nextInfoLabel.text = [NSString stringWithFormat:@"下一首 %@",@"无"];
}
}
-(void)resetBtnWithSongInfo:(QXSongListModel*)songInfo{
if ([songInfo.user_id isEqualToString:QXGlobal.shareGlobal.loginModel.user_id]) {
///
self.originalBtn.hidden = NO;
self.originalBtn.top = self.singerSeatView.bottom+5;
self.giveBtn.hidden = YES;
self.nextBtn.hidden = NO;
self.nextBtn.top = self.originalBtn.bottom+5;
if (self.myPitNumber == 9) {
/// K
self.endBtn.hidden = NO;
self.endBtn.top = self.nextBtn.bottom+5;
// self.ktvConifgBtn.hidden = NO;
// self.ktvConifgBtn.top = self.endBtn.bottom+5;
}else{
self.endBtn.hidden = YES;
// K
// self.ktvConifgBtn.hidden = NO;
// self.ktvConifgBtn.top = self.nextBtn.bottom+5;
}
}else{
if (songInfo == nil) {
if (self.myPitNumber == 9) {
///
self.originalBtn.hidden = YES;
self.giveBtn.hidden = YES;
self.nextBtn.hidden = YES;
self.endBtn.hidden = NO;
}else{
self.originalBtn.hidden = YES;
self.giveBtn.hidden = YES;
self.nextBtn.hidden = YES;
self.endBtn.hidden = YES;
}
}else{
///
self.originalBtn.hidden = YES;
// self.ktvConifgBtn.hidden = YES;
self.giveBtn.hidden = NO;
self.giveBtn.top = self.singerSeatView.bottom+5;
if (self.myPitNumber == 9) {
///
self.nextBtn.hidden = NO;
self.nextBtn.top = self.giveBtn.bottom+5;
self.endBtn.hidden = NO;
self.endBtn.top = self.nextBtn.bottom+5;
}else{
// self.ktvConifgBtn.hidden = YES;
self.originalBtn.hidden = YES;
self.nextBtn.hidden = YES;
self.endBtn.hidden = YES;
}
}
}
}
-(void)setAction{
}
-(void)giveAction{
if (self.singerSeatView.pitModel.user_id.intValue <= 0) {
return;
}
if (self.delegate && [self.delegate respondsToSelector:@selector(sendGiftWithUser:)]) {
[self.delegate sendGiftWithUser:self.singerSeatView.pitModel];
}
}
-(void)stopHWDMP4{
[self.singerSeatView stopHWDMP4];
[self.guestView stopHWDMP4];
[self.compereView stopHWDMP4];
}
-(void)playHWDMP4{
[self.singerSeatView playHWDMP4];
[self.guestView playHWDMP4];
[self.compereView playHWDMP4];
[self.collectionView reloadData];
}
-(void)destroyViews{
[self.singerSeatView destroyViews];
[self.guestView destroyViews];
[self.compereView destroyViews];
[self.karaokeView removeFromSuperview];
self.karaokeView = nil;
}
-(UIButton *)originalBtn{
if (!_originalBtn) {
_originalBtn = [[UIButton alloc] init];
[_originalBtn setImage:[UIImage imageNamed:@"room_song_original_nor"] forState:(UIControlStateNormal)];
[_originalBtn setImage:[UIImage imageNamed:@"room_song_original_sel"] forState:(UIControlStateSelected)];
[_originalBtn setTitle:QXText(@"伴奏") forState:(UIControlStateNormal)];
[_originalBtn setTitle:QXText(@"原唱") forState:(UIControlStateSelected)];
[_originalBtn setTitleColor:UIColor.whiteColor forState:(UIControlStateNormal)];
[_originalBtn setTitleColor:QXConfig.themeColor forState:(UIControlStateSelected)];
_originalBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[_originalBtn addTarget:self action:@selector(originalAction:) forControlEvents:(UIControlEventTouchUpInside)];
}
return _originalBtn;
}
-(UIButton *)giveBtn{
if (!_giveBtn) {
_giveBtn = [[UIButton alloc] init];
[_giveBtn setImage:[UIImage imageNamed:@"room_song_give"] forState:(UIControlStateNormal)];
[_giveBtn setTitle:QXText(@"打赏") forState:(UIControlStateNormal)];
[_giveBtn setTitleColor:QXConfig.themeColor forState:(UIControlStateNormal)];
[_giveBtn addTarget:self action:@selector(giveAction) forControlEvents:(UIControlEventTouchUpInside)];
_giveBtn.titleLabel.font = [UIFont systemFontOfSize:12];
}
return _giveBtn;
}
-(UIButton *)nextBtn{
if (!_nextBtn) {
_nextBtn = [[UIButton alloc] init];
[_nextBtn setImage:[UIImage imageNamed:@"room_song_next"] forState:(UIControlStateNormal)];
[_nextBtn setTitle:QXText(@"切歌") forState:(UIControlStateNormal)];
[_nextBtn setTitleColor:QXConfig.themeColor forState:(UIControlStateNormal)];
_nextBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[_nextBtn addTarget:self action:@selector(nextAction) forControlEvents:(UIControlEventTouchUpInside)];
}
return _nextBtn;
}
-(UIButton *)endBtn{
if (!_endBtn) {
_endBtn = [[UIButton alloc] init];
[_endBtn setImage:[UIImage imageNamed:@"room_song_close"] forState:(UIControlStateNormal)];
[_endBtn setTitle:QXText(@"结束") forState:(UIControlStateNormal)];
[_endBtn setTitleColor:QXConfig.themeColor forState:(UIControlStateNormal)];
_endBtn.titleLabel.font = [UIFont systemFontOfSize:12];
[_endBtn addTarget:self action:@selector(endAction) forControlEvents:(UIControlEventTouchUpInside)];
}
return _endBtn;
}
//-(UIButton *)ktvConifgBtn{
// if (!_ktvConifgBtn) {
// _ktvConifgBtn = [[UIButton alloc] init];
// [_ktvConifgBtn setImage:[UIImage imageNamed:@"room_sing_set"] forState:(UIControlStateNormal)];
// [_ktvConifgBtn setTitle:QXText(@"设置") forState:(UIControlStateNormal)];
// [_ktvConifgBtn setTitleColor:QXConfig.themeColor forState:(UIControlStateNormal)];
// _ktvConifgBtn.titleLabel.font = [UIFont systemFontOfSize:12];
// [_ktvConifgBtn addTarget:self action:@selector(setAction) forControlEvents:(UIControlEventTouchUpInside)];
// }
// return _ktvConifgBtn;
//}
-(UILabel *)tipsLabel{
if (!_tipsLabel) {
_tipsLabel = [[UILabel alloc] init];
_tipsLabel.text = QXText(@"暂无歌曲~");
_tipsLabel.font = [UIFont systemFontOfSize:15];
_tipsLabel.textColor = [UIColor whiteColor];
_tipsLabel.textAlignment = NSTextAlignmentCenter;
}
return _tipsLabel;
}
-(NSMutableArray *)dataArray{
if (!_dataArray) {
_dataArray = [NSMutableArray array];
}
return _dataArray;
}
-(QXRoomUserInfoView *)userInfoView{
if (!_userInfoView) {
_userInfoView = [[QXRoomUserInfoView alloc] initWithFrame:[UIScreen mainScreen].bounds];
}
return _userInfoView;
}
-(UIImageView *)leftBgImageView{
if (!_leftBgImageView) {
_leftBgImageView = [[UIImageView alloc] init];
}
return _leftBgImageView;
}
@end

View File

@@ -0,0 +1,121 @@
//
// QXRoomSeatView.h
// QXLive
//
// Created by 启星 on 2025/6/7.
//
#import <UIKit/UIKit.h>
#import "QXRoomSeatTypeNormalView.h"
#import "QXRoomModel.h"
#import "QXRoomSeatDelegate.h"
#import "QXRoomFriendRelationModel.h"
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSInteger) {
QXRoomSeatViewTypeNone = 0,
/// 二卡八麦
QXRoomSeatViewTypeNormal ,
/// 拍卖
QXRoomSeatViewTypeAuction,
/// 点唱
QXRoomSeatViewTypeSing,
/// 小黑屋
QXRoomSeatViewTypeCabin,
/// pk
QXRoomSeatViewTypePK,
/// 交友房
QXRoomSeatViewTypeFriend,
}QXRoomSeatViewType;
@interface QXRoomSeatView : UIView
-(instancetype)initWithType:(QXRoomSeatViewType)type;
@property (nonatomic,assign) QXRoomSeatViewType type;
@property (nonatomic,weak)id<QXRoomSeatDelegate>delegate;
@property (nonatomic,strong)QXRoomModel *roomModel;
@property (nonatomic,strong)QXRoomModel *pkRoomModel;
@property (nonatomic,assign)NSInteger myPitNumber;
@property (nonatomic,strong)NSString *lrcUrl;
@property (nonatomic,assign)NSUInteger progress;
@property (nonatomic,assign)double speakerPitch;
@property (nonatomic,strong)QXSongListModel *songInfo;
@property (nonatomic,strong)QXSongListModel *nextInfo;
-(void)stopHWDMP4;
-(void)playHWDMP4;
/// 销毁视图
-(void)destroyViews;
/// 清除魅力
-(void)clearCharm;
/// 清除个人魅力
-(void)roomClearUserCharmWithUserId:(NSString *)userId;
/// 设置魅力
-(void)setSeatCharmWithUser:(QXUserHomeModel*)model;
/// 设置魅力(多个用户)
-(void)setSeatCharmWithUsers:(NSArray<QXUserHomeModel*>*)users;
/// 设置麦位锁麦状态
-(void)setSeatIsLock:(NSString*)isLock pitNumber:(NSString*)pitNumber;
-(void)didUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat pit_number:(NSInteger)pit_number;
/// 房间内用户信息发生变化
-(void)roomUserInfoDidChanged:(QXUserHomeModel *)user;
/// 房间内换麦
-(void)roomSeatExchangedWithFromPitNumber:(NSInteger)fromPitNumber toPitNumber:(NSInteger)toPitNumber userInfo:(QXUserHomeModel*)userInfo;
/// 拍卖位上下麦
-(void)didAuctiontUpDownSeatWithUser:(QXUserHomeModel *)user isUpSeat:(BOOL)isUpSeat;
/// 开始拍卖
-(void)auctionStartOrEndIsStart:(BOOL)isStart user:(QXRoomAuctionUser *)user getUser:(QXRoomAuctionUser *)getUser;
/// 竞拍列表发生变化
-(void)auctionListDidChanged:(NSArray<QXRoomPitModel*> *)list;
/// 拍卖时间发生延时
-(void)auctionDelayTimeWithEndTime:(NSString *)endTime;
/// 拍卖类型发生变化
-(void)auctionTypeDidChanged:(NSString *)type;
/// 私密小屋心动值发生变化
-(void)cabinRoomHotValueDidChanged:(NSString*)hot_value;
/// k歌房魅力榜单发生变化
-(void)songRoomCharmRankListDidChanged:(NSArray<QXRoomPitModel *>*)list;
/// pk开始
-(void)pkStartWithPkEndTimes:(NSString *)pk_end_times pk_id:(NSString*)pk_id;
/// pk值发生变化
-(void)roomPKValueDidChangedWithRoomIdA:(NSString*)room_id_a create_value_a:(NSString*)create_value_a room_id_b:(NSString*)room_id_b receive_value_b:(NSString*)receive_value_b;
/// pk结果
-(void)pkResultWithIsVictory:(NSInteger)isVictory
end_time:(NSString*)end_time
victory_name:(NSString*)victory_name
victory_cover:(NSString*)victory_cover
defeated_name:(NSString*)defeated_name
defeated_cover:(NSString*)defeated_cover;
/// 交友房阶段发生变化 step 阶段 1等待 2心动 3牵手 friend_id 场次id
-(void)friendPartDidChangedWithType:(NSString*)step friend_id:(NSString*)friend_id end_time:(NSString*)end_time relationModel:(QXRoomFriendRelationModel*)relationModel;
/// 交友房时间发生延时 end_time 截止时间
-(void)friendTimeDelayWithTime:(NSString*)end_time;
/// 交友房麦位发生变化
-(void)friendSeatDidChanged:(NSArray<QXRoomPitModel*>*)pitArray;
/// 心动值发生变化
-(void)friendHeartNumberDidChanged:(NSArray<QXRoomFriendHeartListModel *> *)heartArray;
/// 关系创建完成
-(void)friendRelationIsCreatedWithrelationModel:(QXRoomFriendRelationModel*)relationModel;
/// 有人退出交友房私密小屋
-(void)friendCabinRoomIsQuit;
/// 私密小屋时间发生延时
-(void)friendCabinRoomTimeDelayWithTime:(NSString*)end_time;
@end
NS_ASSUME_NONNULL_END

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,17 @@
//
// QXSongSeatCell.h
// QXLive
//
// Created by 启星 on 2025/6/18.
//
#import <UIKit/UIKit.h>
#import "QXRoomSeatContentView.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXSongSeatCell : UICollectionViewCell
@property (nonatomic,strong)QXRoomSeatContentView *seatContentView;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,35 @@
//
// QXSongSeatCell.m
// QXLive
//
// Created by on 2025/6/18.
//
#import "QXSongSeatCell.h"
@implementation QXSongSeatCell
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.seatContentView = [[QXRoomSeatContentView alloc] init];
self.seatContentView.onlyShowHeader = NO;
[self.contentView addSubview: self.seatContentView];
[self.seatContentView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.top.bottom.equalTo(self.contentView);
}];
}
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
@end