爵位完成

This commit is contained in:
启星
2025-11-11 17:19:21 +08:00
parent 406c481ba4
commit 7ac937ddbf
136 changed files with 3492 additions and 89 deletions

View File

@@ -787,7 +787,7 @@
"$(inherited)", "$(inherited)",
"$(SDKROOT)/usr/lib/swift", "$(SDKROOT)/usr/lib/swift",
); );
MARKETING_VERSION = 1.1.2; MARKETING_VERSION = 1.1.3;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive; PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@@ -853,7 +853,7 @@
"$(inherited)", "$(inherited)",
"$(SDKROOT)/usr/lib/swift", "$(SDKROOT)/usr/lib/swift",
); );
MARKETING_VERSION = 1.1.2; MARKETING_VERSION = 1.1.3;
PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive; PRODUCT_BUNDLE_IDENTIFIER = com.qxcm.qxlive;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";

View File

@@ -157,9 +157,9 @@
itemH = (SCREEN_WIDTH-15-15-15)/2 + 94; itemH = (SCREEN_WIDTH-15-15-15)/2 + 94;
}else if(imgArr.count > 1){ }else if(imgArr.count > 1){
if (imgArr.count > 3) { if (imgArr.count > 3) {
itemH = (SCREEN_WIDTH-16*2-12*2-10*2)/3*2+10+94; itemH = (SCREEN_WIDTH-16*2-12*2-10*2)/3*2+10+94+ScaleWidth(10);
}else{ }else{
itemH = (SCREEN_WIDTH-16*2-12*2-10*2)/3+94; itemH = (SCREEN_WIDTH-16*2-12*2-10*2)/3+94+ScaleWidth(10);
} }
}else{ }else{
itemH = 94; itemH = 94;

View File

@@ -49,6 +49,16 @@
-(void)setModel:(QXUserHomeModel *)model{ -(void)setModel:(QXUserHomeModel *)model{
_model = model; _model = model;
[self.avatarImgV setHeadIcon:model.avatar dress:@""]; [self.avatarImgV setHeadIcon:model.avatar dress:@""];
if ([model.nobility_image isExist]) {
[self.avatarImgV.nobilityImageView sd_setImageWithURL:[NSURL URLWithString:model.nobility_image]];
}else{
self.avatarImgV.nobilityImageView.image = nil;
}
if ([model.nickname_color isExist]) {
self.nicknameLab.textColor = [UIColor colorWithHexString:model.nickname_color];
}else{
self.nicknameLab.textColor = RGB16(0x212121);
}
self.nicknameLab.text = model.nickname; self.nicknameLab.text = model.nickname;
self.ageLabel.text = [NSString stringWithFormat:@"%ld岁 ip属地: %@",[model.birthday ageWithDateOfBirth],model.loginip]; self.ageLabel.text = [NSString stringWithFormat:@"%ld岁 ip属地: %@",[model.birthday ageWithDateOfBirth],model.loginip];
CGFloat imgWidth = (SCREEN_WIDTH-16*2-12*2-10*2)/3; CGFloat imgWidth = (SCREEN_WIDTH-16*2-12*2-10*2)/3;

View File

@@ -20,9 +20,9 @@
<rect key="frame" x="16" y="6" width="339" height="83"/> <rect key="frame" x="16" y="6" width="339" height="83"/>
<subviews> <subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ij8-0l-yjh"> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="ij8-0l-yjh">
<rect key="frame" x="12" y="12" width="50" height="50"/> <rect key="frame" x="12" y="12" width="50" height="60"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="50" id="Aa4-FN-u4i"/> <constraint firstAttribute="width" secondItem="ij8-0l-yjh" secondAttribute="height" multiplier="50:60" id="6E5-lr-xCi"/>
<constraint firstAttribute="width" constant="50" id="b1V-LD-cvU"/> <constraint firstAttribute="width" constant="50" id="b1V-LD-cvU"/>
</constraints> </constraints>
<userDefinedRuntimeAttributes> <userDefinedRuntimeAttributes>
@@ -33,10 +33,10 @@
</userDefinedRuntimeAttributes> </userDefinedRuntimeAttributes>
</imageView> </imageView>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SRz-S8-eVY" customClass="QXSeatHeaderView"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SRz-S8-eVY" customClass="QXSeatHeaderView">
<rect key="frame" x="12" y="12" width="50" height="50"/> <rect key="frame" x="12" y="12" width="50" height="60"/>
</view> </view>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8cq-E3-DvJ"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8cq-E3-DvJ">
<rect key="frame" x="72" y="19" width="40" height="18"/> <rect key="frame" x="93" y="20" width="40" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="18" id="qwD-PD-2sr"/> <constraint firstAttribute="height" constant="18" id="qwD-PD-2sr"/>
</constraints> </constraints>
@@ -45,14 +45,14 @@
<nil key="highlightedColor"/> <nil key="highlightedColor"/>
</label> </label>
<imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="gIi-P2-Y9S"> <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="gIi-P2-Y9S">
<rect key="frame" x="118" y="20" width="42" height="16"/> <rect key="frame" x="139" y="21" width="42" height="16"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="42" id="Pa0-JD-WZI"/> <constraint firstAttribute="width" constant="42" id="Pa0-JD-WZI"/>
<constraint firstAttribute="height" constant="16" id="nev-GJ-TTd"/> <constraint firstAttribute="height" constant="16" id="nev-GJ-TTd"/>
</constraints> </constraints>
</imageView> </imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SfJ-0f-fTV"> <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="SfJ-0f-fTV">
<rect key="frame" x="72" y="45" width="31.666666666666671" height="14.666666666666664"/> <rect key="frame" x="72" y="46" width="31.666666666666671" height="14.666666666666664"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14.67" id="ZBE-6b-COh"/> <constraint firstAttribute="height" constant="14.67" id="ZBE-6b-COh"/>
</constraints> </constraints>
@@ -65,7 +65,7 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
</button> </button>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WzX-5h-Rjx"> <button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="WzX-5h-Rjx">
<rect key="frame" x="254" y="24" width="73" height="26"/> <rect key="frame" x="254" y="29" width="73" height="26"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="73" id="xrz-si-tcM"/> <constraint firstAttribute="width" constant="73" id="xrz-si-tcM"/>
<constraint firstAttribute="height" constant="26" id="zly-Ov-2fX"/> <constraint firstAttribute="height" constant="26" id="zly-Ov-2fX"/>
@@ -83,14 +83,14 @@
</connections> </connections>
</button> </button>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aff-rQ-ltL"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="aff-rQ-ltL">
<rect key="frame" x="12" y="71" width="315" height="0.0"/> <rect key="frame" x="12" y="81" width="315" height="0.0"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints> <constraints>
<constraint firstAttribute="height" id="HM6-cc-JXk"/> <constraint firstAttribute="height" id="HM6-cc-JXk"/>
</constraints> </constraints>
</view> </view>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="rE2-Ub-cG3"> <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="rE2-Ub-cG3">
<rect key="frame" x="46" y="46" width="16" height="16"/> <rect key="frame" x="72" y="21" width="16" height="16"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="16" id="hDn-pN-Z1j"/> <constraint firstAttribute="width" constant="16" id="hDn-pN-Z1j"/>
<constraint firstAttribute="height" constant="16" id="txd-O6-q3p"/> <constraint firstAttribute="height" constant="16" id="txd-O6-q3p"/>
@@ -106,18 +106,18 @@
<constraint firstItem="gIi-P2-Y9S" firstAttribute="leading" secondItem="8cq-E3-DvJ" secondAttribute="trailing" constant="6" id="9a3-JM-DNn"/> <constraint firstItem="gIi-P2-Y9S" firstAttribute="leading" secondItem="8cq-E3-DvJ" secondAttribute="trailing" constant="6" id="9a3-JM-DNn"/>
<constraint firstItem="SfJ-0f-fTV" firstAttribute="leading" secondItem="ij8-0l-yjh" secondAttribute="trailing" constant="10" id="LpR-OW-ApF"/> <constraint firstItem="SfJ-0f-fTV" firstAttribute="leading" secondItem="ij8-0l-yjh" secondAttribute="trailing" constant="10" id="LpR-OW-ApF"/>
<constraint firstItem="SRz-S8-eVY" firstAttribute="bottom" secondItem="ij8-0l-yjh" secondAttribute="bottom" id="PL9-sW-Etp"/> <constraint firstItem="SRz-S8-eVY" firstAttribute="bottom" secondItem="ij8-0l-yjh" secondAttribute="bottom" id="PL9-sW-Etp"/>
<constraint firstItem="8cq-E3-DvJ" firstAttribute="top" secondItem="d7u-yz-ciJ" secondAttribute="top" constant="19" id="QB4-FR-hQC"/>
<constraint firstAttribute="trailing" secondItem="aff-rQ-ltL" secondAttribute="trailing" constant="12" id="UJy-KH-Me6"/> <constraint firstAttribute="trailing" secondItem="aff-rQ-ltL" secondAttribute="trailing" constant="12" id="UJy-KH-Me6"/>
<constraint firstItem="rE2-Ub-cG3" firstAttribute="trailing" secondItem="SRz-S8-eVY" secondAttribute="trailing" id="Us7-e2-feo"/>
<constraint firstItem="ij8-0l-yjh" firstAttribute="leading" secondItem="d7u-yz-ciJ" secondAttribute="leading" constant="12" id="VNZ-KS-lUT"/> <constraint firstItem="ij8-0l-yjh" firstAttribute="leading" secondItem="d7u-yz-ciJ" secondAttribute="leading" constant="12" id="VNZ-KS-lUT"/>
<constraint firstItem="rE2-Ub-cG3" firstAttribute="bottom" secondItem="SRz-S8-eVY" secondAttribute="bottom" id="Wkl-qB-guz"/> <constraint firstItem="rE2-Ub-cG3" firstAttribute="leading" secondItem="ij8-0l-yjh" secondAttribute="trailing" constant="10" id="Vpj-sb-ZIl"/>
<constraint firstItem="aff-rQ-ltL" firstAttribute="top" secondItem="ij8-0l-yjh" secondAttribute="bottom" constant="9" id="gpK-ex-dHB"/> <constraint firstItem="aff-rQ-ltL" firstAttribute="top" secondItem="ij8-0l-yjh" secondAttribute="bottom" constant="9" id="gpK-ex-dHB"/>
<constraint firstItem="WzX-5h-Rjx" firstAttribute="centerY" secondItem="ij8-0l-yjh" secondAttribute="centerY" id="lzk-gK-Xr5"/> <constraint firstItem="WzX-5h-Rjx" firstAttribute="centerY" secondItem="ij8-0l-yjh" secondAttribute="centerY" id="lzk-gK-Xr5"/>
<constraint firstItem="8cq-E3-DvJ" firstAttribute="centerY" secondItem="rE2-Ub-cG3" secondAttribute="centerY" id="mVr-ao-77e"/>
<constraint firstItem="SfJ-0f-fTV" firstAttribute="top" secondItem="8cq-E3-DvJ" secondAttribute="bottom" constant="8" symbolic="YES" id="pb7-FA-QT6"/> <constraint firstItem="SfJ-0f-fTV" firstAttribute="top" secondItem="8cq-E3-DvJ" secondAttribute="bottom" constant="8" symbolic="YES" id="pb7-FA-QT6"/>
<constraint firstItem="gIi-P2-Y9S" firstAttribute="centerY" secondItem="8cq-E3-DvJ" secondAttribute="centerY" id="qez-UP-KMH"/> <constraint firstItem="gIi-P2-Y9S" firstAttribute="centerY" secondItem="8cq-E3-DvJ" secondAttribute="centerY" id="qez-UP-KMH"/>
<constraint firstItem="SRz-S8-eVY" firstAttribute="trailing" secondItem="ij8-0l-yjh" secondAttribute="trailing" id="sL4-bA-4lX"/> <constraint firstItem="SRz-S8-eVY" firstAttribute="trailing" secondItem="ij8-0l-yjh" secondAttribute="trailing" id="sL4-bA-4lX"/>
<constraint firstItem="8cq-E3-DvJ" firstAttribute="leading" secondItem="ij8-0l-yjh" secondAttribute="trailing" constant="10" id="xsB-a1-v4y"/> <constraint firstItem="8cq-E3-DvJ" firstAttribute="leading" secondItem="rE2-Ub-cG3" secondAttribute="trailing" constant="5" id="xsB-a1-v4y"/>
<constraint firstAttribute="trailing" secondItem="WzX-5h-Rjx" secondAttribute="trailing" constant="12" id="yE0-Ql-MBm"/> <constraint firstAttribute="trailing" secondItem="WzX-5h-Rjx" secondAttribute="trailing" constant="12" id="yE0-Ql-MBm"/>
<constraint firstItem="ij8-0l-yjh" firstAttribute="top" secondItem="rE2-Ub-cG3" secondAttribute="bottom" constant="-25" id="yi3-el-D4c"/>
</constraints> </constraints>
<userDefinedRuntimeAttributes> <userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/> <userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>

View File

@@ -821,6 +821,10 @@
} }
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
QXGiftModel *model = self.dataArray[indexPath.row]; QXGiftModel *model = self.dataArray[indexPath.row];
if (model.is_lock.intValue == 1) {
showToast(@"请先开通爵位");
return;
}
if ([model.activities_id isEqualToString:@"5"]) { if ([model.activities_id isEqualToString:@"5"]) {
/// ///
if (self.selectetGiftBlock) { if (self.selectetGiftBlock) {

View File

@@ -416,7 +416,7 @@
} }
-(void)getBanner{ -(void)getBanner{
@weakify(self) @weakify(self)
[QXHomePageNetwork homeBannerSuccessBlock:^(NSArray<QXBanner *> * _Nonnull list) { [QXHomePageNetwork homeBannerWithType:@"3" successBlock:^(NSArray<QXBanner *> * _Nonnull list) {
@strongify(self) @strongify(self)
NSMutableArray *arr = [NSMutableArray array]; NSMutableArray *arr = [NSMutableArray array];
for (QXBanner *banner in list) { for (QXBanner *banner in list) {

View File

@@ -34,8 +34,9 @@ NS_ASSUME_NONNULL_BEGIN
/** /**
首页banner 首页banner
*/ */
+(void)homeBannerSuccessBlock:(void (^)(NSArray<QXBanner*>* list))successBlock +(void)homeBannerWithType:(NSString*)type
failBlock:(void (^)(NSError * error, NSString * msg))failBlock; successBlock:(void (^)(NSArray<QXBanner*>* list))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock;
/** /**
魅力/财富榜 魅力/财富榜

View File

@@ -35,9 +35,10 @@
failBlock(error,msg); failBlock(error,msg);
}]; }];
} }
+(void)homeBannerSuccessBlock:(void (^)(NSArray<QXBanner*>* list))successBlock +(void)homeBannerWithType:(NSString*)type
failBlock:(void (^)(NSError * error, NSString * msg))failBlock{ successBlock:(void (^)(NSArray<QXBanner*>* list))successBlock
[[QXRequset shareInstance] getWithUrl:QXHomeBanner parameters:@{@"type":@"3"} needCache:NO success:^(id responseObject) { failBlock:(void (^)(NSError * error, NSString * msg))failBlock{
[[QXRequset shareInstance] getWithUrl:QXHomeBanner parameters:@{@"type":type?:@"3"} needCache:NO success:^(id responseObject) {
if (successBlock) { if (successBlock) {
NSArray *list = [NSArray yy_modelArrayWithClass:[QXBanner class] json:responseObject[@"data"]]; NSArray *list = [NSArray yy_modelArrayWithClass:[QXBanner class] json:responseObject[@"data"]];
successBlock(list); successBlock(list);

View File

@@ -36,6 +36,14 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *dress; @property (nonatomic,strong)NSString *dress;
/// 聊天气泡 /// 聊天气泡
@property (nonatomic,strong)NSString *chat_bubble; @property (nonatomic,strong)NSString *chat_bubble;
/// 爵位图片
@property (nonatomic,strong)NSString *nobility_image;
/// 昵称颜色
@property (nonatomic,strong)NSString *nickname_color;
/// 是否可以设置隐身进入的状态0-不行1-可以
@property (nonatomic,strong)NSString *is_hide;
/// 当前状态0-取消隐身1-隐身进入
@property (nonatomic,strong)NSString *hide_status;
/// 各种卡片 /// 各种卡片
@property (nonatomic,strong)NSArray *icon; @property (nonatomic,strong)NSArray *icon;
/// 1 能聊天 0不能聊天 /// 1 能聊天 0不能聊天

View File

@@ -12,6 +12,7 @@
#import "QXGiftDisplayManager.h" #import "QXGiftDisplayManager.h"
#import <AgoraRtcKit/AgoraRtcEngineKit.h> #import <AgoraRtcKit/AgoraRtcEngineKit.h>
#import "TUIChatConfig.h" #import "TUIChatConfig.h"
#import "QXDrifNobilityJoinRoomView.h"
@interface QXRoomMessageManager() <V2TIMGroupListener,V2TIMSimpleMsgListener,V2TIMAdvancedMsgListener> @interface QXRoomMessageManager() <V2TIMGroupListener,V2TIMSimpleMsgListener,V2TIMAdvancedMsgListener>
@property (nonatomic,strong)NSString *groupId; @property (nonatomic,strong)NSString *groupId;
@@ -109,6 +110,9 @@
// md.play_image = jia_jia; // md.play_image = jia_jia;
[[QXGiftPlayerManager shareManager] displayChatEffectView:jia_jia]; [[QXGiftPlayerManager shareManager] displayChatEffectView:jia_jia];
} }
if ([model.FromUserInfo.enter_image isExist]) {
[[QXDrifNobilityJoinRoomView shareView] addNobilityUserModel:model];
}
if (self.delegate && [self.delegate respondsToSelector:@selector(didInsertMessge:)]) { if (self.delegate && [self.delegate respondsToSelector:@selector(didInsertMessge:)]) {
[self.delegate didInsertMessge:model]; [self.delegate didInsertMessge:model];
} }
@@ -743,6 +747,8 @@
@"avatar":[QXGlobal shareGlobal].loginModel.avatar?[QXGlobal shareGlobal].loginModel.avatar:@"", @"avatar":[QXGlobal shareGlobal].loginModel.avatar?[QXGlobal shareGlobal].loginModel.avatar:@"",
@"icon":[QXGlobal shareGlobal].loginModel.icon?[QXGlobal shareGlobal].loginModel.icon:@"", @"icon":[QXGlobal shareGlobal].loginModel.icon?[QXGlobal shareGlobal].loginModel.icon:@"",
@"chat_bubble":[QXGlobal shareGlobal].loginModel.chat_bubble?:@"", @"chat_bubble":[QXGlobal shareGlobal].loginModel.chat_bubble?:@"",
@"nobility_image":[QXGlobal shareGlobal].loginModel.nobility_image?:@"",
@"nickname_color":[QXGlobal shareGlobal].loginModel.nickname_color?:@"",
}, },
@"text":message @"text":message
} }
@@ -756,6 +762,8 @@
userInfo.user_id = [QXGlobal shareGlobal].loginModel.user_id; userInfo.user_id = [QXGlobal shareGlobal].loginModel.user_id;
userInfo.icon = [QXGlobal shareGlobal].loginModel.icon; userInfo.icon = [QXGlobal shareGlobal].loginModel.icon;
userInfo.chat_bubble = [QXGlobal shareGlobal].loginModel.chat_bubble; userInfo.chat_bubble = [QXGlobal shareGlobal].loginModel.chat_bubble;
userInfo.nobility_image = [QXGlobal shareGlobal].loginModel.nobility_image;
userInfo.nickname_color = [QXGlobal shareGlobal].loginModel.nickname_color;
model.FromUserInfo = userInfo; model.FromUserInfo = userInfo;
model.messageType = QXRoomChatMessageTypeChat; model.messageType = QXRoomChatMessageTypeChat;
if (self.delegate && [self.delegate respondsToSelector:@selector(didInsertMessge:)]) { if (self.delegate && [self.delegate respondsToSelector:@selector(didInsertMessge:)]) {
@@ -783,6 +791,8 @@
@"avatar":[QXGlobal shareGlobal].loginModel.avatar?[QXGlobal shareGlobal].loginModel.avatar:@"", @"avatar":[QXGlobal shareGlobal].loginModel.avatar?[QXGlobal shareGlobal].loginModel.avatar:@"",
@"icon":[QXGlobal shareGlobal].loginModel.icon?[QXGlobal shareGlobal].loginModel.icon:@"", @"icon":[QXGlobal shareGlobal].loginModel.icon?[QXGlobal shareGlobal].loginModel.icon:@"",
@"chat_bubble":[QXGlobal shareGlobal].loginModel.chat_bubble?:@"", @"chat_bubble":[QXGlobal shareGlobal].loginModel.chat_bubble?:@"",
@"nobility_image":[QXGlobal shareGlobal].loginModel.nobility_image?:@"",
@"nickname_color":[QXGlobal shareGlobal].loginModel.nickname_color?:@"",
}, },
@"emoji":@{ @"emoji":@{
@"image":emoji.image?:@"", @"image":emoji.image?:@"",
@@ -799,6 +809,8 @@
userInfo.user_id = [QXGlobal shareGlobal].loginModel.user_id; userInfo.user_id = [QXGlobal shareGlobal].loginModel.user_id;
userInfo.icon = [QXGlobal shareGlobal].loginModel.icon; userInfo.icon = [QXGlobal shareGlobal].loginModel.icon;
userInfo.chat_bubble = [QXGlobal shareGlobal].loginModel.chat_bubble; userInfo.chat_bubble = [QXGlobal shareGlobal].loginModel.chat_bubble;
userInfo.nobility_image = [QXGlobal shareGlobal].loginModel.nobility_image;
userInfo.nickname_color = [QXGlobal shareGlobal].loginModel.nickname_color;
model.FromUserInfo = userInfo; model.FromUserInfo = userInfo;
model.messageType = QXRoomChatMessageTypeEmoji; model.messageType = QXRoomChatMessageTypeEmoji;
model.emoji = emoji; model.emoji = emoji;

View File

@@ -31,6 +31,8 @@
#import "QXWalletRuleView.h" #import "QXWalletRuleView.h"
#import "QXRechargeViewcController.h" #import "QXRechargeViewcController.h"
#import "QXGiftWallViewController.h" #import "QXGiftWallViewController.h"
#import "QXNobilityViewController.h"
#import "QXHomePageNetwork.h"
#import <WXApi.h> #import <WXApi.h>
@interface QXMineViewController ()<UITableViewDelegate,UITableViewDataSource,QXMineServiceCellDelegate,QXMainHeaderViewDelegate> @interface QXMineViewController ()<UITableViewDelegate,UITableViewDataSource,QXMineServiceCellDelegate,QXMainHeaderViewDelegate>
@@ -40,6 +42,7 @@
//@property (nonatomic,strong)UIButton *serviceBtn; //@property (nonatomic,strong)UIButton *serviceBtn;
//@property (nonatomic,strong)UIButton *settingBtn; //@property (nonatomic,strong)UIButton *settingBtn;
@property (nonatomic,strong)QXUserModel *userModel; @property (nonatomic,strong)QXUserModel *userModel;
@property (nonatomic,strong)NSMutableArray *bannerArry;
@end @end
@implementation QXMineViewController @implementation QXMineViewController
@@ -81,6 +84,7 @@
// make.centerY.width.height.equalTo(self.settingBtn); // make.centerY.width.height.equalTo(self.settingBtn);
// }]; // }];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(passwordDidChanged) name:noticeChangePassword object:nil]; [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(passwordDidChanged) name:noticeChangePassword object:nil];
[self getBanner];
} }
-(void)getUserInfo{ -(void)getUserInfo{
MJWeakSelf MJWeakSelf
@@ -167,7 +171,8 @@
break; break;
case QXMainHeaderOptionTypeNobility:{ case QXMainHeaderOptionTypeNobility:{
QXLOG(@"跳转贵族"); QXLOG(@"跳转贵族");
QXNobilityViewController *vc = [[QXNobilityViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
} }
break; break;
case QXMainHeaderOptionTypeRecharge:{ case QXMainHeaderOptionTypeRecharge:{
@@ -290,9 +295,18 @@
} }
} }
} }
-(void)getBanner{
MJWeakSelf
[QXHomePageNetwork homeBannerWithType:@"6" successBlock:^(NSArray<QXBanner *> * _Nonnull list) {
weakSelf.tableHeaderView.bannerArray = list;
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(void)gotoSetting{ -(void)gotoSetting{
QXSettingViewController *vc = [[QXSettingViewController alloc] init]; QXSettingViewController *vc = [[QXSettingViewController alloc] init];
vc.haveNobility = self.userModel.is_hide.intValue == 1;
MJWeakSelf MJWeakSelf
vc.logOutBlock = ^(BOOL isCancel) { vc.logOutBlock = ^(BOOL isCancel) {
if (isCancel) { if (isCancel) {
@@ -361,6 +375,12 @@
} }
return _tableView; return _tableView;
} }
-(NSMutableArray *)bannerArry{
if (!_bannerArry) {
_bannerArry = [NSMutableArray array];
}
return _bannerArry;
}
//-(UIButton *)settingBtn{ //-(UIButton *)settingBtn{
// if (!_settingBtn) { // if (!_settingBtn) {
// _settingBtn = [[UIButton alloc] init]; // _settingBtn = [[UIButton alloc] init];

View File

@@ -0,0 +1,16 @@
//
// QXBuyNobilitySuccessViewController.h
// QXLive
//
// Created by 启星 on 2025/11/10.
//
#import "QXBaseViewController.h"
#import "QXNobilityGetPriceModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXBuyNobilitySuccessViewController : QXBaseViewController
@property (nonatomic,strong)QXNobilityGetPriceModel *model;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,142 @@
//
// QXBuyNobilitySuccessViewController.m
// QXLive
//
// Created by on 2025/11/10.
//
#import "QXBuyNobilitySuccessViewController.h"
#import "QXNobilityBuyDesCell.h"
@interface QXBuyNobilitySuccessViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,strong)UITableView *tableView;
@property (nonatomic,strong)UIView *headerView;
@property (nonatomic,strong)UIImageView *resultImageView;
@property (nonatomic,strong)UILabel *resultLabel;
@property (nonatomic,strong)UILabel *titleLabel;
@property (nonatomic,strong)UIImageView *nobilityImageView;
@end
@implementation QXBuyNobilitySuccessViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
}
-(void)initSubViews{
self.titleLabel.text = [NSString stringWithFormat:@"恭喜您已经成功开通%@爵位",self.model.nobility_name];
[self.nobilityImageView sd_setImageWithURL:[NSURL URLWithString:self.model.nobility_image]];
self.tableView.tableHeaderView = self.headerView;
[self.view addSubview:self.tableView];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return self.model.power_list.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
QXNobilityBuyDesCell *cell = [QXNobilityBuyDesCell cellWithTableView:tableView];
QXNobilityGetPricePowerList *md = self.model.power_list[indexPath.row];
cell.titleLabel.text = md.content;
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 36;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 42)];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(16, 12, SCREEN_WIDTH-32, 30)];
label.font = [UIFont boldSystemFontOfSize:16];
label.text = @"骑士特权";
label.textColor = RGB16A(0x000000, 0.85);
[header addSubview:label];
return header;
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 42;
}
-(UITableView *)tableView{
if (!_tableView) {
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, NavContentHeight, SCREEN_WIDTH, SCREEN_HEIGHT-NavContentHeight) style:UITableViewStyleGrouped];
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
return _tableView;
}
-(UIView *)headerView{
if (!_headerView) {
_headerView = [[UIView alloc] initWithFrame:CGRectMake(0, NavContentHeight, SCREEN_WIDTH, 280)];
[_headerView addSubview:self.resultImageView];
[_headerView addSubview:self.resultLabel];
[_headerView addSubview:self.titleLabel];
[_headerView addSubview:self.nobilityImageView];
[self.resultImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(68);
make.height.mas_equalTo(60);
make.top.mas_equalTo(25);
make.centerX.equalTo(_headerView);
}];
[self.resultLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(22);
make.centerX.equalTo(_headerView);
make.top.equalTo(self.resultImageView.mas_bottom).offset(7);
}];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.height.mas_equalTo(20);
make.centerX.equalTo(_headerView);
make.top.equalTo(self.resultLabel.mas_bottom).offset(7);
}];
[self.nobilityImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(104);
make.height.mas_equalTo(104);
make.top.equalTo(self.titleLabel.mas_bottom).offset(36);
make.centerX.equalTo(_headerView);
}];
}
return _headerView;
}
-(UIImageView *)resultImageView{
if (!_resultImageView) {
_resultImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nobility_pay_result_successs"]];
}
return _resultImageView;
}
-(UILabel *)resultLabel{
if (!_resultLabel) {
_resultLabel = [[UILabel alloc] init];
_resultLabel.textColor = RGB16(0x333333);
_resultLabel.font = [UIFont boldSystemFontOfSize:20];
_resultLabel.text = @"支付成功";
}
return _resultLabel;
}
-(UILabel *)titleLabel{
if (!_titleLabel) {
_titleLabel = [[UILabel alloc] init];
_titleLabel.textColor = RGB16A(0x000000,0.65);
_titleLabel.font = [UIFont systemFontOfSize:14];
}
return _titleLabel;
}
-(UIImageView *)nobilityImageView{
if (!_nobilityImageView) {
_nobilityImageView = [[UIImageView alloc] init];
}
return _nobilityImageView;
}
@end

View File

@@ -0,0 +1,17 @@
//
// QXNobilityBuyViewController.h
// QXLive
//
// Created by 启星 on 2025/11/7.
//
#import "QXBaseViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityBuyViewController : QXBaseViewController
/// 购买id
@property (nonatomic,strong)NSString *nobility_id;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,343 @@
//
// QXNobilityBuyViewController.m
// QXLive
//
// Created by on 2025/11/7.
//
#import "QXNobilityBuyViewController.h"
#import "QXNobilityBuyDesCell.h"
#import "QXRechargePayTypeTableCell.h"
#import "QXNobilityPriceView.h"
#import "QXMineNetwork.h"
#import "QXBuyNobilitySuccessViewController.h"
#import <AlipaySDK/AlipaySDK.h>
#import <WXApi.h>
@interface QXNobilityBuyViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,strong)UITableView *tableView;
@property (nonatomic,strong)QXNobilityGetPriceModel *model;
@property (nonatomic,strong)NSMutableArray* payTypeArray;
@property (nonatomic,strong)QXNobilityPriceView *priceView;
@property (nonatomic,strong)UIView *footerView;
@property (nonatomic,strong)UIView *tableFooterView;
@property (nonatomic,assign)BOOL isSelectedAgreement;
@property (nonatomic,strong)QXPayTypeModel* selectedPayTypeModel;
@end
@implementation QXNobilityBuyViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
}
-(void)setNavgationItems{
[super setNavgationItems];
self.navigationItem.title = @"支付";
}
- (void)initSubViews{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(paySuccess) name:noticeAlipayResult object:nil];
self.tableView.tableHeaderView = self.priceView;
self.tableView.tableFooterView = self.tableFooterView;
[self.view addSubview:self.tableView];
[self getRechargeList];
}
-(void)setNobility_id:(NSString *)nobility_id{
_nobility_id = nobility_id;
MJWeakSelf
[QXMineNetwork getNobilityPriceWithId:nobility_id successBlock:^(QXNobilityGetPriceModel * _Nonnull model) {
weakSelf.model = model;
weakSelf.priceView.model = model;
[weakSelf.tableView reloadData];
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(void)getRechargeList{
MJWeakSelf
[QXMineNetwork walletPayTypeWithUserId:QXGlobal.shareGlobal.loginModel.user_id successBlock:^(QXPayTypeStatusModel * _Nonnull model) {
[weakSelf.payTypeArray removeAllObjects];
if (model.wx.is_pay_open.intValue == 1) {
[weakSelf.payTypeArray addObject:model.wx];
}
if (model.ali.is_pay_open.intValue == 1) {
[weakSelf.payTypeArray addObject:model.ali];
}
if (model.wx_tl.is_pay_open.intValue == 1) {
[weakSelf.payTypeArray addObject:model.wx_tl];
}
if (model.ali_tl.is_pay_open.intValue == 1) {
[weakSelf.payTypeArray addObject:model.ali_tl];
}
[weakSelf.tableView reloadData];
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(void)payAction{
if (!self.isSelectedAgreement) {
showToast(@"请先阅读并同意爵位用户协议");
return;
}
if (self.selectedPayTypeModel == nil) {
showToast(@"请选择支付方式");
return;
}
@weakify(self)
[QXMineNetwork rechargePayWithMoney:self.model.price coin:@"" type:self.selectedPayTypeModel.type userId:QXGlobal.shareGlobal.loginModel.user_id typeId:@"" nobility_id:self.nobility_id successBlock:^(NSDictionary * _Nonnull dict) {
@strongify(self)
if (self.selectedPayTypeModel.type.intValue == 2) {
NSDictionary *resultDict = dict[@"data"];
NSString *order = [NSString stringWithFormat:@"%@",resultDict[@"ali"]];
[[AlipaySDK defaultService] payOrder:order fromScheme:AppScheme callback:^(NSDictionary *resultDic) {
NSLog(@"支付宝H5支付回调 - %@", resultDic);
}];
}else if (self.selectedPayTypeModel.type.intValue == 1) {
NSDictionary *resultDict = dict[@"data"][@"wx"];
NSString *appid = resultDict[@"appid"];
NSString *partnerId = resultDict[@"partnerid"];
NSString *prepayId = [NSString stringWithFormat:@"%@",resultDict[@"prepayid"]];
NSString *nonceStr = resultDict[@"noncestr"];
UInt32 timeStamp = (UInt32)[resultDict[@"timestamp"] intValue];
NSString *package = resultDict[@"package"];
NSString *sign = resultDict[@"sign"];
PayReq *req = [[PayReq alloc] init];
req.openID = appid;
req.partnerId = partnerId;
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp = timeStamp;
req.package = package;
req.sign = sign;
[WXApi sendReq:req completion:^(BOOL success) {
}];
}
else if (self.selectedPayTypeModel.type.intValue == 4) {
NSMutableDictionary*dic = [NSMutableDictionary dictionaryWithDictionary:dict[@"data"][@"tl"]];
[dic removeObjectForKey:@"json_data"];
NSString *json = [dic jsonStringEncoded];
NSString *thirdPartSchema = [NSString stringWithFormat:@"thirdPartSchema=%@://",AppScheme];
NSString *json1 = [json stringByReplacingOccurrencesOfString:@"\\" withString:@""];
NSCharacterSet *customSet1 = [[NSCharacterSet characterSetWithCharactersInString:@"!*'();:@&=+$,/?%#[]{}\""] invertedSet];
// NSCharacterSet *customSet2 = [[NSCharacterSet characterSetWithCharactersInString:@"!*'();:@&=+$,/?%#[]{}\""] invertedSet];
NSCharacterSet *customSet3 = [[NSCharacterSet characterSetWithCharactersInString:@"!*'();:@&=+$,/?%#[]{}\""] invertedSet];
NSString *json2 = [json1 stringByAddingPercentEncodingWithAllowedCharacters:customSet1];
NSString *encodedString = [thirdPartSchema stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
NSString *queryString = [NSString stringWithFormat:@"payinfo=%@", json2];
NSString *doubleEncodedQuery = [queryString stringByAddingPercentEncodingWithAllowedCharacters:customSet3];
NSString *jumpStr = [NSString stringWithFormat:@"alipays://platformapi/startapp?appId=2021001104615521&page=pages/orderDetail/orderDetail&%@&query=%@",encodedString,doubleEncodedQuery];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:jumpStr] options:@{} completionHandler:nil];
}else if (self.selectedPayTypeModel.type.intValue == 5) {
WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object];
launchMiniProgramReq.userName = @"gh_e64a1a89a0ad";
NSDictionary *dic = dict[@"data"][@"tl"];
NSString *param = @"";
for (NSString*key in dic.allKeys) {
if (param.length == 0) {
param = [param stringByAppendingFormat:@"%@=%@",key,dic[key]];
}else{
param = [param stringByAppendingFormat:@"&%@=%@",key,dic[key]];
}
}
launchMiniProgramReq.path = [NSString stringWithFormat:@"pages/orderDetail/orderDetail?%@",param];
launchMiniProgramReq.miniProgramType = WXMiniProgramTypeRelease;
[WXApi sendReq:launchMiniProgramReq completion:nil];
}
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(void)paySuccess{
QXBuyNobilitySuccessViewController *vc = [[QXBuyNobilitySuccessViewController alloc] init];
vc.model = self.model;
[self.navigationController pushViewController:vc animated:YES];
}
-(void)agreementAction{
// id = 30;
NSString *urlString = [NSString stringWithFormat:@"%@api/Page/page_show?id=%@",ServerUrl,@"30"];
QXBaseWebViewController *vc = [[QXBaseWebViewController alloc] init];
vc.urlStr = urlString;
[self.navigationController pushViewController:vc animated:YES];
}
-(void)selectedAction:(UIButton*)sender{
sender.selected = !sender.selected;
self.isSelectedAgreement = sender.isSelected;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 2;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (section == 0) {
return self.payTypeArray.count;
}else{
return self.model.power_list.count;
}
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == 0) {
QXRechargePayTypeTableCell *cell = [QXRechargePayTypeTableCell cellWithTableView:tableView];
cell.model = self.payTypeArray[indexPath.row];
return cell;
}else{
QXNobilityBuyDesCell *cell = [QXNobilityBuyDesCell cellWithTableView:tableView];
QXNobilityGetPricePowerList *md = self.model.power_list[indexPath.row];
cell.titleLabel.text = md.content;
return cell;
}
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 36;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
if (section == 0) {
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 42)];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(16, 12, SCREEN_WIDTH-32, 30)];
label.font = [UIFont boldSystemFontOfSize:16];
label.text = @"支付方式";
label.textColor = RGB16A(0x000000, 0.85);
[header addSubview:label];
return header;
}else{
return nil;
}
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
if (section == 0) {
return 42;
}else{
return 0;
}
}
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
if (section == 0) {
return self.footerView;
}
return nil;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
if (section == 0) {
return self.footerView.height;
}
return 0;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if (indexPath.section == 0) {
QXPayTypeModel *model = self.payTypeArray[indexPath.row];
if (model == self.selectedPayTypeModel) {
return;
}
if (self.selectedPayTypeModel) {
self.selectedPayTypeModel.isSelected = NO;
}
model.isSelected = YES;
self.selectedPayTypeModel = model;
[tableView reloadData];
}
}
-(UITableView *)tableView{
if (!_tableView) {
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, NavContentHeight, SCREEN_WIDTH, SCREEN_HEIGHT-NavContentHeight) style:UITableViewStyleGrouped];
self.tableView.backgroundColor = [UIColor clearColor];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
return _tableView;
}
-(QXNobilityPriceView *)priceView{
if (!_priceView) {
_priceView = [[QXNobilityPriceView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 187)];
}
return _priceView;
}
-(UIView *)footerView{
if (!_footerView) {
_footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 120)];
UIButton *payBtn = [[UIButton alloc] initWithFrame:CGRectMake(37, 28, SCREEN_WIDTH-37*2, 42)];
payBtn.backgroundColor = QXConfig.themeColor;
[payBtn addRoundedCornersWithRadius:21];
[payBtn setTitle:@"立即支付" forState:(UIControlStateNormal)];
[payBtn setTitleColor:QXConfig.btnTextColor forState:(UIControlStateNormal)];
payBtn.titleLabel.font = [UIFont systemFontOfSize:14];
[payBtn addTarget:self action:@selector(payAction) forControlEvents:(UIControlEventTouchUpInside)];
[_footerView addSubview:payBtn];
UILabel *titleLabel = [[UILabel alloc] init];
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:@"点击支付即表示您同意《爵位用户协议》"];
[attr yy_setColor:QXConfig.textColor range:NSMakeRange(0, attr.length)];
[attr yy_setColor:QXConfig.themeColor range:NSMakeRange(attr.length-8, 8)];
[attr yy_setFont:[UIFont systemFontOfSize:12] range:NSMakeRange(0, attr.length)];
titleLabel.attributedText = attr;
[titleLabel sizeToFit];
titleLabel.x = (SCREEN_WIDTH-titleLabel.width)/2+15;
titleLabel.y = payBtn.bottom+9;
titleLabel.height = 30;
[_footerView addSubview:titleLabel];
UIButton *agreementBtn = [[UIButton alloc] initWithFrame:CGRectMake(titleLabel.right-100, titleLabel.top, 100, 30)];
[agreementBtn addTarget:self action:@selector(agreementAction) forControlEvents:(UIControlEventTouchUpInside)];
[_footerView addSubview:agreementBtn];
UIButton *selectedBtn = [[UIButton alloc] initWithFrame:CGRectMake(titleLabel.left-30, titleLabel.top, 30, 30)];
[selectedBtn setImage:[UIImage imageNamed:@"login_agreement_nor"] forState:(UIControlStateNormal)];
[selectedBtn setImage:[UIImage imageNamed:@"login_agreement_sel"] forState:(UIControlStateSelected)];
[selectedBtn addTarget:self action:@selector(selectedAction:) forControlEvents:(UIControlEventTouchUpInside)];
[_footerView addSubview:selectedBtn];
}
return _footerView;
}
-(UIView *)tableFooterView{
if (!_tableFooterView) {
_tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 90)];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nobility_desc_icon"]];
imageView.frame = CGRectMake(16, 15, 18, 18);
[_tableFooterView addSubview:imageView];
UILabel *titleLabel =[[ UILabel alloc] initWithFrame:CGRectMake(imageView.right+5, 15, 100, 18)];
titleLabel.textColor = QXConfig.textColor;
titleLabel.text = @"升级说明";
titleLabel.font = [UIFont boldSystemFontOfSize:16];
[_tableFooterView addSubview:titleLabel];
UILabel *bottomLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, imageView.bottom+10, SCREEN_WIDTH-16*2, 42)];
bottomLabel.numberOfLines = 0;
bottomLabel.textColor = QXConfig.textColor;
bottomLabel.font = [UIFont systemFontOfSize:14];
bottomLabel.text = @"如果您当前已有爵位,升级时将自动计算剩余价值抵扣新爵位费用";
[_tableFooterView addSubview:bottomLabel];
}
return _tableFooterView;
}
-(NSMutableArray *)payTypeArray{
if (!_payTypeArray) {
_payTypeArray = [NSMutableArray array];
}
return _payTypeArray;
}
@end

View File

@@ -0,0 +1,16 @@
//
// QXNobilityDetailViewController.h
// QXLive
//
// Created by 启星 on 2025/11/8.
//
#import "QXBaseViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityDetailViewController : QXBaseViewController
@property (nonatomic,strong)NSString *cruuent_nobility_id;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,243 @@
//
// QXNobilityDetailViewController.m
// QXLive
//
// Created by on 2025/11/8.
//
#import "QXNobilityDetailViewController.h"
#import "GKCycleScrollView.h"
#import "QXNobilityDetailTopCell.h"
#import "QXMineNetwork.h"
#import "QXNobilityDetailCell.h"
#import "QXNobilityBuyViewController.h"
@interface QXNobilityDetailViewController ()<GKCycleScrollViewDataSource,GKCycleScrollViewDelegate,UICollectionViewDelegate,UICollectionViewDataSource>
@property (nonatomic,strong)GKCycleScrollView *cycleScrollView;
@property (nonatomic,strong)UIView *headerView;
@property (nonatomic,strong)UIImageView *headerImageView;
@property (nonatomic,strong)UILabel *headerLabel;
@property (nonatomic,strong)UICollectionView *collectionView;
@property (nonatomic,strong)QXNobilityListModel *currentModel;
@property (nonatomic,strong)UIView *bottomView;
@property (nonatomic,strong)UIImageView *bottomImageView;
@property (nonatomic,strong)UILabel *bottomLabel;
@property (nonatomic,strong)UIButton *openBtn;
@property (nonatomic,assign)NSInteger currentIndex;
@end
@implementation QXNobilityDetailViewController
- (void)viewDidLoad {
self.isNoChangeBgImage = YES;
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:RGB16(0xffffff)};
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:RGB16(0x000000)};
}
-(void)setNavgationItems{
[super setNavgationItems];
self.navigationTintColor = RGB16(0xffffff);
self.navigationItem.title = @"爵位详情";
UIButton*createBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
[createBtn setImage:[UIImage imageNamed:@"nobility_help_icon"] forState:(UIControlStateNormal)];
createBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentTrailing;
[createBtn addTarget:self action:@selector(helpAction) forControlEvents:(UIControlEventTouchUpInside)];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:createBtn];
}
-(void)helpAction{
NSString *urlString = [NSString stringWithFormat:@"%@api/Page/page_show?id=%@",ServerUrl,@"29"];
QXBaseWebViewController *vc = [[QXBaseWebViewController alloc] init];
vc.urlStr = urlString;
[self.navigationController pushViewController:vc animated:YES];
}
-(void)getData{
MJWeakSelf
[QXMineNetwork getNobilityListSuccessBlock:^(NSArray<QXNobilityListModel *> * _Nonnull list) {
[weakSelf.dataArray removeAllObjects];
[weakSelf.dataArray addObjectsFromArray:list];
weakSelf.currentModel = weakSelf.dataArray.firstObject;
weakSelf.headerLabel.text = [NSString stringWithFormat:@"专属特权%@",self.currentModel.power.count_str];
[weakSelf setPirce];
for (NSInteger i = 0;i<weakSelf.dataArray.count;i++) {
QXNobilityListModel*md = weakSelf.dataArray[i];
if ([md.lid isEqualToString:weakSelf.cruuent_nobility_id]) {
weakSelf.currentIndex = i;
break;
}
}
weakSelf.cycleScrollView.defaultSelectIndex = weakSelf.currentIndex;
[weakSelf.cycleScrollView reloadData];
[weakSelf.collectionView reloadData];
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(void)initSubViews{
[self updateBgImage:@"nobility_detail_bg"];
[self.view addSubview:self.headerView];
[self.view addSubview:self.cycleScrollView];
[self.view addSubview:self.bottomView];
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
int itemWidth = (SCREEN_WIDTH-16*2-8*2)/3;
layout.itemSize = CGSizeMake(itemWidth, itemWidth);
layout.minimumLineSpacing = 8;
layout.minimumInteritemSpacing = 8;
layout.sectionInset = UIEdgeInsetsMake(0, 16, 0, 16);
layout.scrollDirection = UICollectionViewScrollDirectionVertical;
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, self.headerView.bottom+16, SCREEN_WIDTH, SCREEN_HEIGHT-self.headerView.bottom-16-24-80) collectionViewLayout:layout];
[self.collectionView registerNib:[UINib nibWithNibName:@"QXNobilityDetailCell" bundle:[NSBundle mainBundle]] forCellWithReuseIdentifier:@"QXNobilityDetailCell"];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
self.collectionView.showsHorizontalScrollIndicator = NO;
self.collectionView.bounces = NO;
self.collectionView.pagingEnabled = NO;
self.collectionView.backgroundColor = [UIColor clearColor];
[self.view addSubview:self.collectionView];
}
-(void)setPirce{
NSString *price = [NSString stringWithFormat:@"%@开通:%@/%@天",self.currentModel.name,self.currentModel.pay_price,self.currentModel.day];
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:price];
[attr yy_setColor:RGB16(0xFFDA7E) range:[price rangeOfString:self.currentModel.pay_price]];
self.bottomLabel.attributedText = attr;
}
-(void)openAction{
QXNobilityBuyViewController *vc = [[QXNobilityBuyViewController alloc] init];
vc.nobility_id = self.currentModel.lid;
[self.navigationController pushViewController:vc animated:YES];
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return self.currentModel.power.list.count;
}
-(__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
QXNobilityDetailCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"QXNobilityDetailCell" forIndexPath:indexPath];
cell.model = self.currentModel.power.list[indexPath.row];
return cell;
}
#pragma mark - GKCycleScrollViewDataSource,GKCycleScrollViewDelegate
- (NSInteger)numberOfCellsInCycleScrollView:(GKCycleScrollView *)cycleScrollView {
return self.dataArray.count;
}
- (GKCycleScrollViewCell *)cycleScrollView:(GKCycleScrollView *)cycleScrollView cellForViewAtIndex:(NSInteger)index {
GKCycleScrollViewCell *cell = [cycleScrollView dequeueReusableCell];
if (!cell) {
cell = [QXNobilityDetailTopCell new];
}
QXNobilityDetailTopCell *topcell = (QXNobilityDetailTopCell*)cell;
topcell.index = index;
topcell.myIndex = self.currentIndex;
topcell.model = self.dataArray[index];
return cell;
}
- (CGSize)sizeForCellInCycleScrollView:(GKCycleScrollView *)cycleScrollView {
return CGSizeMake(220, 242);
}
-(void)cycleScrollView:(GKCycleScrollView *)cycleScrollView didScrollCellToIndex:(NSInteger)index{
self.currentModel = self.dataArray[index];
dispatch_async(dispatch_get_main_queue(), ^{
self.headerLabel.text = [NSString stringWithFormat:@"专属特权%@",self.currentModel.power.count_str];
[self setPirce];
[self.collectionView reloadData];
});
}
- (void)cycleScrollView:(GKCycleScrollView *)cycleScrollView didSelectCellAtIndex:(NSInteger)index {
}
-(GKCycleScrollView *)cycleScrollView{
if (!_cycleScrollView) {
_cycleScrollView = [[GKCycleScrollView alloc] initWithFrame:CGRectMake(0, NavContentHeight, SCREEN_WIDTH, 242)];
_cycleScrollView.dataSource = self;
_cycleScrollView.delegate = self;
_cycleScrollView.minimumCellAlpha = 0.0;
_cycleScrollView.leftRightMargin = 16.0f;
_cycleScrollView.topBottomMargin = 15.0f;
_cycleScrollView.isInfiniteLoop = NO;
_cycleScrollView.isAutoScroll = NO;
}
return _cycleScrollView;
}
-(UIView *)headerView{
if (!_headerView) {
_headerView = [[UIView alloc] initWithFrame:CGRectMake(0,self.cycleScrollView.bottom+16, SCREEN_WIDTH, ScaleWidth(35))];
[_headerView addSubview:self.headerImageView];;
[_headerView addSubview:self.headerLabel];;
}
return _headerView;
}
-(UIImageView *)headerImageView{
if (!_headerImageView) {
_headerImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nobility_power_header_bg"]];
_headerImageView.contentMode = UIViewContentModeScaleToFill;
_headerImageView.frame = CGRectMake(0, 0, SCREEN_WIDTH, ScaleWidth(35));
}
return _headerImageView;
}
-(UILabel *)headerLabel{
if (!_headerLabel) {
_headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, ScaleWidth(35))];
_headerLabel.textColor = RGB16(0xFFEDBD);
_headerLabel.font = [UIFont systemFontOfSize:16];
_headerLabel.textAlignment = NSTextAlignmentCenter;
}
return _headerLabel;
}
-(UIView *)bottomView{
if (!_bottomView) {
_bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT-24-80, SCREEN_WIDTH, 80+24)];
[_bottomView addRoundedCornersWithRadius:16 byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight)];
[_bottomView addSubview:self.bottomImageView];
[_bottomView addSubview:self.openBtn];
[_bottomView addSubview:self.bottomLabel];
}
return _bottomView;
}
-(UIImageView *)bottomImageView{
if (!_bottomImageView) {
_bottomImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nobility_detail_bottom_bg"]];
_bottomImageView.frame = CGRectMake(0, 0, self.bottomView.width, self.bottomView.height);
}
return _bottomImageView;
}
-(UIButton *)openBtn{
if (!_openBtn) {
_openBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-16-128, 19, 128, 41)];
[_openBtn setBackgroundImage:[UIImage imageNamed:@"nobility_detail_open_btn"] forState:(UIControlStateNormal)];
[_openBtn addTarget:self action:@selector(openAction) forControlEvents:(UIControlEventTouchUpInside)];;
}
return _openBtn;
}
-(UILabel *)bottomLabel{
if (!_bottomLabel) {
_bottomLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, 28, self.openBtn.left-16, 24)];
_bottomLabel.textColor = RGB16(0xF7EAC9);
_bottomLabel.font = [UIFont systemFontOfSize:16];
}
return _bottomLabel;
}
@end

View File

@@ -0,0 +1,16 @@
//
// QXNobilityViewController.h
// QXLive
//
// Created by 启星 on 2025/11/7.
//
#import "QXBaseViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityViewController : QXBaseViewController
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,176 @@
//
// QXNobilityViewController.m
// QXLive
//
// Created by on 2025/11/7.
//
#import "QXNobilityViewController.h"
#import "QXNobilityHeaderView.h"
#import "QXNobilityContentView.h"
#import "QXMineNetwork.h"
#import "QXSeatHeaderView.h"
#import "QXNobilityDetailViewController.h"
#import "QXNobilityBuyViewController.h"
@interface QXNobilityViewController ()<QXNobilityHeaderViewDelegate>
@property (nonatomic,strong)QXNobilityHeaderView *topView;
@property (nonatomic,strong)UIView *nobilityBgView;
@property (nonatomic,strong)UIView *nobilityContentView;
@property (nonatomic,strong)UILabel *nobilityTitleLabel;
//@property (nonatomic,strong)JXCategoryTitleView *categoryView;
//@property (nonatomic,strong)JXCategoryListContainerView *containerView;
@property (nonatomic,strong)UIView *bottomView;
@property (nonatomic,strong)QXSeatHeaderView *userAvatarView;
@property (nonatomic,strong)UILabel *bottomNickNameLabel;
@property (nonatomic,strong)UIButton *bottomBuyBtn;
@property (nonatomic,strong)NSMutableArray *titles;
@property (nonatomic,strong)QXNobilityContentView *contentView;;
@property (nonatomic,strong)QXNobilityModel* model;
@end
@implementation QXNobilityViewController
- (void)viewDidLoad {
self.isNoChangeBgImage = YES;
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:RGB16(0xffffff)};
}
-(void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:RGB16(0x000000)};
}
-(void)setNavgationItems{
[super setNavgationItems];
self.navigationTintColor = RGB16(0xffffff);
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nobility_nav_icon"]];
imageView.frame = CGRectMake(0, 0, 71, 18);
self.navigationItem.titleView = imageView;
UIButton*createBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
[createBtn setImage:[UIImage imageNamed:@"nobility_help_icon"] forState:(UIControlStateNormal)];
createBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentTrailing;
[createBtn addTarget:self action:@selector(helpAction) forControlEvents:(UIControlEventTouchUpInside)];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:createBtn];
}
- (void)initSubViews{
[self updateBgImage:@"home_rank_vc_bg"];
self.topView = [[QXNobilityHeaderView alloc] initWithFrame:CGRectMake(0, NavContentHeight, SCREEN_WIDTH,0)];
self.topView.delegate = self;
[self.view addSubview:self.topView];
self.nobilityBgView = [[UIView alloc] initWithFrame:CGRectMake(16, self.topView.bottom, SCREEN_WIDTH-32, SCREEN_HEIGHT-self.topView.bottom-80)];
self.nobilityBgView.backgroundColor = RGB16(0x1E2127);
self.nobilityBgView.layer.borderWidth = 1;
self.nobilityBgView.layer.borderColor = RGB16A(0xF5E9D1, 0.2).CGColor;
[self.nobilityBgView addRoundedCornersWithRadius:12];
[self.view addSubview:self.nobilityBgView];
self.nobilityContentView = [[UIView alloc] initWithFrame:CGRectMake(12, 12, self.nobilityBgView.width-24, self.nobilityBgView.height-24)];
[self.nobilityContentView addRoundedCornersWithRadius:6];
[self.nobilityBgView addSubview:self.nobilityContentView];
[self.view addSubview:self.bottomView];
self.contentView = [[QXNobilityContentView alloc] initWithFrame:self.nobilityContentView.bounds];
[self.nobilityContentView addSubview:self.contentView];
}
-(void)getData{
MJWeakSelf
[QXMineNetwork getUserNobilitSuccessBlock:^(QXNobilityModel * _Nonnull model) {
weakSelf.model = model;
weakSelf.topView.model = model;
weakSelf.contentView.model = model;
[weakSelf.contentView reloadData];
if (weakSelf.model.nobility_info.status.intValue == 0) {
weakSelf.bottomView.hidden = YES;;
}else{
[weakSelf.userAvatarView setHeadIcon:model.user_info.avatar dress:@""];
weakSelf.bottomNickNameLabel.text = [NSString stringWithFormat:@"%@的当前爵位状态是%@",model.user_info.nickname,model.nobility_info.name];
weakSelf.bottomView.hidden = NO;;
}
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(void)helpAction{
NSString *urlString = [NSString stringWithFormat:@"%@api/Page/page_show?id=%@",ServerUrl,@"29"];
QXBaseWebViewController *vc = [[QXBaseWebViewController alloc] init];
vc.urlStr = urlString;
[self.navigationController pushViewController:vc animated:YES];
}
-(void)buyAction{
QXNobilityDetailViewController *vc = [[QXNobilityDetailViewController alloc] init];
vc.cruuent_nobility_id = self.model.nobility_info.lid;
[self.navigationController pushViewController:vc animated:YES];
}
///
-(void)didOpenNobility{
QXNobilityDetailViewController *vc = [[QXNobilityDetailViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
}
///
-(void)didRenewNobility{
QXNobilityBuyViewController *vc = [[QXNobilityBuyViewController alloc] init];
vc.nobility_id = self.model.nobility_info.lid;
[self.navigationController pushViewController:vc animated:YES];
}
-(NSMutableArray *)titles{
if (!_titles) {
_titles = [NSMutableArray array];
}
return _titles;
}
-(UIView *)bottomView{
if (!_bottomView) {
_bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, SCREEN_HEIGHT-57, SCREEN_WIDTH, 57)];
[_bottomView addRoundedCornersWithRadius:20 byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight)];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nobility_my_info_bg"]];
imageView.frame = _bottomView.bounds;
[_bottomView addSubview:imageView];
[_bottomView addSubview:self.userAvatarView];
[_bottomView addSubview:self.bottomNickNameLabel];
[_bottomView addSubview:self.bottomBuyBtn];
}
return _bottomView;
}
-(QXSeatHeaderView *)userAvatarView{
if (!_userAvatarView) {
_userAvatarView = [[QXSeatHeaderView alloc] initWithFrame:CGRectMake(12, 12, 30, 30)];
// [_userAvatarView setHeadIcon:QXGlobal.shareGlobal.loginModel.avatar dress:@""];
}
return _userAvatarView;
}
-(UIButton *)bottomBuyBtn{
if (!_bottomBuyBtn) {
_bottomBuyBtn = [[UIButton alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-14-118, (57-36)/2, 118, 36)];
[_bottomBuyBtn setBackgroundImage:[UIImage imageNamed:@"nobility_update_btn"] forState:(UIControlStateNormal)];
[_bottomBuyBtn addTarget:self action:@selector(buyAction) forControlEvents:(UIControlEventTouchUpInside)];
}
return _bottomBuyBtn;
}
-(UILabel *)bottomNickNameLabel{
if (!_bottomNickNameLabel) {
_bottomNickNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.userAvatarView.right+6, 0, self.bottomBuyBtn.left-self.userAvatarView.right-20, 57)];
// _bottomNickNameLabel.text = QXGlobal.shareGlobal.loginModel.nickname;
_bottomNickNameLabel.textColor = RGB16(0xF5E9D1);
_bottomNickNameLabel.font = [UIFont systemFontOfSize:12];
}
return _bottomNickNameLabel;
}
@end

View File

@@ -21,6 +21,7 @@
@implementation QXGiftWallViewController @implementation QXGiftWallViewController
- (void)viewDidLoad { - (void)viewDidLoad {
self.isNoChangeBgImage = YES;
[super viewDidLoad]; [super viewDidLoad];
// Do any additional setup after loading the view. // Do any additional setup after loading the view.
} }

View File

@@ -11,6 +11,7 @@ NS_ASSUME_NONNULL_BEGIN
@interface QXSettingViewController : QXBaseViewController @interface QXSettingViewController : QXBaseViewController
@property (nonatomic,copy)void(^logOutBlock)(BOOL isCancel); @property (nonatomic,copy)void(^logOutBlock)(BOOL isCancel);
@property (nonatomic,assign)BOOL haveNobility;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -36,15 +36,27 @@ static NSInteger maxClickCount = 6;
self.navigationItem.title = QXText(@"设置"); self.navigationItem.title = QXText(@"设置");
} }
-(void)initSubViews{ -(void)initSubViews{
NSArray *section1 = @[ NSArray *section1;
// QXText(@"消息通知"), if (self.haveNobility) {
// QXText(@"未成年人模式"), section1 = @[
QXText(@"黑名单"), QXText(@"隐身进入房间"),
QXText(@"设置密码"), QXText(@"黑名单"),
QXText(@"手机绑定"), QXText(@"设置密码"),
QXText(@"关于我们"), QXText(@"手机绑定"),
QXText(@"版本号") QXText(@"关于我们"),
]; QXText(@"版本号")
];
}else{
section1 = @[
// QXText(@"消息通知"),
QXText(@"黑名单"),
QXText(@"设置密码"),
QXText(@"手机绑定"),
QXText(@"关于我们"),
QXText(@"版本号")
];
}
NSArray *section2 = @[ NSArray *section2 = @[
QXText(@"切换账号"), QXText(@"切换账号"),
@@ -62,7 +74,8 @@ static NSInteger maxClickCount = 6;
QXText(@"切换账号"):[NSNumber numberWithInteger:QXSettingCellTypeOnlyArrow], QXText(@"切换账号"):[NSNumber numberWithInteger:QXSettingCellTypeOnlyArrow],
QXText(@"实名认证"):[NSNumber numberWithInteger:QXSettingCellTypeNormal], QXText(@"实名认证"):[NSNumber numberWithInteger:QXSettingCellTypeNormal],
QXText(@"账号注销"):[NSNumber numberWithInteger:QXSettingCellTypeOnlyArrow], QXText(@"账号注销"):[NSNumber numberWithInteger:QXSettingCellTypeOnlyArrow],
QXText(@"退出登录"):[NSNumber numberWithInteger:QXSettingCellTypeOnlyArrow] QXText(@"退出登录"):[NSNumber numberWithInteger:QXSettingCellTypeOnlyArrow],
QXText(@"隐身进入房间"):[NSNumber numberWithInteger:QXSettingCellTypeSwitch]
}; };
self.controllerDict = @{ self.controllerDict = @{
@@ -89,7 +102,8 @@ static NSInteger maxClickCount = 6;
QXText(@"切换账号"):@"", QXText(@"切换账号"):@"",
QXText(@"实名认证"):@"", QXText(@"实名认证"):@"",
QXText(@"账号注销"):@"", QXText(@"账号注销"):@"",
QXText(@"退出登录"):@"" QXText(@"退出登录"):@"",
QXText(@"隐身进入房间"):QXGlobal.shareGlobal.loginModel.hide_status
}; };
[self.dataArray addObject:section1]; [self.dataArray addObject:section1];
[self.dataArray addObject:section2]; [self.dataArray addObject:section2];
@@ -111,10 +125,27 @@ static NSInteger maxClickCount = 6;
NSString *value = self.valueDict[text]; NSString *value = self.valueDict[text];
cell.titleLabel.text = text; cell.titleLabel.text = text;
cell.detailLabel.text = value; cell.detailLabel.text = value;
cell.btnSwitch.selected = value.intValue==1;
[cell.btnSwitch addTarget:self action:@selector(setHideJoinRoom:) forControlEvents:(UIControlEventTouchUpInside)];
cell.cellType = [self.cellTypeDict[text] integerValue]; cell.cellType = [self.cellTypeDict[text] integerValue];
cell.needLine = (indexPath.row>=0) && (indexPath.row < arr.count-1); cell.needLine = (indexPath.row>=0) && (indexPath.row < arr.count-1);
return cell; return cell;
} }
-(void)setHideJoinRoom:(UIButton *)sender{
sender.selected = !sender.selected;
__block NSString *status = QXGlobal.shareGlobal.loginModel.hide_status;
if ([status isEqualToString:@"0"]) {
status = @"1";
}else{
status = @"0";
}
[QXMineNetwork getNobilityPriceWithHideStatus:status successBlock:^(NSDictionary * _Nonnull dict) {
QXGlobal.shareGlobal.loginModel.hide_status = status;
} failBlock:^(NSError * _Nonnull error, NSString * _Nonnull msg) {
}];
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
return [UIView new]; return [UIView new];
} }

View File

@@ -30,6 +30,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *activities_id; @property (nonatomic,strong)NSString *activities_id;
/// 活动类型 10 天空之境 11 岁月之城 12时空之巅 /// 活动类型 10 天空之境 11 岁月之城 12时空之巅
@property (nonatomic,strong)NSString *gift_bag; @property (nonatomic,strong)NSString *gift_bag;
/// 是否为爵位礼物 0 打开 1 锁住
@property (nonatomic,strong)NSString *is_lock;
@property (nonatomic,assign)BOOL isSelected; @property (nonatomic,assign)BOOL isSelected;
@end @end

View File

@@ -115,6 +115,13 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *is_host; @property (nonatomic,strong)NSString *is_host;
/// 是否是管理 1是管理员 0不是 /// 是否是管理 1是管理员 0不是
@property (nonatomic,strong)NSString *is_management; @property (nonatomic,strong)NSString *is_management;
/// 麦圈
@property (nonatomic,strong)NSString *mic_cycle;
/// 爵位图片
@property (nonatomic,strong)NSString *nobility_image;
/// 用户昵称颜色
@property (nonatomic,strong)NSString *nickname_color;
@property (nonatomic,assign)BOOL isSelected; @property (nonatomic,assign)BOOL isSelected;
@end @end
@@ -154,6 +161,9 @@ NS_ASSUME_NONNULL_BEGIN
/// 装扮 /// 装扮
@property (nonatomic,strong)NSString *dress; @property (nonatomic,strong)NSString *dress;
/// 麦圈
@property (nonatomic,strong)NSString *mic_cycle;
@end @end
@interface QXRoomOnlineList : NSObject @interface QXRoomOnlineList : NSObject
@@ -268,6 +278,12 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *base_image; @property (nonatomic,strong)NSString *base_image;
/// 礼物价值 /// 礼物价值
@property (nonatomic,strong)NSString *gift_price; @property (nonatomic,strong)NSString *gift_price;
/// 礼物名称
@property (nonatomic,strong)NSString *nobility_image;
/// 礼物图标
@property (nonatomic,strong)NSString *nickname_color;
/// 礼物价值
@property (nonatomic,strong)NSString *mic_cycle;
/// 关系拍卖时间 /// 关系拍卖时间
@property (nonatomic,strong)NSString *time_day; @property (nonatomic,strong)NSString *time_day;
/// 头像装扮 /// 头像装扮

View File

@@ -36,6 +36,13 @@ NS_ASSUME_NONNULL_BEGIN
@property(nonatomic, copy)NSString *dress; @property(nonatomic, copy)NSString *dress;
/// 用户魅力 /// 用户魅力
@property(nonatomic, copy)NSString *charm; @property(nonatomic, copy)NSString *charm;
/// 歌曲名称
@property(nonatomic, copy)NSString *nobility_image;
/// 演唱者
@property(nonatomic, copy)NSString *mic_cycle;
/// 歌曲封面
@property(nonatomic, copy)NSString *nickname_color;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -39,6 +39,14 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *auth; @property (nonatomic,strong)NSString *auth;
/// 是否使用靓号 0未使用 1 已使用 /// 是否使用靓号 0未使用 1 已使用
@property (nonatomic,strong)NSString *is_use_code; @property (nonatomic,strong)NSString *is_use_code;
/// 爵位图片
@property (nonatomic,strong)NSString *nobility_image;
/// 昵称颜色
@property (nonatomic,strong)NSString *nickname_color;
/// 是否可以设置隐身进入的状态0-不行1-可以
@property (nonatomic,strong)NSString *is_hide;
/// 当前状态0-取消隐身1-隐身进入
@property (nonatomic,strong)NSString *hide_status;
/// 在线状态 /// 在线状态
@property (nonatomic,assign)BOOL is_online; @property (nonatomic,assign)BOOL is_online;
/// 1 能聊天 0不能聊天 /// 1 能聊天 0不能聊天
@@ -68,6 +76,10 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *dress; @property (nonatomic,strong)NSString *dress;
/// 聊天气泡 /// 聊天气泡
@property (nonatomic,strong)NSString *chat_bubble; @property (nonatomic,strong)NSString *chat_bubble;
/// 爵位飘屏背景图
@property (nonatomic,strong)NSString *enter_image;
/// 爵位飘屏背景图
@property (nonatomic,strong)NSString *enter_text;
/// ip /// ip
@property (nonatomic,strong)NSString *loginip; @property (nonatomic,strong)NSString *loginip;
/// 昵称 /// 昵称
@@ -82,6 +94,12 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSString *room_id; @property (nonatomic,strong)NSString *room_id;
/// 各种等级 爵位 。。。图片数组 /// 各种等级 爵位 。。。图片数组
@property (nonatomic,strong)NSArray *icon; @property (nonatomic,strong)NSArray *icon;
/// 爵位图片
@property (nonatomic,strong)NSString *nobility_image;
/// 昵称颜色
@property (nonatomic,strong)NSString *nickname_color;
/// 麦圈
@property (nonatomic,strong)NSString *mic_cycle;
/// 是否关注 0 未关注 1 已关注 /// 是否关注 0 未关注 1 已关注
@property (nonatomic,assign)NSInteger is_follow; @property (nonatomic,assign)NSInteger is_follow;
@@ -181,6 +199,10 @@ NS_ASSUME_NONNULL_BEGIN
@property (nonatomic,strong)NSArray *icon; @property (nonatomic,strong)NSArray *icon;
/// 麦位 /// 麦位
@property (nonatomic,strong)NSString *pit_number; @property (nonatomic,strong)NSString *pit_number;
/// 爵位图片
@property (nonatomic,strong)NSString *nobility_image;
/// 爵位图片
@property (nonatomic,strong)NSString *nickname_color;
/// 是否拥有转币权限 0 未开启 1 已开启 /// 是否拥有转币权限 0 未开启 1 已开启
@property (nonatomic,strong)NSString *red_status; @property (nonatomic,strong)NSString *red_status;
/// 角色 1-房主 > 2-管理员 > 3主持人 >4 普通用户 排序 /// 角色 1-房主 > 2-管理员 > 3主持人 >4 普通用户 排序

View File

@@ -0,0 +1,27 @@
//
// QXNobilityGetPriceModel.h
// QXLive
//
// Created by 启星 on 2025/11/8.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class QXNobilityGetPricePowerList;
@interface QXNobilityGetPriceModel : NSObject
@property (nonatomic,strong)NSString *lid;
@property (nonatomic,strong)NSString *nobility_name;
@property (nonatomic,strong)NSString *nobility_image;
@property (nonatomic,strong)NSString *price;
@property (nonatomic,strong)NSString *pay_price;
@property (nonatomic,strong)NSString *day;
@property (nonatomic,strong)NSArray<QXNobilityGetPricePowerList*> *power_list;
@end
@interface QXNobilityGetPricePowerList : NSObject
@property (nonatomic,strong)NSString *id;
@property (nonatomic,strong)NSString *content;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,23 @@
//
// QXNobilityGetPriceModel.m
// QXLive
//
// Created by on 2025/11/8.
//
#import "QXNobilityGetPriceModel.h"
@implementation QXNobilityGetPriceModel
+(NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{
return @{
@"power_list" : @"QXNobilityGetPricePowerList",
};
}
@end
@implementation QXNobilityGetPricePowerList
@end

View File

@@ -0,0 +1,37 @@
//
// QXNobilityListModel.h
// QXLive
//
// Created by 启星 on 2025/11/8.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class QXNobilityPower,QXNobilityPowerList;
@interface QXNobilityListModel : NSObject
@property (nonatomic,strong)NSString *name;
@property (nonatomic,strong)NSString *image;
@property (nonatomic,strong)NSString *pay_price;
@property (nonatomic,strong)NSString *lid;
@property (nonatomic,strong)NSString *day;
@property (nonatomic,strong)QXNobilityPower *power;
@end
@interface QXNobilityPower : NSObject
@property (nonatomic,strong)NSString *power_count;
@property (nonatomic,strong)NSString *this_power_count;
@property (nonatomic,strong)NSString *count_str;
@property (nonatomic,strong)NSArray<QXNobilityPowerList*>*list;
@end
@interface QXNobilityPowerList :NSObject
@property (nonatomic,strong)NSString *id;
@property (nonatomic,strong)NSString *name;
@property (nonatomic,strong)NSString *content;
@property (nonatomic,strong)NSString *image;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,32 @@
//
// QXNobilityListModel.m
// QXLive
//
// Created by on 2025/11/8.
//
#import "QXNobilityListModel.h"
@implementation QXNobilityListModel
+(NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{
return @{
@"power" : @"QXNobilityPower",
};
}
@end
@implementation QXNobilityPower
+(NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{
return @{
@"list" : @"QXNobilityPowerList",
};
}
@end
@implementation QXNobilityPowerList
@end

View File

@@ -0,0 +1,61 @@
//
// QXNobilityModel.h
// QXLive
//
// Created by 启星 on 2025/11/7.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class QXUserNobility,QXNobilityLevel,QXNobilityInfo;
@interface QXNobilityModel : NSObject
/// 爵位信息
@property (nonatomic,strong)QXUserModel *user_info;
@property (nonatomic,strong)QXUserNobility *nobility_info;
@property (nonatomic,strong)NSArray<QXNobilityLevel *>* nobility_power_list;
@end
@interface QXUserNobility : NSObject
///状态: 0去开通 1去续费
@property (nonatomic,strong)NSString *status;
///权限ID
@property (nonatomic,strong)NSString *lid;
///爵位ID
@property (nonatomic,strong)NSString *id;
/// 爵位名称
@property (nonatomic,strong)NSString *name;
///爵位图片
@property (nonatomic,strong)NSString *image;
///结束时间
@property (nonatomic,strong)NSString *end_time;
///显示类型 1状态 2文字
@property (nonatomic,strong)NSString *type;
///昵称颜色名称
@property (nonatomic,strong)NSString *nick_name_color_name;
///昵称颜色
@property (nonatomic,strong)NSString *nick_name_color;
@end
@interface QXNobilityLevel : NSObject
///爵位ID
@property (nonatomic,strong)NSString *lid;
///爵位名称
@property (nonatomic,strong)NSString *name;
///权限ID
@property (nonatomic,strong)NSString *power_ids;
///昵称颜色
@property (nonatomic,strong)NSString *nick_name_color;
///昵称颜色名称
@property (nonatomic,strong)NSString *nick_name_color_name;
///爵位名称
@property (nonatomic,strong)NSArray<QXUserNobility*> *nobility_list;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,38 @@
//
// QXNobilityModel.m
// QXLive
//
// Created by on 2025/11/7.
//
#import "QXNobilityModel.h"
@implementation QXNobilityModel
+(NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{
return @{
@"user_info" : @"QXUserModel",
@"nobility_info" : @"QXUserNobility",
@"nobility_power_list": @"QXNobilityLevel",
};
}
@end
@implementation QXUserNobility
@end
@implementation QXNobilityLevel
+(NSDictionary<NSString *,id> *)modelContainerPropertyGenericClass{
return @{
@"nobility_list" : @"QXUserNobility",
};
}
@end

View File

@@ -25,6 +25,9 @@
#import "QXRoomHourRankModel.h" #import "QXRoomHourRankModel.h"
#import "QXRedPacketModel.h" #import "QXRedPacketModel.h"
#import "QXEmojiTypeModel.h" #import "QXEmojiTypeModel.h"
#import "QXNobilityModel.h"
#import "QXNobilityListModel.h"
#import "QXNobilityGetPriceModel.h"
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@@ -846,6 +849,7 @@ NS_ASSUME_NONNULL_BEGIN
type:(NSString*)type type:(NSString*)type
userId:(NSString*)userId userId:(NSString*)userId
typeId:(NSString*)typeId typeId:(NSString*)typeId
nobility_id:(NSString*)nobility_id
successBlock:(void (^)(NSDictionary* dict))successBlock successBlock:(void (^)(NSDictionary* dict))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock; failBlock:(void (^)(NSError * error, NSString * msg))failBlock;
@@ -1155,6 +1159,33 @@ NS_ASSUME_NONNULL_BEGIN
successBlock:(void (^)(NSArray <QXEmojiModel*>* list))successBlock successBlock:(void (^)(NSArray <QXEmojiModel*>* list))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock; failBlock:(void (^)(NSError * error, NSString * msg))failBlock;
/**
获取爵位
*/
+(void)getUserNobilitSuccessBlock:(void (^)(QXNobilityModel* model))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock;
/**
获取爵位列表
*/
+(void)getNobilityListSuccessBlock:(void (^)(NSArray<QXNobilityListModel*>* list))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock;
/**
购买爵位
*/
+(void)getNobilityPriceWithId:(NSString*)Id
successBlock:(void (^)(QXNobilityGetPriceModel* model))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock;
/**
开启隐身
*/
+(void)getNobilityPriceWithHideStatus:(NSString*)hide_status
successBlock:(void (^)(NSDictionary* dict))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock;
@end @end

View File

@@ -18,6 +18,10 @@
[QXGlobal shareGlobal].loginModel.dress = userModel.dress; [QXGlobal shareGlobal].loginModel.dress = userModel.dress;
[QXGlobal shareGlobal].loginModel.auth = userModel.auth.intValue; [QXGlobal shareGlobal].loginModel.auth = userModel.auth.intValue;
[QXGlobal shareGlobal].loginModel.chat_bubble = userModel.chat_bubble; [QXGlobal shareGlobal].loginModel.chat_bubble = userModel.chat_bubble;
[QXGlobal shareGlobal].loginModel.nobility_image = userModel.nobility_image;
[QXGlobal shareGlobal].loginModel.nickname_color = userModel.nickname_color;
[QXGlobal shareGlobal].loginModel.is_hide = userModel.is_hide;
[QXGlobal shareGlobal].loginModel.hide_status = userModel.hide_status;
[[QXGlobal shareGlobal] updateUserInfoWithMolde:[QXGlobal shareGlobal].loginModel]; [[QXGlobal shareGlobal] updateUserInfoWithMolde:[QXGlobal shareGlobal].loginModel];
BOOL api_version = [responseObject[@"api_version"] boolValue]; BOOL api_version = [responseObject[@"api_version"] boolValue];
[QXGlobal shareGlobal].isAppStore = api_version; [QXGlobal shareGlobal].isAppStore = api_version;
@@ -1630,13 +1634,20 @@
}]; }];
} }
+(void)rechargePayWithMoney:(NSString *)money coin:(NSString *)coin type:(NSString *)type userId:(NSString*)userId typeId:(NSString*)typeId successBlock:(void (^)(NSDictionary * _Nonnull))successBlock failBlock:(void (^)(NSError * _Nonnull, NSString * _Nonnull))failBlock{ +(void)rechargePayWithMoney:(NSString *)money
coin:(NSString *)coin
type:(NSString *)type
userId:(NSString*)userId
typeId:(NSString*)typeId
nobility_id:(NSString*)nobility_id
successBlock:(void (^)(NSDictionary * _Nonnull))successBlock failBlock:(void (^)(NSError * _Nonnull, NSString * _Nonnull))failBlock{
NSDictionary *parameters =@{ NSDictionary *parameters =@{
@"coin":coin?coin:@"", @"coin":coin?coin:@"",
@"money":money?money:@"", @"money":money?money:@"",
@"type":type?type:@"", @"type":type?type:@"",
@"user_id":userId?userId:@"", @"user_id":userId?userId:@"",
@"type_id":typeId?typeId:@"" @"type_id":typeId?typeId:@"",
@"nobility_id":nobility_id?:@""
}; };
[[QXRequset shareInstance] postWithUrl:QXRechargePay parameters:parameters needCache:NO success:^(id responseObject) { [[QXRequset shareInstance] postWithUrl:QXRechargePay parameters:parameters needCache:NO success:^(id responseObject) {
if (successBlock) { if (successBlock) {
@@ -2250,4 +2261,57 @@
failBlock(error,msg); failBlock(error,msg);
}]; }];
} }
+(void)getUserNobilitSuccessBlock:(void (^)(QXNobilityModel* model))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock{
[[QXRequset shareInstance] getWithUrl:QXGetUserNobility parameters:@{} needCache:NO success:^(id responseObject) {
if (successBlock) {
QXNobilityModel*model = [QXNobilityModel yy_modelWithJSON:responseObject[@"data"]];
successBlock(model);
}
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
failBlock(error,msg);
}];
}
+(void)getNobilityListSuccessBlock:(void (^)(NSArray<QXNobilityListModel*>* list))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock{
[[QXRequset shareInstance] getWithUrl:QXGetNobilityList parameters:@{} needCache:NO success:^(id responseObject) {
if (successBlock) {
NSArray *list = [NSArray yy_modelArrayWithClass:[QXNobilityListModel class] json:responseObject[@"data"]];
successBlock(list);
}
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
failBlock(error,msg);
}];
}
+(void)getNobilityPriceWithId:(NSString*)Id
successBlock:(void (^)(QXNobilityGetPriceModel* model))successBlock
failBlock:(void (^)(NSError * error, NSString * msg))failBlock{
[[QXRequset shareInstance] getWithUrl:QXNobilityBuy parameters:@{@"id":Id?:@""} needCache:NO success:^(id responseObject) {
if (successBlock) {
QXNobilityGetPriceModel *model = [QXNobilityGetPriceModel yy_modelWithJSON:responseObject[@"data"]];
successBlock(model);
}
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
failBlock(error,msg);
}];
}
+(void)getNobilityPriceWithHideStatus:(NSString *)hide_status successBlock:(void (^)(NSDictionary * _Nonnull))successBlock failBlock:(void (^)(NSError * _Nonnull, NSString * _Nonnull))failBlock{
NSDictionary *parameters =@{
@"hide_status":hide_status?hide_status:@"",
};
[[QXRequset shareInstance] postWithUrl:QXNobilityHideJoinRoom parameters:parameters needCache:NO success:^(id responseObject) {
if (successBlock) {
successBlock(responseObject[@"data"]);
}
} fail:^(NSError *error, NSString *msg, NSURLSessionDataTask *task) {
failBlock(error,msg);
}];
}
@end @end

View File

@@ -55,6 +55,7 @@ typedef NS_ENUM(NSInteger) {
@interface QXMainHeaderView : UIView @interface QXMainHeaderView : UIView
@property (nonatomic,weak)id<QXMainHeaderViewDelegate>delegate; @property (nonatomic,weak)id<QXMainHeaderViewDelegate>delegate;
@property (nonatomic,strong)QXUserModel *userModel; @property (nonatomic,strong)QXUserModel *userModel;
@property (nonatomic,strong)NSArray *bannerArray;
@property (nonatomic,strong)NSString *earnings; @property (nonatomic,strong)NSString *earnings;
@property (nonatomic,strong)NSString *coin; @property (nonatomic,strong)NSString *coin;
-(void)reloadData; -(void)reloadData;

View File

@@ -10,7 +10,9 @@
#import "CKShimmerLabel.h" #import "CKShimmerLabel.h"
#import "QXMineHomeToolsCell.h" #import "QXMineHomeToolsCell.h"
#import "QXServiceModel.h" #import "QXServiceModel.h"
#import "QXBanner.h"
#import <SDCycleScrollView/SDCycleScrollView.h> #import <SDCycleScrollView/SDCycleScrollView.h>
#import "QXUserHomePageViewController.h"
@interface QXMainHeaderView()<UICollectionViewDelegate,UICollectionViewDataSource,SDCycleScrollViewDelegate> @interface QXMainHeaderView()<UICollectionViewDelegate,UICollectionViewDataSource,SDCycleScrollViewDelegate>
@property (nonatomic, strong) QXSeatHeaderView *userHeaderView; @property (nonatomic, strong) QXSeatHeaderView *userHeaderView;
@@ -57,6 +59,7 @@
@property (nonatomic, strong)UIImageView *giftWallBgImageView; @property (nonatomic, strong)UIImageView *giftWallBgImageView;
@property (nonatomic, strong)UILabel *giftWallTitleLabel; @property (nonatomic, strong)UILabel *giftWallTitleLabel;
@property (nonatomic, strong)UIButton *giftWallBtn; @property (nonatomic, strong)UIButton *giftWallBtn;
@property (nonatomic, strong)NSMutableArray *bannerImages;
@end @end
@implementation QXMainHeaderView @implementation QXMainHeaderView
@@ -70,7 +73,7 @@
} }
-(void)initSubviews{ -(void)initSubviews{
MJWeakSelf MJWeakSelf
self.userHeaderView = [[QXSeatHeaderView alloc] initWithFrame:CGRectMake(16, 18, 76, 76)]; self.userHeaderView = [[QXSeatHeaderView alloc] initWithFrame:CGRectMake(16, 18, 76, 91)];
[self.userHeaderView addTapBlock:^(id _Nonnull obj) { [self.userHeaderView addTapBlock:^(id _Nonnull obj) {
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didClickOptionType:)]) { if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didClickOptionType:)]) {
[weakSelf.delegate didClickOptionType:QXMainHeaderOptionTypeGotoHome]; [weakSelf.delegate didClickOptionType:QXMainHeaderOptionTypeGotoHome];
@@ -78,12 +81,7 @@
}]; }];
[self addSubview:self.userHeaderView]; [self addSubview:self.userHeaderView];
self.sexImageView = [[UIImageView alloc] init];
[self addSubview:self.sexImageView];
[self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.bottom.equalTo(self.userHeaderView);
make.height.width.mas_equalTo(16);
}];
// self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.userHeaderView.right+6, self.userHeaderView.top, self.width-self.userHeaderView.right-16-6, 23)]; // self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.userHeaderView.right+6, self.userHeaderView.top, self.width-self.userHeaderView.right-16-6, 23)];
self.nameLabel = [[CKShimmerLabel alloc] initWithFrame:CGRectMake(self.userHeaderView.right+6, self.userHeaderView.top+5, self.width-self.userHeaderView.right-16-6, 22)]; self.nameLabel = [[CKShimmerLabel alloc] initWithFrame:CGRectMake(self.userHeaderView.right+6, self.userHeaderView.top+5, self.width-self.userHeaderView.right-16-6, 22)];
@@ -96,7 +94,14 @@
// [self.nameLabel startShimmer]; // [self.nameLabel startShimmer];
[self addSubview:self.nameLabel]; [self addSubview:self.nameLabel];
self.idLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.userHeaderView.right+6, self.nameLabel.bottom+6, 80, 17)]; self.sexImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.userHeaderView.right+6, self.nameLabel.bottom+4, 17, 17)];
[self addSubview:self.sexImageView];
// [self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) {
// make.right.bottom.equalTo(self.userHeaderView);
// make.height.width.mas_equalTo(16);
// }];
self.idLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.sexImageView.right+6, self.nameLabel.bottom+6, 80, 17)];
self.idLabel.textColor = RGB16(0x666666); self.idLabel.textColor = RGB16(0x666666);
self.idLabel.font = [UIFont systemFontOfSize:12]; self.idLabel.font = [UIFont systemFontOfSize:12];
self.idLabel.text = @"ID:"; self.idLabel.text = @"ID:";
@@ -142,7 +147,7 @@
]; ];
CGFloat width = (SCREEN_WIDTH-60)/3; CGFloat width = (SCREEN_WIDTH-60)/3;
for (int i = 0; i < nameArr.count; i ++) { for (int i = 0; i < nameArr.count; i ++) {
UILabel *countLabel = [[UILabel alloc] initWithFrame:CGRectMake(30+width*i, self.userHeaderView.bottom+25, width, 25)]; UILabel *countLabel = [[UILabel alloc] initWithFrame:CGRectMake(30+width*i, self.userHeaderView.bottom+10, width, 25)];
countLabel.textAlignment = NSTextAlignmentCenter; countLabel.textAlignment = NSTextAlignmentCenter;
countLabel.textColor = RGB16(0xCCCDC8); countLabel.textColor = RGB16(0xCCCDC8);
countLabel.tag = 10 + i; countLabel.tag = 10 + i;
@@ -166,7 +171,7 @@
} }
self.nobilityBgView = [[UIView alloc] initWithFrame:CGRectMake(30, self.userHeaderView.bottom+95, SCREEN_WIDTH-60, ScaleWidth(40))]; self.nobilityBgView = [[UIView alloc] initWithFrame:CGRectMake(30, self.userHeaderView.bottom+80, SCREEN_WIDTH-60, ScaleWidth(40))];
[self.nobilityBgView addTapBlock:^(id _Nonnull obj) { [self.nobilityBgView addTapBlock:^(id _Nonnull obj) {
if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didClickOptionType:)]) { if (weakSelf.delegate && [weakSelf.delegate respondsToSelector:@selector(didClickOptionType:)]) {
[weakSelf.delegate didClickOptionType:QXMainHeaderOptionTypeNobility]; [weakSelf.delegate didClickOptionType:QXMainHeaderOptionTypeNobility];
@@ -282,6 +287,33 @@
_coin = coin; _coin = coin;
self.walletMoneyLabel.text = [NSString stringWithFormat:@"%.2f",coin.doubleValue]; self.walletMoneyLabel.text = [NSString stringWithFormat:@"%.2f",coin.doubleValue];
} }
-(void)setBannerArray:(NSArray *)bannerArray{
_bannerArray = bannerArray;
[self.bannerImages removeAllObjects];
for (QXBanner *banner in bannerArray) {
[self.bannerImages addObject:banner.image];
}
self.cycleScrollView.imageURLStringsGroup = self.bannerImages;
}
-(void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didSelectItemAtIndex:(NSInteger)index{
if (!QXGlobal.shareGlobal.isLogin) {
[[QXGlobal shareGlobal] logOut];
return;
}
QXBanner *banner = self.bannerArray[index];
if ([banner.type isEqualToString:@"2"]) {
QXBaseWebViewController *webVc = [[QXBaseWebViewController alloc] init];
webVc.urlStr = banner.url;
[self.navigationController pushViewController:webVc animated:YES];
}else if ([banner.type isEqualToString:@"3"]){
[[QXGlobal shareGlobal] joinRoomWithRoomId:banner.aid isRejoin:NO navagationController:self.navigationController];
}else if ([banner.type isEqualToString:@"4"]){
QXUserHomePageViewController *userHomePage = [[QXUserHomePageViewController alloc] init];
userHomePage.user_id = banner.aid;
[self.viewController.navigationController pushViewController:userHomePage animated:YES];
}
}
-(void)reloadData{ -(void)reloadData{
if ([self.toolsArray containsObject:self.rechargeModel]) { if ([self.toolsArray containsObject:self.rechargeModel]) {
return; return;
@@ -333,6 +365,12 @@
-(void)setUserModel:(QXUserModel *)userModel{ -(void)setUserModel:(QXUserModel *)userModel{
_userModel = userModel; _userModel = userModel;
[self.userHeaderView setHeadIcon:userModel.avatar dress:userModel.dress]; [self.userHeaderView setHeadIcon:userModel.avatar dress:userModel.dress];
[self.userHeaderView.nobilityImageView sd_setImageWithURL:[NSURL URLWithString:userModel.nobility_image]];
if ([userModel.nickname_color isExist]) {
self.nameLabel.textColor = [UIColor colorWithHexString:userModel.nickname_color];
}else{
self.nameLabel.textColor = RGB16A(0xffffff,0.85);
}
self.nameLabel.text = userModel.nickname; self.nameLabel.text = userModel.nickname;
self.idLabel.text = [NSString stringWithFormat:@"ID:%@",userModel.user_code]; self.idLabel.text = [NSString stringWithFormat:@"ID:%@",userModel.user_code];
UILabel *followLabel = [self viewWithTag:10]; UILabel *followLabel = [self viewWithTag:10];
@@ -346,7 +384,7 @@
} }
for (int i = 0;i<userModel.icon.count;i++) { for (int i = 0;i<userModel.icon.count;i++) {
NSString*icon = userModel.icon[i]; NSString*icon = userModel.icon[i];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.nameLabel.left+i*UserIconWidth, self.userHeaderView.bottom-5-UserIconHeight, UserIconWidth, UserIconHeight)]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.nameLabel.left+i*UserIconWidth, self.idLabel.bottom+9, UserIconWidth, UserIconHeight)];
[imageView sd_setImageWithURL:[NSURL URLWithString:icon]]; [imageView sd_setImageWithURL:[NSURL URLWithString:icon]];
[self addSubview:imageView]; [self addSubview:imageView];
[self.iconArray addObject:imageView]; [self.iconArray addObject:imageView];
@@ -415,4 +453,10 @@
} }
return _rechargeModel; return _rechargeModel;
} }
-(NSMutableArray *)bannerImages{
if (!_bannerImages) {
_bannerImages = [NSMutableArray array];
}
return _bannerImages;
}
@end @end

View File

@@ -188,7 +188,7 @@
QXServiceModel *md3 = [[QXServiceModel alloc] init]; QXServiceModel *md3 = [[QXServiceModel alloc] init];
md3.title = @"意见反馈"; md3.title = @"意见反馈";
md3.icon = @"service_bag"; md3.icon = @"service_report";
md3.type = QXMineServiceTypeReport; md3.type = QXMineServiceTypeReport;
QXServiceModel *md4 = [[QXServiceModel alloc] init]; QXServiceModel *md4 = [[QXServiceModel alloc] init];

View File

@@ -51,16 +51,12 @@
[self addSubview:self.headerView]; [self addSubview:self.headerView];
[self.headerView mas_makeConstraints:^(MASConstraintMaker *make) { [self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(32); make.left.mas_equalTo(32);
make.height.width.mas_equalTo(70); make.width.mas_equalTo(70);
make.height.mas_equalTo(84);
make.top.mas_equalTo(26); make.top.mas_equalTo(26);
}]; }];
self.sexImageView = [[UIImageView alloc] init];
[self addSubview:self.sexImageView];
[self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.bottom.equalTo(self.headerView);
make.height.width.mas_equalTo(16);
}];
self.nameLabel = [[UILabel alloc] init]; self.nameLabel = [[UILabel alloc] init];
self.nameLabel.textColor = QXConfig.textColor; self.nameLabel.textColor = QXConfig.textColor;
@@ -72,12 +68,20 @@
make.top.equalTo(self.headerView.mas_bottom).offset(4); make.top.equalTo(self.headerView.mas_bottom).offset(4);
}]; }];
self.sexImageView = [[UIImageView alloc] init];
[self addSubview:self.sexImageView];
[self.sexImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.nameLabel.mas_right).offset(5);
make.centerY.equalTo(self.nameLabel);
make.height.width.mas_equalTo(16);
}];
self.idLabel = [[UILabel alloc] init]; self.idLabel = [[UILabel alloc] init];
self.idLabel.textColor = RGB16(0x999999); self.idLabel.textColor = RGB16(0x999999);
self.idLabel.font = [UIFont boldSystemFontOfSize:12]; self.idLabel.font = [UIFont boldSystemFontOfSize:12];
[self addSubview:self.idLabel]; [self addSubview:self.idLabel];
[self.idLabel mas_makeConstraints:^(MASConstraintMaker *make) { [self.idLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.nameLabel.mas_right).offset(12); make.left.equalTo(self.sexImageView.mas_right).offset(12);
make.height.mas_equalTo(24); make.height.mas_equalTo(24);
make.centerY.equalTo(self.nameLabel); make.centerY.equalTo(self.nameLabel);
}]; }];
@@ -267,7 +271,13 @@
-(void)setModel:(QXUserHomeModel *)model{ -(void)setModel:(QXUserHomeModel *)model{
_model = model; _model = model;
[self.headerView setHeadIcon:model.avatar dress:model.dress]; [self.headerView setHeadIcon:model.avatar dress:model.dress];
[self.headerView.nobilityImageView sd_setImageWithURL:[NSURL URLWithString:model.nobility_image]];
self.nameLabel.text = model.nickname; self.nameLabel.text = model.nickname;
if ([model.nickname_color isExist]) {
self.nameLabel.textColor = [UIColor colorWithHexString:model.nickname_color];
}else{
self.nameLabel.textColor = QXConfig.textColor;
}
self.idLabel.text = [NSString stringWithFormat:@"ID:%@",model.user_code]; self.idLabel.text = [NSString stringWithFormat:@"ID:%@",model.user_code];
self.ageLabel.text = [NSString stringWithFormat:@"%@|%ld岁",model.sex.intValue==1?QXText(@"男"):QXText(@"女"),[model.birthday ageWithDateOfBirth]]; self.ageLabel.text = [NSString stringWithFormat:@"%@|%ld岁",model.sex.intValue==1?QXText(@"男"):QXText(@"女"),[model.birthday ageWithDateOfBirth]];
self.introduceLabel.text = model.profile; self.introduceLabel.text = model.profile;

View File

@@ -0,0 +1,17 @@
//
// QXRechargePayTypeTableCell.h
// QXLive
//
// Created by 启星 on 2025/11/8.
//
#import <UIKit/UIKit.h>
#import "QXRechargePayTypeView.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXRechargePayTypeTableCell : UITableViewCell
@property (nonatomic,strong)QXPayTypeModel *model;
+(instancetype)cellWithTableView:(UITableView *)tableView;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,56 @@
//
// QXRechargePayTypeTableCell.m
// QXLive
//
// Created by on 2025/11/8.
//
#import "QXRechargePayTypeTableCell.h"
@interface QXRechargePayTypeTableCell()
@property (nonatomic,strong)QXRechargePayTypeView *payTypeView;
@end
@implementation QXRechargePayTypeTableCell
+(instancetype)cellWithTableView:(UITableView *)tableView{
static NSString *cellId = @"QXRechargePayTypeTableCell";
QXRechargePayTypeTableCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[QXRechargePayTypeTableCell alloc] initWithStyle:(UITableViewCellStyleDefault) reuseIdentifier:cellId];
}
return cell;
}
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
[self initSubviews];
self.backgroundColor = UIColor.clearColor;
self.selectionStyle = UITableViewCellSelectionStyleNone;
}
return self;
}
-(void)setModel:(QXPayTypeModel *)model{
_model = model;
self.payTypeView.model = model;
}
-(void)initSubviews{
self.payTypeView = [[QXRechargePayTypeView alloc] init];
[self.contentView addSubview:self.payTypeView];
[self.payTypeView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_equalTo(-16);
make.top.bottom.equalTo(self);
}];
}
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end

View File

@@ -266,7 +266,7 @@
} }
@weakify(self) @weakify(self)
[QXMineNetwork rechargePayWithMoney:self.selectedModel.money coin:self.selectedModel.coins type:self.selectedPayTypeModel.type userId:QXGlobal.shareGlobal.loginModel.user_id typeId:self.gift_bag_id successBlock:^(NSDictionary * _Nonnull dict) { [QXMineNetwork rechargePayWithMoney:self.selectedModel.money coin:self.selectedModel.coins type:self.selectedPayTypeModel.type userId:QXGlobal.shareGlobal.loginModel.user_id typeId:self.gift_bag_id nobility_id:@"" successBlock:^(NSDictionary * _Nonnull dict) {
@strongify(self) @strongify(self)
if (self.selectedPayTypeModel.type.intValue == 2) { if (self.selectedPayTypeModel.type.intValue == 2) {
NSDictionary *resultDict = dict[@"data"]; NSDictionary *resultDict = dict[@"data"];

View File

@@ -0,0 +1,17 @@
//
// QXNobilityBuyDesCell.h
// QXLive
//
// Created by 启星 on 2025/11/7.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityBuyDesCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
+(instancetype)cellWithTableView:(UITableView *)tableView;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,31 @@
//
// QXNobilityBuyDesCell.m
// QXLive
//
// Created by on 2025/11/7.
//
#import "QXNobilityBuyDesCell.h"
@implementation QXNobilityBuyDesCell
+(instancetype)cellWithTableView:(UITableView *)tableView{
static NSString *cellId = @"QXNobilityBuyDesCell";
QXNobilityBuyDesCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (!cell) {
cell = [[NSBundle mainBundle] loadNibNamed:cellId owner:nil options:nil].lastObject;
cell.backgroundColor = [UIColor clearColor];
}
return cell;
}
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
@end

View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell contentMode="scaleToFill" selectionStyle="none" indentationWidth="10" rowHeight="123" id="KGk-i7-Jjw" customClass="QXNobilityBuyDesCell">
<rect key="frame" x="0.0" y="0.0" width="428" height="123"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
<rect key="frame" x="0.0" y="0.0" width="428" height="123"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="nobility_buy_right" translatesAutoresizingMaskIntoConstraints="NO" id="iv3-Qk-Sz9">
<rect key="frame" x="16" y="51.666666666666664" width="20" height="19.999999999999993"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="1KK-NC-aPP"/>
<constraint firstAttribute="width" constant="20" id="MB4-aI-H6f"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Mbe-RV-FTv">
<rect key="frame" x="46" y="0.0" width="372" height="123"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" red="0.20000000000000001" green="0.20000000000000001" blue="0.20000000000000001" alpha="0.84999999999999998" colorSpace="custom" customColorSpace="sRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="Mbe-RV-FTv" secondAttribute="bottom" id="bdU-cC-yAv"/>
<constraint firstItem="Mbe-RV-FTv" firstAttribute="leading" secondItem="iv3-Qk-Sz9" secondAttribute="trailing" constant="10" id="nvH-RN-gNj"/>
<constraint firstItem="iv3-Qk-Sz9" firstAttribute="leading" secondItem="H2p-sc-9uM" secondAttribute="leading" constant="16" id="p3e-oi-7MM"/>
<constraint firstAttribute="trailing" secondItem="Mbe-RV-FTv" secondAttribute="trailing" constant="10" id="uXt-vT-XiJ"/>
<constraint firstItem="Mbe-RV-FTv" firstAttribute="top" secondItem="H2p-sc-9uM" secondAttribute="top" id="xtE-ts-Q7A"/>
</constraints>
</tableViewCellContentView>
<viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
<constraints>
<constraint firstItem="iv3-Qk-Sz9" firstAttribute="centerY" secondItem="aW0-zy-SZf" secondAttribute="centerY" id="f41-7K-Iof"/>
</constraints>
<connections>
<outlet property="titleLabel" destination="Mbe-RV-FTv" id="8Hk-Ou-mp3"/>
</connections>
<point key="canvasLocation" x="221.37404580152671" y="47.535211267605639"/>
</tableViewCell>
</objects>
<resources>
<image name="nobility_buy_right" width="18" height="18"/>
</resources>
</document>

View File

@@ -0,0 +1,26 @@
//
// QXNobilityContentView.h
// QXLive
//
// Created by 启星 on 2025/11/7.
//
#import <UIKit/UIKit.h>
#import "QXNobilityModel.h"
@class QXNobilityContentColView;
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityContentView : UIView
@property (nonatomic, strong) QXNobilityModel *model;
- (void)reloadData;
@end
@interface QXNobilityContentColView : UIView
@property (nonatomic,strong)QXUserNobility *model;
@property (nonatomic,strong)UILabel *titleLabel;
@property (nonatomic,strong)UIView *colorView;
@property (nonatomic,strong)UIImageView *imageView;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,437 @@
//
// QXNobilityContentView.m
// QXLive
//
// Created by on 2025/11/7.
//
#import "QXNobilityContentView.h"
@interface QXNobilityContentView()<UIScrollViewDelegate>
@property (nonatomic, strong) NSMutableArray *privilegeTitles;
@property (nonatomic, assign) NSInteger rowCount;
@property (nonatomic, strong) NSMutableArray *rowHeaders;
@property (nonatomic, assign) CGFloat rowHeaderWidth;
@property (nonatomic, assign) CGFloat columnHeaderHeight;
@property (nonatomic, assign) CGFloat cellWidth;
@property (nonatomic, assign) CGFloat cellHeight;
//
@property (nonatomic, strong) UIScrollView *verticalScrollView; //
@property (nonatomic, strong) UIScrollView *horizontalScrollView; //
@property (nonatomic, strong) UIScrollView *contentScrollView; //
@property (nonatomic, strong) UIScrollView *rowHeaderScrollView; //
//
@property (nonatomic, strong) UIView *cornerView; //
@property (nonatomic, strong) UIView *columnHeaderView; //
@property (nonatomic, strong)UILabel *cornerLabel;
//
@property (nonatomic, strong) UIView *contentContainer;
@property (nonatomic, strong) UIView *rowHeaderContainer;
@property (nonatomic, strong) UIView *borderView;
@property (nonatomic, assign) BOOL isSyncingScroll;
@property (nonatomic, assign) NSInteger currentIndex;
@end
@implementation QXNobilityContentView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (void)setup {
self.clipsToBounds = YES;
int itemWidth = (self.width/4);
self.rowHeaderWidth = itemWidth;
self.columnHeaderHeight = 50;
self.cellWidth = itemWidth;
self.cellHeight = 42;
self.isSyncingScroll = NO;
[self createScrollViews];
[self createFixedViews];
[self createContentViews];
[self bringSubviewToFront:self.horizontalScrollView];
[self bringSubviewToFront:self.rowHeaderScrollView];
[self bringSubviewToFront:self.cornerView];
[self bringSubviewToFront:self.contentScrollView];
}
- (void)createScrollViews {
// -
self.verticalScrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
self.verticalScrollView.delegate = self;
self.verticalScrollView.bounces = NO;
self.verticalScrollView.alwaysBounceVertical = YES;
self.verticalScrollView.showsVerticalScrollIndicator = YES;
self.verticalScrollView.showsHorizontalScrollIndicator = NO;
[self addSubview:self.verticalScrollView];
// -
self.horizontalScrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
self.horizontalScrollView.delegate = self;
self.horizontalScrollView.bounces = NO;
self.horizontalScrollView.alwaysBounceHorizontal = YES;
self.horizontalScrollView.showsHorizontalScrollIndicator = YES;
self.horizontalScrollView.showsVerticalScrollIndicator = NO;
[self addSubview:self.horizontalScrollView];
// -
CGRect contentFrame = CGRectMake(self.rowHeaderWidth, self.columnHeaderHeight,
self.bounds.size.width - self.rowHeaderWidth,
self.bounds.size.height - self.columnHeaderHeight);
self.contentScrollView = [[UIScrollView alloc] initWithFrame:contentFrame];
self.contentScrollView.delegate = self;
self.contentScrollView.bounces = NO;
self.contentScrollView.alwaysBounceVertical = YES;
self.contentScrollView.alwaysBounceHorizontal = YES;
self.contentScrollView.showsVerticalScrollIndicator = NO;
self.contentScrollView.showsHorizontalScrollIndicator = NO;
[self addSubview:self.contentScrollView];
// -
CGRect rowHeaderFrame = CGRectMake(0, self.columnHeaderHeight, self.rowHeaderWidth, self.bounds.size.height - self.columnHeaderHeight);
self.rowHeaderScrollView = [[UIScrollView alloc] initWithFrame:rowHeaderFrame];
self.rowHeaderScrollView.delegate = self;
self.rowHeaderScrollView.bounces = NO;
self.rowHeaderScrollView.alwaysBounceVertical = YES;
self.rowHeaderScrollView.showsVerticalScrollIndicator = NO;
self.rowHeaderScrollView.showsHorizontalScrollIndicator = NO;
[self addSubview:self.rowHeaderScrollView];
self.borderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.cellWidth, 0)];
[self.borderView addRoundedCornersWithRadius:6];
self.borderView.layer.borderWidth = 1;
self.borderView.layer.borderColor = RGB16(0xF5E9D1).CGColor;
self.borderView.hidden = YES;
}
- (void)createFixedViews {
// -
self.cornerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.rowHeaderWidth, self.columnHeaderHeight)];
self.cornerView.backgroundColor = [UIColor clearColor];
self.cornerView.backgroundColor = RGB16(0x2A2A4E);
self.cornerView.userInteractionEnabled = NO; //
UILabel *cornerLabel = [[UILabel alloc] initWithFrame:self.cornerView.bounds];
cornerLabel.textAlignment = NSTextAlignmentCenter;
cornerLabel.textColor = UIColor.whiteColor;
cornerLabel.font = [UIFont boldSystemFontOfSize:14];
self.cornerLabel = cornerLabel;
[self.cornerView addSubview:cornerLabel];
[self addSubview:self.cornerView];
// -
self.columnHeaderView = [[UIView alloc] initWithFrame:CGRectMake(self.rowHeaderWidth, 0, self.bounds.size.width - self.rowHeaderWidth, self.columnHeaderHeight)];
self.columnHeaderView.backgroundColor = [UIColor clearColor];
self.columnHeaderView.backgroundColor = RGB16(0x2A2A4E);
self.columnHeaderView.userInteractionEnabled = NO;
[self insertSubview:self.columnHeaderView belowSubview:self.cornerView];
}
- (void)createContentViews {
if (self.privilegeTitles.count == 0) {
return;
}
NSArray *columnTitles = self.privilegeTitles;
NSInteger columnCount = columnTitles.count - 1; //
//
CGFloat contentWidth = self.cellWidth * columnCount;
CGFloat contentHeight = self.cellHeight * self.rowCount;
//
self.verticalScrollView.contentSize = CGSizeMake(self.bounds.size.width, self.columnHeaderHeight + contentHeight);
self.horizontalScrollView.contentSize = CGSizeMake(self.rowHeaderWidth + contentWidth, self.bounds.size.height);
self.contentScrollView.contentSize = CGSizeMake(contentWidth, contentHeight);
self.rowHeaderScrollView.contentSize = CGSizeMake(self.rowHeaderWidth, contentHeight);
self.borderView.height = self.columnHeaderHeight + contentHeight;
//
self.contentContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, contentWidth, contentHeight)];
[self.contentScrollView addSubview:self.contentContainer];
//
self.rowHeaderContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.rowHeaderWidth, contentHeight)];
[self.rowHeaderScrollView addSubview:self.rowHeaderContainer];
//
[self createColumnHeaders:columnTitles];
//
[self createRowHeaders];
//
[self createContentCells:columnTitles];
}
- (void)createColumnHeaders:(NSArray *)columnTitles {
//
for (UIView *view in self.columnHeaderView.subviews) {
[view removeFromSuperview];
}
CGFloat totalHeaderWidth = self.cellWidth * (columnTitles.count - 1);
for (int i = 0; i < columnTitles.count - 1; i++) {
UIView *headerCell = [[UIView alloc] initWithFrame:CGRectMake(i * self.cellWidth, 0, self.cellWidth, self.columnHeaderHeight)];
UILabel *label = [[UILabel alloc] initWithFrame:headerCell.bounds];
label.text = columnTitles[i + 1]; //
label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont boldSystemFontOfSize:12];
label.textColor = UIColor.whiteColor;
label.numberOfLines = 0;
[headerCell addSubview:label];
[self.columnHeaderView addSubview:headerCell];
}
//
self.columnHeaderView.frame = CGRectMake(self.rowHeaderWidth, 0, totalHeaderWidth, self.columnHeaderHeight);
}
- (void)createRowHeaders {
//
for (UIView *view in self.rowHeaderContainer.subviews) {
[view removeFromSuperview];
}
for (int i = 0; i < self.rowHeaders.count; i++) {
QXUserNobility *titleData = self.rowHeaders[i];
UIView *headerCell = [[UIView alloc] initWithFrame:CGRectMake(0, i * self.cellHeight, self.rowHeaderWidth, self.cellHeight)];
// headerCell.layer.borderWidth = 0.5;
// headerCell.layer.borderColor = [UIColor lightGrayColor].CGColor;
UILabel *label = [[UILabel alloc] initWithFrame:headerCell.bounds];
label.text = [NSString stringWithFormat:@"%@", titleData.name];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = UIColor.whiteColor;
label.font = [UIFont systemFontOfSize:12];
[headerCell addSubview:label];
if (i%2==0) {
headerCell.backgroundColor = RGB16A(0x323252, 1);
}else{
headerCell.backgroundColor = RGB16A(0x2A2A4E, 1);
}
//
// if (titleData.isCurrentUser) {
// headerCell.backgroundColor = [UIColor colorWithRed:0.8 green:0.9 blue:1.0 alpha:1.0];
// headerCell.layer.borderWidth = 2;
// headerCell.layer.borderColor = [UIColor systemBlueColor].CGColor;
// }
[self.rowHeaderContainer addSubview:headerCell];
}
}
- (void)createContentCells:(NSArray *)columnTitles {
// //
for (UIView *view in self.contentContainer.subviews) {
[view removeFromSuperview];
}
for (int col = 0; col < columnTitles.count - 1; col++) {
QXNobilityLevel *model = self.model.nobility_power_list[col+1];
for (int row = 0; row < self.rowHeaders.count; row++) {
// UIView *cell = [[UIView alloc] initWithFrame:CGRectMake(col * self.cellWidth, row * self.cellHeight, self.cellWidth, self.cellHeight)];
// cell.layer.borderWidth = 0.5;
// cell.layer.borderColor = [UIColor lightGrayColor].CGColor;
//
// UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, self.cellWidth - 10, self.cellHeight)];
// label.font = [UIFont systemFontOfSize:12];
// label.numberOfLines = 0;
// label.textColor = UIColor.whiteColor;
QXUserNobility *md = model.nobility_list[row];
// label.text = md.status.intValue == 1?@"开":@"关";
// [cell addSubview:label];;
// [self.contentContainer addSubview:cell];
QXNobilityContentColView *colView = [[QXNobilityContentColView alloc] initWithFrame:CGRectMake(col * self.cellWidth, row * self.cellHeight, self.cellWidth, self.cellHeight)];
colView.model = md;
if (row%2==0) {
colView.backgroundColor = RGB16A(0x323252, 1);
}else{
colView.backgroundColor = RGB16A(0x2A2A4E, 1);
}
[self.contentContainer addSubview:colView];
}
}
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (self.isSyncingScroll) return;
self.isSyncingScroll = YES;
if (scrollView == self.verticalScrollView) {
//
CGFloat offsetY = scrollView.contentOffset.y;
self.contentScrollView.contentOffset = CGPointMake(self.contentScrollView.contentOffset.x, offsetY);
self.rowHeaderScrollView.contentOffset = CGPointMake(0, offsetY);
} else if (scrollView == self.horizontalScrollView) {
//
CGFloat offsetX = scrollView.contentOffset.x;
self.contentScrollView.contentOffset = CGPointMake(offsetX, self.contentScrollView.contentOffset.y);
} else if (scrollView == self.contentScrollView) {
//
CGFloat offsetX = scrollView.contentOffset.x;
CGFloat offsetY = scrollView.contentOffset.y;
self.verticalScrollView.contentOffset = CGPointMake(self.verticalScrollView.contentOffset.x, offsetY);
self.horizontalScrollView.contentOffset = CGPointMake(offsetX, self.horizontalScrollView.contentOffset.y);
self.rowHeaderScrollView.contentOffset = CGPointMake(0, offsetY);
} else if (scrollView == self.rowHeaderScrollView) {
//
CGFloat offsetY = scrollView.contentOffset.y;
self.verticalScrollView.contentOffset = CGPointMake(self.verticalScrollView.contentOffset.x, offsetY);
self.contentScrollView.contentOffset = CGPointMake(self.contentScrollView.contentOffset.x, offsetY);
}
//
[self updateFixedViewsPosition];
self.isSyncingScroll = NO;
}
- (void)updateFixedViewsPosition {
CGFloat offsetX = self.horizontalScrollView.contentOffset.x;
CGFloat offsetY = self.verticalScrollView.contentOffset.y;
//
// (0, 0)
self.cornerView.frame = CGRectMake(0, 0, self.rowHeaderWidth, self.columnHeaderHeight);
//
self.columnHeaderView.frame = CGRectMake(self.rowHeaderWidth - offsetX, 0, self.columnHeaderView.frame.size.width, self.columnHeaderHeight);
// contentOffset
self.rowHeaderScrollView.frame = CGRectMake(0, self.columnHeaderHeight, self.rowHeaderWidth, self.bounds.size.height - self.columnHeaderHeight);
}
-(void)setModel:(QXNobilityModel *)model{
_model = model;
[self.privilegeTitles removeAllObjects];
[self.rowHeaders removeAllObjects];
for (int i = 0; i < model.nobility_power_list.count;i++ ) {
QXNobilityLevel*md = model.nobility_power_list[i];
[self.privilegeTitles addObject:md.name];
self.rowCount = md.nobility_list.count;
if (i == 0) {
self.cornerLabel.text = md.name;
[self.rowHeaders addObjectsFromArray:md.nobility_list];
}
}
self.currentIndex = 3;
}
- (void)reloadData {
[self createContentViews];
[self scrollToCurrentUser];
}
- (void)scrollToCurrentUser {
if (self.currentIndex == -1) {
return;
}
// self.borderView.hidden = NO;
// self.borderView.x = ((self.width/4)*(self.currentIndex));
// [self.horizontalScrollView addSubview:self.borderView];
// [self.horizontalScrollView bringSubviewToFront:self.borderView];
if (self.currentIndex<3) {
return;
}
[self.horizontalScrollView setContentOffset:CGPointMake(((self.width/4)*(self.currentIndex-2)),0 ) animated:YES];
}
-(NSMutableArray *)privilegeTitles{
if (!_privilegeTitles) {
_privilegeTitles = [NSMutableArray array];
}
return _privilegeTitles;
}
-(NSMutableArray *)rowHeaders{
if (!_rowHeaders) {
_rowHeaders = [NSMutableArray array];
}
return _rowHeaders;
}
@end
@implementation QXNobilityContentColView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initSubviews];
}
return self;
}
-(void)setModel:(QXUserNobility *)model{
if (model.type.intValue == 1) {
if (model.status.intValue == 1) {
self.imageView.image = [UIImage imageNamed:@"nobility_power_on"];
}else{
self.imageView.image = [UIImage imageNamed:@"nobility_power_off"];
}
}else{
if ([model.nick_name_color_name isExist]) {
self.titleLabel.textColor = [UIColor colorWithHexString:model.nick_name_color];
self.titleLabel.text = model.nick_name_color_name;
}
}
}
-(void)initSubviews{
self.colorView = [[UIView alloc] init];
[self.colorView addRoundedCornersWithRadius:11];
[self addSubview:self.colorView];
[self.colorView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.centerY.equalTo(self);
make.width.height.mas_equalTo(22);
}];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.textColor = RGB16(0xffffff);
self.titleLabel.font = [UIFont systemFontOfSize:14];
self.titleLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self);
}];
self.imageView = [[UIImageView alloc] init];
self.imageView.contentMode = UIViewContentModeScaleToFill;
[self addSubview:self.imageView];
[self.imageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.centerY.equalTo(self);
make.width.height.mas_equalTo(22);
}];
}
@end

View File

@@ -0,0 +1,19 @@
//
// QXNobilityDetailCell.h
// QXLive
//
// Created by 启星 on 2025/11/8.
//
#import <UIKit/UIKit.h>
#import "QXNobilityListModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityDetailCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
@property (weak, nonatomic) IBOutlet UILabel *detailLabel;
@property (nonatomic,strong)QXNobilityPowerList *model;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,22 @@
//
// QXNobilityDetailCell.m
// QXLive
//
// Created by on 2025/11/8.
//
#import "QXNobilityDetailCell.h"
@implementation QXNobilityDetailCell
-(void)setModel:(QXNobilityPowerList *)model{
_model = model;
[self.imageView sd_setImageWithURL:[NSURL URLWithString:model.image]];
self.titleLabel.text = model.name;
self.detailLabel.text = model.content;
}
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
@end

View File

@@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="23504" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina6_12" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="23506"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="gTV-IL-0wX" customClass="QXNobilityDetailCell">
<rect key="frame" x="0.0" y="0.0" width="234" height="264"/>
<autoresizingMask key="autoresizingMask"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="234" height="264"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="xLT-Xg-Faz">
<rect key="frame" x="0.0" y="0.0" width="234" height="264"/>
<color key="backgroundColor" red="0.16470588235294117" green="0.16078431372549018" blue="0.14509803921568626" alpha="1" colorSpace="calibratedRGB"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="layer.masksToBounds" value="YES"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="4"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
</view>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="v8w-N9-of1">
<rect key="frame" x="32" y="38" width="170" height="170"/>
<constraints>
<constraint firstAttribute="width" secondItem="v8w-N9-of1" secondAttribute="height" multiplier="1:1" id="xE8-2U-Q4D"/>
</constraints>
</imageView>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="o3H-L7-zGq">
<rect key="frame" x="7" y="216" width="220" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="tF6-85-THZ"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" red="0.85490196078431369" green="0.74117647058823533" blue="0.60392156862745094" alpha="1" colorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4BP-5u-QY4">
<rect key="frame" x="7" y="238" width="220" height="17"/>
<constraints>
<constraint firstAttribute="height" constant="17" id="gOE-Qf-Pmu"/>
</constraints>
<fontDescription key="fontDescription" type="system" pointSize="12"/>
<color key="textColor" red="0.46666666666666667" green="0.46666666666666667" blue="0.45882352941176469" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</view>
<viewLayoutGuide key="safeArea" id="SEy-5g-ep8"/>
<constraints>
<constraint firstItem="4BP-5u-QY4" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="7" id="6Cn-Ir-Kpu"/>
<constraint firstAttribute="trailing" secondItem="4BP-5u-QY4" secondAttribute="trailing" constant="7" id="A9u-ce-WWY"/>
<constraint firstItem="o3H-L7-zGq" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="7" id="CLo-rE-ybM"/>
<constraint firstAttribute="trailing" secondItem="o3H-L7-zGq" secondAttribute="trailing" constant="7" id="CiZ-7I-Tt0"/>
<constraint firstAttribute="trailing" secondItem="v8w-N9-of1" secondAttribute="trailing" constant="32" id="Dm3-kU-uHK"/>
<constraint firstItem="o3H-L7-zGq" firstAttribute="top" secondItem="v8w-N9-of1" secondAttribute="bottom" constant="8" id="Fse-jn-eg5"/>
<constraint firstAttribute="trailing" secondItem="xLT-Xg-Faz" secondAttribute="trailing" id="I7V-P0-Wce"/>
<constraint firstItem="xLT-Xg-Faz" firstAttribute="top" secondItem="gTV-IL-0wX" secondAttribute="top" id="R9b-Pk-7kv"/>
<constraint firstItem="v8w-N9-of1" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" constant="32" id="Z12-gU-Cot"/>
<constraint firstAttribute="bottom" secondItem="4BP-5u-QY4" secondAttribute="bottom" constant="9" id="bCf-Nt-Q5f"/>
<constraint firstItem="xLT-Xg-Faz" firstAttribute="leading" secondItem="gTV-IL-0wX" secondAttribute="leading" id="gKP-tC-6Lb"/>
<constraint firstAttribute="bottom" secondItem="xLT-Xg-Faz" secondAttribute="bottom" id="tP6-br-JEa"/>
<constraint firstItem="4BP-5u-QY4" firstAttribute="top" secondItem="o3H-L7-zGq" secondAttribute="bottom" constant="2" id="vav-ld-2v5"/>
</constraints>
<size key="customSize" width="234" height="264"/>
<connections>
<outlet property="detailLabel" destination="4BP-5u-QY4" id="pNH-JS-TJQ"/>
<outlet property="imageView" destination="v8w-N9-of1" id="sQP-eY-MPi"/>
<outlet property="titleLabel" destination="o3H-L7-zGq" id="AbG-Si-q2W"/>
</connections>
<point key="canvasLocation" x="279.38931297709922" y="95.070422535211279"/>
</collectionViewCell>
</objects>
</document>

View File

@@ -0,0 +1,20 @@
//
// QXNobilityDetailTopCell.h
// QXLive
//
// Created by 启星 on 2025/11/8.
//
#import "GKCycleScrollViewCell.h"
#import "QXNobilityListModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityDetailTopCell : GKCycleScrollViewCell
@property (nonatomic,strong)QXNobilityListModel *model;
@property (nonatomic,assign)NSInteger index;
@property (nonatomic,assign)NSInteger myIndex;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,66 @@
//
// QXNobilityDetailTopCell.m
// QXLive
//
// Created by on 2025/11/8.
//
#import "QXNobilityDetailTopCell.h"
#import "UIImage+QX.h"
@interface QXNobilityDetailTopCell()
@property (nonatomic,strong)UILabel *titleLabel;
@property (nonatomic,strong)UIImageView *currentNobilityImageView;
@end
@implementation QXNobilityDetailTopCell
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self initSubViews];
}
return self;
}
-(void)setIndex:(NSInteger)index{
_index = index;
}
-(void)setMyIndex:(NSInteger)myIndex{
_myIndex = myIndex;
}
-(void)setModel:(QXNobilityListModel *)model{
_model = model;
if (self.myIndex<=self.index) {
[self.currentNobilityImageView sd_setImageWithURL:[NSURL URLWithString:model.image]];
}else{
[self.currentNobilityImageView sd_setImageWithURL:[NSURL URLWithString:model.image] completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
image = [UIImage qx_convertImageToGrayWithCoreImage:image];
self.currentNobilityImageView.image = image;
}];
}
self.titleLabel.text = model.name;
}
-(void)initSubViews{
self.backgroundColor = [UIColor clearColor];
self.currentNobilityImageView = [[UIImageView alloc] init];
self.currentNobilityImageView.contentMode = UIViewContentModeScaleAspectFill;
[self.currentNobilityImageView addRoundedCornersWithRadius:7];
[self addSubview:self.currentNobilityImageView];
[self.currentNobilityImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.equalTo(self);
make.width.height.mas_equalTo(220);
make.centerX.equalTo(self);
}];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.textColor = RGB16(0xF4C07C);
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.titleLabel.font = [UIFont fontWithName:@"YouSheBiaoTiHei" size:34];
[self addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.top.equalTo(self);
make.height.mas_equalTo(44);
}];
}
@end

View File

@@ -0,0 +1,25 @@
//
// QXNobilityHeaderView.h
// QXLive
//
// Created by 启星 on 2025/11/7.
//
#import <UIKit/UIKit.h>
#import "QXNobilityModel.h"
NS_ASSUME_NONNULL_BEGIN
@protocol QXNobilityHeaderViewDelegate <NSObject>
@optional
/// 去开通
-(void)didOpenNobility;
/// 去续费
-(void)didRenewNobility;
@end
@interface QXNobilityHeaderView : UIView
@property (nonatomic,strong)QXNobilityModel *model;
@property (nonatomic,weak)id<QXNobilityHeaderViewDelegate>delegate;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,145 @@
//
// QXNobilityHeaderView.m
// QXLive
//
// Created by on 2025/11/7.
//
#import "QXNobilityHeaderView.h"
#import "QXSeatHeaderView.h"
@interface QXNobilityHeaderView()
@property (nonatomic,strong)QXSeatHeaderView *userAvatarView;
@property (nonatomic,strong)UILabel *userNameLabel;
///
@property (nonatomic,strong)UIView *currentNobilityBgView;
@property (nonatomic,strong)UIImageView *currentNobilityBgImageView;
///
@property (nonatomic,strong)UILabel *currentNobilityLabel;
@property (nonatomic,strong)UIButton *buyBtn;
///
@property (nonatomic,strong)UIButton *openBtn;
@property (nonatomic,strong)UILabel *currentNobilityTimeLabel;
@property (nonatomic,strong)UIImageView *currenNobilityImageView;
@property (nonatomic,strong)UIImageView *compareImageView;
@end
@implementation QXNobilityHeaderView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initSubviews];
self.height = self.compareImageView.bottom+12;
}
return self;
}
-(void)initSubviews{
self.userAvatarView = [[QXSeatHeaderView alloc] initWithFrame:CGRectMake(16, 0, 40, 40)];
[self.userAvatarView setHeadIcon:QXGlobal.shareGlobal.loginModel.avatar dress:@""];
[self addSubview:self.userAvatarView];
self.userNameLabel = [[UILabel alloc] initWithFrame:CGRectMake(self.userAvatarView.right+10, self.userAvatarView.top, 300, 40)];
self.userNameLabel.text = [NSString stringWithFormat:@"%@的爵位",QXGlobal.shareGlobal.loginModel.nickname];
self.userNameLabel.textColor = RGB16(0xF5E9D1);
self.userNameLabel.font = [UIFont systemFontOfSize:12];
[self addSubview:self.userNameLabel];
self.currentNobilityBgView = [[UIView alloc] initWithFrame:CGRectMake(16, self.userAvatarView.bottom+10, SCREEN_WIDTH-16*2, ScaleWidth(91))];
[self addSubview:self.currentNobilityBgView];
self.currentNobilityBgImageView = [[UIImageView alloc] initWithFrame:self.currentNobilityBgView.bounds];
self.currentNobilityBgImageView.image = [UIImage imageNamed:@"nobility_current_bg"];
[self.currentNobilityBgView addSubview:self.currentNobilityBgImageView];
self.currentNobilityLabel = [[UILabel alloc] init];
self.currentNobilityLabel.textColor = RGB16(0xA292FF);
self.currentNobilityLabel.font = [UIFont fontWithName:@"YouSheBiaoTiHei" size:34];
[self.currentNobilityBgView addSubview:self.currentNobilityLabel];
[self.currentNobilityLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(13);
make.top.mas_equalTo(6);
}];
self.buyBtn = [[UIButton alloc] init];
[self.buyBtn setImage:[UIImage imageNamed:@"nobility_buy"] forState:(UIControlStateNormal)];
[self.buyBtn addTarget:self action:@selector(buyAction) forControlEvents:(UIControlEventTouchUpInside)];
[self.currentNobilityBgView addSubview:self.buyBtn];
[self.buyBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.currentNobilityLabel.mas_right).offset(12);
make.width.mas_equalTo(ScaleWidth(60));
make.height.mas_equalTo(ScaleWidth(22));
make.centerY.equalTo(self.currentNobilityLabel);
}];
self.currentNobilityTimeLabel = [[UILabel alloc] init];
self.currentNobilityTimeLabel.textColor = RGB16(0xF5E9D1);
self.currentNobilityTimeLabel.font = [UIFont systemFontOfSize:12];
[self.currentNobilityBgView addSubview:self.currentNobilityTimeLabel];
[self.currentNobilityTimeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.currentNobilityLabel);
make.bottom.equalTo(self.currentNobilityBgView).offset(-12);
}];
self.openBtn = [[UIButton alloc] init];
[self.openBtn setImage:[UIImage imageNamed:@"nobility_open"] forState:(UIControlStateNormal)];
[self.openBtn addTarget:self action:@selector(openAction) forControlEvents:(UIControlEventTouchUpInside)];
[self.currentNobilityBgView addSubview:self.openBtn];
[self.openBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.currentNobilityBgView).offset(12);
make.width.mas_equalTo(ScaleWidth(113));
make.height.mas_equalTo(ScaleWidth(36));
make.top.mas_equalTo(17);
}];
self.currenNobilityImageView = [[UIImageView alloc] init];
[self addSubview:self.currenNobilityImageView];
[self.currenNobilityImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(-28);
make.height.width.mas_equalTo(ScaleWidth(104));
make.bottom.mas_equalTo(-34);
}];
self.compareImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"nobility_compare_top"]];
self.compareImageView.frame = CGRectMake(41, self.currentNobilityBgView.bottom+13, SCREEN_WIDTH-41*2, ScaleWidth(54));
self.compareImageView.contentMode = UIViewContentModeScaleToFill;
[self addSubview:self.compareImageView];
// self.currentNobilityLabel.text = @"骑士";
// self.currentNobilityTimeLabel.text = @"有效期剩余15天22小时";
[self setHaveNobility:NO];
}
-(void)setModel:(QXNobilityModel *)model{
_model = model;
[self.userAvatarView setHeadIcon:model.user_info.avatar dress:@""];
self.userNameLabel.text = [NSString stringWithFormat:@"%@的爵位",model.user_info.nickname];
if (model.nobility_info.status.intValue == 0) {
[self setHaveNobility:NO];
}else{
[self setHaveNobility:YES];
}
}
-(void)setHaveNobility:(BOOL)have{
self.openBtn.hidden = have;
self.buyBtn.hidden = !have;
self.currentNobilityLabel.hidden = !have;
self.currentNobilityLabel.text = self.model.nobility_info.name;
self.currentNobilityTimeLabel.text = have?[NSString stringWithFormat:@"截止时间:%@",self.model.nobility_info.end_time]:@"您尚未开通任何爵位";
}
-(void)openAction{
if (self.delegate && [self.delegate respondsToSelector:@selector(didOpenNobility)]) {
[self.delegate didOpenNobility];
}
}
-(void)buyAction{
if (self.delegate && [self.delegate respondsToSelector:@selector(didRenewNobility)]) {
[self.delegate didRenewNobility];
}
}
@end

View File

@@ -0,0 +1,16 @@
//
// QXNobilityPriceView.h
// QXLive
//
// Created by 启星 on 2025/11/8.
//
#import <UIKit/UIKit.h>
#import "QXNobilityGetPriceModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface QXNobilityPriceView : UIView
@property (nonatomic,strong)QXNobilityGetPriceModel *model;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,101 @@
//
// QXNobilityPriceView.m
// QXLive
//
// Created by on 2025/11/8.
//
#import "QXNobilityPriceView.h"
@interface QXNobilityPriceView()
@property (nonatomic,strong)UIImageView *bgImageView;
@property (nonatomic,strong)UILabel *titleLabel;
@property (nonatomic,strong)UILabel *timeLabel;
@property (nonatomic,strong)UILabel *priceLabel;
@property (nonatomic,strong)UILabel *originalPriceLabel;
@property (nonatomic,strong)UIImageView *currentNobilityImageView;
@end
@implementation QXNobilityPriceView
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initSubviews];
}
return self;
}
-(void)initSubviews{
self.bgImageView = [[UIImageView alloc] init];
self.bgImageView.backgroundColor = RGB16(0xFAF9D7);
[self.bgImageView addRoundedCornersWithRadius:8];
[self addSubview:self.bgImageView];;
[self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.mas_equalTo(16);
make.right.mas_equalTo(-16);
make.top.mas_equalTo(34);
make.bottom.equalTo(self);
}];
self.currentNobilityImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@""]];
[self addSubview:self.currentNobilityImageView];
[self.currentNobilityImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self);
make.right.equalTo(self.bgImageView.mas_right).offset(-34);
make.height.width.mas_equalTo(104);
}];
self.titleLabel = [[UILabel alloc] init];
self.titleLabel.textColor = RGB16(0x333333);
self.titleLabel.font = [UIFont fontWithName:@"YouSheBiaoTiHei" size:34];
[self addSubview:self.titleLabel];
[self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.bgImageView).offset(22);
make.top.equalTo(self.bgImageView).offset(18);
make.height.mas_equalTo(44);
}];
self.timeLabel = [[UILabel alloc] init];
self.timeLabel.textColor = RGB16A(0x000000, 0.65);
self.timeLabel.font = [UIFont systemFontOfSize:12];
[self addSubview:self.timeLabel];
[self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.titleLabel);
make.top.equalTo(self.titleLabel.mas_bottom);
}];
self.originalPriceLabel = [[UILabel alloc] init];
self.originalPriceLabel.textColor = RGB16(0x999999);
self.originalPriceLabel.font = [UIFont systemFontOfSize:14];
[self addSubview:self.originalPriceLabel];
[self.originalPriceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.height.mas_equalTo(20);
make.bottom.equalTo(self.bgImageView.mas_bottom);
}];
self.priceLabel = [[UILabel alloc] init];
self.priceLabel.textColor = RGB16(0xFF2727);
self.priceLabel.font = [UIFont systemFontOfSize:34];
[self addSubview:self.priceLabel];
[self.priceLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(self);
make.height.mas_equalTo(32);
make.bottom.equalTo(self.originalPriceLabel.mas_top);
}];
}
-(void)setModel:(QXNobilityGetPriceModel *)model{
_model = model;
[self.currentNobilityImageView sd_setImageWithURL:[NSURL URLWithString:model.nobility_image]];
self.titleLabel.text = model.nobility_name;
self.timeLabel.text = [NSString stringWithFormat:@"有效期:%@天",model.day];
NSString *price = [NSString stringWithFormat:@"¥%@",model.price];
NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:price];
[attr yy_setFont:[UIFont systemFontOfSize:18] range:NSMakeRange(0, 1)];
self.priceLabel.attributedText = attr;
NSAttributedString *at = [[NSString stringWithFormat:@"¥%@",model.pay_price] deleteLineWithTextColor:RGB16(0x999999) lineColor:RGB16(0x999999)];
self.originalPriceLabel.attributedText = at;
}
@end

View File

@@ -153,7 +153,7 @@
self.btnSwitch = [[UIButton alloc] init]; self.btnSwitch = [[UIButton alloc] init];
[self.btnSwitch setImage:[UIImage imageNamed:@"home_switch_off"] forState:(UIControlStateNormal)]; [self.btnSwitch setImage:[UIImage imageNamed:@"home_switch_off"] forState:(UIControlStateNormal)];
[self.btnSwitch setImage:[UIImage imageNamed:@"home_switch_on"] forState:(UIControlStateSelected)]; [self.btnSwitch setImage:[UIImage imageNamed:@"home_switch_on"] forState:(UIControlStateSelected)];
[self.btnSwitch addTarget:self action:@selector(btnSwitchAction:) forControlEvents:(UIControlEventTouchUpInside)]; // [self.btnSwitch addTarget:self action:@selector(btnSwitchAction:) forControlEvents:(UIControlEventTouchUpInside)];
[self.contentView addSubview:self.btnSwitch]; [self.contentView addSubview:self.btnSwitch];
[self.btnSwitch mas_makeConstraints:^(MASConstraintMaker *make) { [self.btnSwitch mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.mas_equalTo(-16); make.right.mas_equalTo(-16);
@@ -198,9 +198,9 @@
_needLine = needLine; _needLine = needLine;
self.lineView.hidden = !needLine; self.lineView.hidden = !needLine;
} }
- (void)btnSwitchAction:(UIButton *)sender { //- (void)btnSwitchAction:(UIButton *)sender {
sender.selected = !sender.selected; //// sender.selected = !sender.selected;
} //}
- (void)awakeFromNib { - (void)awakeFromNib {
[super awakeFromNib]; [super awakeFromNib];
// Initialization code // Initialization code

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_drif_join_room_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_drif_join_room_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_buy@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_buy@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_buy_right@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_buy_right@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_compare_top@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_compare_top@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_current_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_current_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 416 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_desc_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_desc_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -0,0 +1,21 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_detail_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_detail_bottom_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_detail_bottom_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_detail_open_btn@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_detail_open_btn@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_help_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_help_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_my_info_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_my_info_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_nav_icon@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_nav_icon@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_open@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_open@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_pay_result_successs@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_pay_result_successs@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,22 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "nobility_power_header_bg@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "nobility_power_header_bg@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Some files were not shown because too many files have changed in this diff Show More