From 68a610e0a8d0777851ce48f54d9934ac314af852 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Wed, 4 Feb 2026 12:33:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86kbpayvip?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- keyBoard.xcodeproj/project.pbxproj | 30 ++- keyBoard/Class/Home/V/HomeHeadView.m | 3 +- keyBoard/Class/Pay/V/KBVipPayHeaderView.m | 75 +------ .../Class/Pay/V/PagingViewTableHeaderView.h | 15 ++ .../Class/Pay/V/PagingViewTableHeaderView.m | 88 ++++++++ keyBoard/Class/Pay/VC/KBPayMainVC.h | 16 ++ keyBoard/Class/Pay/VC/KBPayMainVC.m | 210 ++++++++++++++++++ keyBoard/Class/Pay/VC/KBPaySvipVC.h | 17 ++ keyBoard/Class/Pay/VC/KBPaySvipVC.m | 58 +++++ keyBoard/Class/Pay/VC/KBVipPay.h | 3 +- keyBoard/Class/Pay/VC/KBVipPay.m | 55 ++--- 11 files changed, 470 insertions(+), 100 deletions(-) create mode 100644 keyBoard/Class/Pay/V/PagingViewTableHeaderView.h create mode 100644 keyBoard/Class/Pay/V/PagingViewTableHeaderView.m create mode 100644 keyBoard/Class/Pay/VC/KBPayMainVC.h create mode 100644 keyBoard/Class/Pay/VC/KBPayMainVC.m create mode 100644 keyBoard/Class/Pay/VC/KBPaySvipVC.h create mode 100644 keyBoard/Class/Pay/VC/KBPaySvipVC.m diff --git a/keyBoard.xcodeproj/project.pbxproj b/keyBoard.xcodeproj/project.pbxproj index f2745d5..4e846f8 100644 --- a/keyBoard.xcodeproj/project.pbxproj +++ b/keyBoard.xcodeproj/project.pbxproj @@ -229,8 +229,6 @@ 04E038E92F20E877002CA5A0 /* DeepgramStreamingManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E038E52F20E877002CA5A0 /* DeepgramStreamingManager.m */; }; 04E038EF2F21F0EC002CA5A0 /* AiVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E038EE2F21F0EC002CA5A0 /* AiVM.m */; }; 04E0394B2F236E75002CA5A0 /* KBChatUserMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E0394A2F236E75002CA5A0 /* KBChatUserMessageCell.m */; }; - 0F2A10032F3C0001002CA5A0 /* KBChatMessageActionPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F2A10022F3C0001002CA5A0 /* KBChatMessageActionPopView.m */; }; - 0F2A10132F3C0002002CA5A0 /* KBAIPersonaSidebarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F2A10122F3C0002002CA5A0 /* KBAIPersonaSidebarView.m */; }; 04E0394C2F236E75002CA5A0 /* KBChatTimeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E039482F236E75002CA5A0 /* KBChatTimeCell.m */; }; 04E0394D2F236E75002CA5A0 /* KBChatAssistantMessageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E039432F236E75002CA5A0 /* KBChatAssistantMessageCell.m */; }; 04E0394E2F236E75002CA5A0 /* KBChatTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E039452F236E75002CA5A0 /* KBChatTableView.m */; }; @@ -240,6 +238,9 @@ 04E0B2022F300002002CA5A0 /* KBVoiceRecordManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E0B2012F300002002CA5A0 /* KBVoiceRecordManager.m */; }; 04E161832F10E6470022C23B /* normal_hei_them.zip in Resources */ = {isa = PBXBuildFile; fileRef = 04E161812F10E6470022C23B /* normal_hei_them.zip */; }; 04E161842F10E6470022C23B /* normal_them.zip in Resources */ = {isa = PBXBuildFile; fileRef = 04E161822F10E6470022C23B /* normal_them.zip */; }; + 04F4C0AA2F32274000E8F08C /* KBPayMainVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 04F4C0A92F32274000E8F08C /* KBPayMainVC.m */; }; + 04F4C0AD2F32288600E8F08C /* KBPaySvipVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 04F4C0AC2F32288600E8F08C /* KBPaySvipVC.m */; }; + 04F4C0B02F322EF200E8F08C /* PagingViewTableHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04F4C0AF2F322EF200E8F08C /* PagingViewTableHeaderView.m */; }; 04FC95672EB0546C007BD342 /* KBKey.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC95652EB0546C007BD342 /* KBKey.m */; }; 04FC956A2EB05497007BD342 /* KBKeyButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC95692EB05497007BD342 /* KBKeyButton.m */; }; 04FC956D2EB054B7007BD342 /* KBKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC956C2EB054B7007BD342 /* KBKeyboardView.m */; }; @@ -273,6 +274,8 @@ 04FEDC422F00040000999999 /* KBKeyboardSubscriptionFeatureMarqueeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FEDC412F00040000999999 /* KBKeyboardSubscriptionFeatureMarqueeView.m */; }; 05A1B2D12F5B1A2B3C4D5E60 /* KBSearchVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 05A1B2C52F5B1A2B3C4D5E60 /* KBSearchVM.m */; }; 05A1B2D22F5B1A2B3C4D5E60 /* KBSearchThemeModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 05A1B2C72F5B1A2B3C4D5E60 /* KBSearchThemeModel.m */; }; + 0F2A10032F3C0001002CA5A0 /* KBChatMessageActionPopView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F2A10022F3C0001002CA5A0 /* KBChatMessageActionPopView.m */; }; + 0F2A10132F3C0002002CA5A0 /* KBAIPersonaSidebarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F2A10122F3C0002002CA5A0 /* KBAIPersonaSidebarView.m */; }; 471CAD3574798685B72ADD55 /* KBMyTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 180D662EC4DB3A7FFF83FF18 /* KBMyTheme.m */; }; 49B63DBAEE9076C591E13D68 /* KBShopThemeTagModel.m in Sources */ = {isa = PBXBuildFile; fileRef = E2A844CD2D8584596DBE6316 /* KBShopThemeTagModel.m */; }; 550CB2630FA4A7B4B9782EFA /* KBMyTheme.m in Sources */ = {isa = PBXBuildFile; fileRef = 180D662EC4DB3A7FFF83FF18 /* KBMyTheme.m */; }; @@ -564,8 +567,6 @@ 048FFD1C2F277486005D62AE /* KBChatHistoryPageModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBChatHistoryPageModel.m; sourceTree = ""; }; 048FFD222F28A836005D62AE /* KBChatLimitPopView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBChatLimitPopView.h; sourceTree = ""; }; 048FFD232F28A836005D62AE /* KBChatLimitPopView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBChatLimitPopView.m; sourceTree = ""; }; - 0F2A10112F3C0002002CA5A0 /* KBAIPersonaSidebarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBAIPersonaSidebarView.h; sourceTree = ""; }; - 0F2A10122F3C0002002CA5A0 /* KBAIPersonaSidebarView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBAIPersonaSidebarView.m; sourceTree = ""; }; 048FFD252F28C6CF005D62AE /* KBImagePositionButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBImagePositionButton.h; sourceTree = ""; }; 048FFD262F28C6CF005D62AE /* KBImagePositionButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBImagePositionButton.m; sourceTree = ""; }; 048FFD282F28E99A005D62AE /* KBCommentModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCommentModel.h; sourceTree = ""; }; @@ -724,8 +725,6 @@ 04E039482F236E75002CA5A0 /* KBChatTimeCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBChatTimeCell.m; sourceTree = ""; }; 04E039492F236E75002CA5A0 /* KBChatUserMessageCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBChatUserMessageCell.h; sourceTree = ""; }; 04E0394A2F236E75002CA5A0 /* KBChatUserMessageCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBChatUserMessageCell.m; sourceTree = ""; }; - 0F2A10012F3C0001002CA5A0 /* KBChatMessageActionPopView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBChatMessageActionPopView.h; sourceTree = ""; }; - 0F2A10022F3C0001002CA5A0 /* KBChatMessageActionPopView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBChatMessageActionPopView.m; sourceTree = ""; }; 04E039502F2387D2002CA5A0 /* KBAiChatMessage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBAiChatMessage.h; sourceTree = ""; }; 04E039512F2387D2002CA5A0 /* KBAiChatMessage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBAiChatMessage.m; sourceTree = ""; }; 04E0B1002F300001002CA5A0 /* KBVoiceToTextManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBVoiceToTextManager.h; sourceTree = ""; }; @@ -734,6 +733,12 @@ 04E0B2012F300002002CA5A0 /* KBVoiceRecordManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBVoiceRecordManager.m; sourceTree = ""; }; 04E161812F10E6470022C23B /* normal_hei_them.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = normal_hei_them.zip; sourceTree = ""; }; 04E161822F10E6470022C23B /* normal_them.zip */ = {isa = PBXFileReference; lastKnownFileType = archive.zip; path = normal_them.zip; sourceTree = ""; }; + 04F4C0A82F32274000E8F08C /* KBPayMainVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBPayMainVC.h; sourceTree = ""; }; + 04F4C0A92F32274000E8F08C /* KBPayMainVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBPayMainVC.m; sourceTree = ""; }; + 04F4C0AB2F32288600E8F08C /* KBPaySvipVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBPaySvipVC.h; sourceTree = ""; }; + 04F4C0AC2F32288600E8F08C /* KBPaySvipVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBPaySvipVC.m; sourceTree = ""; }; + 04F4C0AE2F322EF200E8F08C /* PagingViewTableHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PagingViewTableHeaderView.h; sourceTree = ""; }; + 04F4C0AF2F322EF200E8F08C /* PagingViewTableHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PagingViewTableHeaderView.m; sourceTree = ""; }; 04FC953A2EAFAE56007BD342 /* KeyBoardPrefixHeader.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeyBoardPrefixHeader.pch; sourceTree = ""; }; 04FC95642EB0546C007BD342 /* KBKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBKey.h; sourceTree = ""; }; 04FC95652EB0546C007BD342 /* KBKey.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBKey.m; sourceTree = ""; }; @@ -803,6 +808,10 @@ 05A1B2C52F5B1A2B3C4D5E60 /* KBSearchVM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBSearchVM.m; sourceTree = ""; }; 05A1B2C62F5B1A2B3C4D5E60 /* KBSearchThemeModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBSearchThemeModel.h; sourceTree = ""; }; 05A1B2C72F5B1A2B3C4D5E60 /* KBSearchThemeModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBSearchThemeModel.m; sourceTree = ""; }; + 0F2A10012F3C0001002CA5A0 /* KBChatMessageActionPopView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBChatMessageActionPopView.h; sourceTree = ""; }; + 0F2A10022F3C0001002CA5A0 /* KBChatMessageActionPopView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBChatMessageActionPopView.m; sourceTree = ""; }; + 0F2A10112F3C0002002CA5A0 /* KBAIPersonaSidebarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBAIPersonaSidebarView.h; sourceTree = ""; }; + 0F2A10122F3C0002002CA5A0 /* KBAIPersonaSidebarView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBAIPersonaSidebarView.m; sourceTree = ""; }; 180D662EC4DB3A7FFF83FF18 /* KBMyTheme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBMyTheme.m; sourceTree = ""; }; 2C1092FB2B452F95B15D4263 /* Pods_CustomKeyboard.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_CustomKeyboard.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 35E2B1C590E060D912A4E7F4 /* KBShopThemeTagModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBShopThemeTagModel.h; sourceTree = ""; }; @@ -957,6 +966,8 @@ 04122FAF2EC73C0100EF7AB3 /* KBVipReviewItemCell.m */, 04122FB12EC73C0100EF7AB3 /* KBVipReviewListCell.h */, 04122FB22EC73C0100EF7AB3 /* KBVipReviewListCell.m */, + 04F4C0AE2F322EF200E8F08C /* PagingViewTableHeaderView.h */, + 04F4C0AF2F322EF200E8F08C /* PagingViewTableHeaderView.m */, ); path = V; sourceTree = ""; @@ -968,6 +979,10 @@ 04122F802EC5FC6F00EF7AB3 /* KBJfPay.m */, 04122F8F2EC73AF700EF7AB3 /* KBVipPay.h */, 04122F902EC73AF700EF7AB3 /* KBVipPay.m */, + 04F4C0A82F32274000E8F08C /* KBPayMainVC.h */, + 04F4C0A92F32274000E8F08C /* KBPayMainVC.m */, + 04F4C0AB2F32288600E8F08C /* KBPaySvipVC.h */, + 04F4C0AC2F32288600E8F08C /* KBPaySvipVC.m */, ); path = VC; sourceTree = ""; @@ -2418,6 +2433,7 @@ 04122F622EC5F41D00EF7AB3 /* KBUser.m in Sources */, 04122F8B2EC6F7C800EF7AB3 /* IAPVerifyTransactionObj.m in Sources */, 04B5A1A22EEFA12300AAAAAA /* KBPayProductModel.m in Sources */, + 04F4C0AD2F32288600E8F08C /* KBPaySvipVC.m in Sources */, 046086D62F1A093400757C95 /* KBAICommentInputView.m in Sources */, 046086D72F1A093400757C95 /* KBAICommentFooterView.m in Sources */, 046086D82F1A093400757C95 /* KBAIReplyCell.m in Sources */, @@ -2487,6 +2503,7 @@ 048908E92EBF843000FABA60 /* KBSkinDetailHeaderCell.m in Sources */, 04A9FE1B2EB892460020DB6D /* KBLocalizationManager.m in Sources */, 048908BC2EBE1FCB00FABA60 /* BaseViewController.m in Sources */, + 04F4C0B02F322EF200E8F08C /* PagingViewTableHeaderView.m in Sources */, 0498BD902EE6A3BD006CC1D5 /* KBMyMainModel.m in Sources */, A1F0C1C32FABCDEF12345678 /* KBInviteCodeModel.m in Sources */, A1F0C1D32FACAD0012345678 /* KBMaiPointReporter.m in Sources */, @@ -2530,6 +2547,7 @@ 04FC95DD2EB202A3007BD342 /* KBGuideVC.m in Sources */, 04FC95E52EB220B5007BD342 /* UIColor+Extension.m in Sources */, 048908E02EBF73DC00FABA60 /* MySkinVC.m in Sources */, + 04F4C0AA2F32274000E8F08C /* KBPayMainVC.m in Sources */, 048FFD362F29F88E005D62AE /* AIMessageVM.m in Sources */, 048908F22EC047FD00FABA60 /* KBShopHeadView.m in Sources */, 0498BD742EE02E3D006CC1D5 /* KBRegistVerEmailVC.m in Sources */, diff --git a/keyBoard/Class/Home/V/HomeHeadView.m b/keyBoard/Class/Home/V/HomeHeadView.m index e9e7759..3a5ef8c 100644 --- a/keyBoard/Class/Home/V/HomeHeadView.m +++ b/keyBoard/Class/Home/V/HomeHeadView.m @@ -9,6 +9,7 @@ #import "UIImage+KBColor.h" #import "KBTopImageButton.h" #import "KBVipPay.h" +#import "KBPayMainVC.h" @interface HomeHeadView() @@ -174,7 +175,7 @@ [[KBUserSessionManager shared] goLoginVC]; return; } - KBVipPay *vc = [[KBVipPay alloc] init]; + KBPayMainVC *vc = [[KBPayMainVC alloc] init]; [KB_CURRENT_NAV pushViewController:vc animated:true]; } diff --git a/keyBoard/Class/Pay/V/KBVipPayHeaderView.m b/keyBoard/Class/Pay/V/KBVipPayHeaderView.m index 3d73c90..6f5e948 100644 --- a/keyBoard/Class/Pay/V/KBVipPayHeaderView.m +++ b/keyBoard/Class/Pay/V/KBVipPayHeaderView.m @@ -11,10 +11,10 @@ // 容器(为了便于以 KB_NAV_TOTAL_HEIGHT 作为内容起点) @property (nonatomic, strong) UIView *containerView; // 顶部大图:pay_vip_icon -@property (nonatomic, strong) UIImageView *vipImageView; -@property (nonatomic, strong) UIImageView *wanImageView; -@property (nonatomic, strong) UILabel *titleLabel; -@property (nonatomic, strong) UILabel *desLabel; +//@property (nonatomic, strong) UIImageView *vipImageView; +//@property (nonatomic, strong) UIImageView *wanImageView; +//@property (nonatomic, strong) UILabel *titleLabel; +//@property (nonatomic, strong) UILabel *desLabel; // 功能图标四宫格 @property (nonatomic, strong) UIImageView *aiImageView; @@ -34,32 +34,6 @@ make.edges.equalTo(self); }]; - // 1. 顶部大图(略微下移,避开自定义导航栏) - [self.containerView addSubview:self.vipImageView]; - [self.vipImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.right.left.equalTo(self.containerView).inset(KBFit(27)); - make.top.equalTo(self.containerView).offset(KB_NAV_TOTAL_HEIGHT + 25); - make.height.mas_equalTo((269)); - }]; - [self.containerView addSubview:self.wanImageView]; - [self.wanImageView mas_makeConstraints:^(MASConstraintMaker *make) { - make.right.left.equalTo(self.containerView); - make.top.equalTo(self.vipImageView).offset(70); - make.bottom.equalTo(self.containerView).offset(-16); - }]; - - [self.containerView addSubview:self.titleLabel]; - [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.equalTo(self.containerView); - make.top.equalTo(self.wanImageView).offset(53); - }]; - [self.containerView addSubview:self.desLabel]; - [self.desLabel mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerX.equalTo(self.containerView); - make.top.equalTo(self.titleLabel.mas_bottom).offset(10); - }]; - - // 2. 下方四宫格图标(简单示意) UIView *g1 = [self gridItemWithImageView:self.aiImageView]; UIView *g2 = [self gridItemWithImageView:self.keyboardImageView]; @@ -72,12 +46,12 @@ CGFloat spacing = 16; [g1 mas_makeConstraints:^(MASConstraintMaker *make) { - make.left.equalTo(self.vipImageView); - make.top.equalTo(self.desLabel.mas_bottom).offset(18); + make.left.equalTo(self.containerView).inset(KBFit(27)); + make.top.equalTo(self.containerView).offset(KB_NAV_TOTAL_HEIGHT + 25); make.height.mas_equalTo(((KBFit(122)))); }]; [g2 mas_makeConstraints:^(MASConstraintMaker *make) { - make.right.equalTo(self.vipImageView); + make.right.equalTo(self.containerView).inset(KBFit(27)); make.top.equalTo(g1); make.height.equalTo(g1); make.left.equalTo(g1.mas_right).offset(spacing); @@ -90,7 +64,7 @@ make.width.equalTo(g1); }]; [g4 mas_makeConstraints:^(MASConstraintMaker *make) { - make.right.equalTo(self.vipImageView); + make.right.equalTo(g2); make.top.equalTo(g3); make.left.equalTo(g3.mas_right).offset(spacing); make.height.equalTo(g1); @@ -144,21 +118,7 @@ return _containerView; } -- (UIImageView *)vipImageView { - if (!_vipImageView) { - _vipImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_vip_icon"]]; - _vipImageView.contentMode = UIViewContentModeScaleAspectFill; - } - return _vipImageView; -} -- (UIImageView *)wanImageView { - if (!_wanImageView) { - _wanImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_wanwhite_icon"]]; - _wanImageView.contentMode = UIViewContentModeScaleAspectFill; - } - return _wanImageView; -} - (UIImageView *)aiImageView { if (!_aiImageView) { @@ -190,23 +150,4 @@ } -- (UILabel *)titleLabel{ - if (!_titleLabel) { - _titleLabel = [[UILabel alloc] init]; - _titleLabel.text = @"Become a member of LOVE KEY"; - _titleLabel.textColor = [UIColor colorWithHex:KBBlackValue]; - _titleLabel.font = [KBFont bold:18]; - } - return _titleLabel; -} -- (UILabel *)desLabel{ - if (!_desLabel) { - _desLabel = [[UILabel alloc] init]; - _desLabel.text = @"Unlock all functions"; - _desLabel.textColor = [UIColor colorWithHex:KBBlackValue]; - _desLabel.font = [KBFont medium:14]; - } - return _desLabel; -} - @end diff --git a/keyBoard/Class/Pay/V/PagingViewTableHeaderView.h b/keyBoard/Class/Pay/V/PagingViewTableHeaderView.h new file mode 100644 index 0000000..4545242 --- /dev/null +++ b/keyBoard/Class/Pay/V/PagingViewTableHeaderView.h @@ -0,0 +1,15 @@ +// +// PagingViewTableHeaderView.h +// JXCategoryView +// +// Created by jiaxin on 2018/8/27. +// Copyright © 2018年 jiaxin. All rights reserved. +// + +#import + +@interface PagingViewTableHeaderView : UIView + +- (void)scrollViewDidScroll:(CGFloat)contentOffsetY; + +@end diff --git a/keyBoard/Class/Pay/V/PagingViewTableHeaderView.m b/keyBoard/Class/Pay/V/PagingViewTableHeaderView.m new file mode 100644 index 0000000..868502e --- /dev/null +++ b/keyBoard/Class/Pay/V/PagingViewTableHeaderView.m @@ -0,0 +1,88 @@ +// +// PagingViewTableHeaderView.m +// JXCategoryView +// +// Created by jiaxin on 2018/8/27. +// Copyright © 2018年 jiaxin. All rights reserved. +// + +#import "PagingViewTableHeaderView.h" + +@interface PagingViewTableHeaderView() +@property (nonatomic, strong) UIImageView *bgImageView; // 全屏背景图 +@property (nonatomic, strong) UIImageView *vipImageView; +@property (nonatomic, strong) UIImageView *wanImageView; +@end + +@implementation PagingViewTableHeaderView + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + self.bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_vipbg_icon"]]; + self.bgImageView.contentMode = UIViewContentModeScaleAspectFill; + self.bgImageView.clipsToBounds = true; + [self addSubview:self.bgImageView]; + [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.right.equalTo(self); + make.height.mas_equalTo(224); + }]; + [self.bgImageView addSubview:self.vipImageView]; + [self.vipImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.left.equalTo(self.bgImageView).inset(KBFit(27)); + make.top.equalTo(self.bgImageView).offset(KB_NAV_TOTAL_HEIGHT + 25); + make.height.mas_equalTo((269)); + }]; + [self.bgImageView addSubview:self.wanImageView]; + [self.wanImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.left.equalTo(self.bgImageView); + make.top.equalTo(self.bgImageView.mas_bottom).offset(-48); + make.height.mas_equalTo(391); + }]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + +} + +- (void)scrollViewDidScroll:(CGFloat)contentOffsetY { + +} + +//- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { +// CGFloat targetWidth = layoutAttributes.size.width > 0 ? layoutAttributes.size.width : KB_SCREEN_WIDTH; +// // 先把自身宽度设为目标宽,便于系统计算高度 +// self.bounds = CGRectMake(0, 0, targetWidth, self.bounds.size.height); +// [self setNeedsLayout]; +// [self layoutIfNeeded]; +// CGSize fit = [self systemLayoutSizeFittingSize:CGSizeMake(targetWidth, UILayoutFittingCompressedSize.height) +// withHorizontalFittingPriority:UILayoutPriorityRequired +// verticalFittingPriority:UILayoutPriorityFittingSizeLevel]; +// CGRect f = layoutAttributes.frame; +// f.size.height = ceil(fit.height); +// layoutAttributes.frame = f; +// return layoutAttributes; +//} + + +- (UIImageView *)vipImageView { + if (!_vipImageView) { + _vipImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_vip_icon"]]; + _vipImageView.contentMode = UIViewContentModeScaleAspectFill; + } + return _vipImageView; +} + +- (UIImageView *)wanImageView { + if (!_wanImageView) { + _wanImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_wanwhite_icon"]]; + _wanImageView.contentMode = UIViewContentModeScaleAspectFill; + } + return _wanImageView; +} + +@end diff --git a/keyBoard/Class/Pay/VC/KBPayMainVC.h b/keyBoard/Class/Pay/VC/KBPayMainVC.h new file mode 100644 index 0000000..20ab5ba --- /dev/null +++ b/keyBoard/Class/Pay/VC/KBPayMainVC.h @@ -0,0 +1,16 @@ +// +// KBPayMainVC.h +// keyBoard +// +// Created by Mac on 2026/2/3. +// + +#import "BaseViewController.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface KBPayMainVC : BaseViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/keyBoard/Class/Pay/VC/KBPayMainVC.m b/keyBoard/Class/Pay/VC/KBPayMainVC.m new file mode 100644 index 0000000..70eff36 --- /dev/null +++ b/keyBoard/Class/Pay/VC/KBPayMainVC.m @@ -0,0 +1,210 @@ +// +// KBPayMainVC.m +// keyBoard +// +// Created by Mac on 2026/2/3. +// + +#import "KBPayMainVC.h" +#import "JXPagerView.h" +#import "KBShopHeadView.h" +#import +#import "KBCategoryTitleView.h" +#import +#import +//#import "KBShopItemVC.h" +#import "KBVipPay.h" +#import "KBPaySvipVC.h" + + +#import "KBSearchVC.h" +#import "MySkinVC.h" + +#import "JXPagerView.h" +#import "PagingViewTableHeaderView.h" +#import "JXCategoryTitleView.h" + +static const CGFloat JXTableHeaderViewHeight = 224; +static const CGFloat JXheightForHeaderInSection = 50; + +@interface KBPayMainVC () +@property (nonatomic, strong) JXPagerView *pagerView; +@property (nonatomic, strong) PagingViewTableHeaderView *userHeaderView; +@property (nonatomic, strong, readonly) JXCategoryTitleView *categoryView; +@property (nonatomic, assign) BOOL isNeedFooter; +@property (nonatomic, assign) BOOL isNeedHeader; +- (JXPagerView *)preferredPagingView; +@property (nonatomic, strong) NSArray *titles; +@property (nonatomic, strong) UIView *naviBGView; +@property (nonatomic, strong) UIButton *closeButton; // 当前选中的方案索引 + +@end + +@implementation KBPayMainVC + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.backgroundColor = [UIColor whiteColor]; + self.navigationController.navigationBar.translucent = false; + self.edgesForExtendedLayout = UIRectEdgeNone; +// self.kb_navView.hidden = true; + _titles = @[@"VIP", @"SVIP"]; + + _userHeaderView = [[PagingViewTableHeaderView alloc] init]; + + _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, JXheightForHeaderInSection)]; + self.categoryView.titles = self.titles; + self.categoryView.backgroundColor = [UIColor whiteColor]; + self.categoryView.delegate = self; + self.categoryView.titleSelectedColor = [UIColor colorWithRed:105/255.0 green:144/255.0 blue:239/255.0 alpha:1]; + self.categoryView.titleColor = [UIColor blackColor]; + self.categoryView.titleColorGradientEnabled = YES; + self.categoryView.titleLabelZoomEnabled = YES; + self.categoryView.contentScrollViewClickTransitionAnimationEnabled = NO; + + JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init]; + lineView.indicatorColor = [UIColor colorWithRed:105/255.0 green:144/255.0 blue:239/255.0 alpha:1]; + lineView.indicatorWidth = 30; + self.categoryView.indicators = @[lineView]; + + _pagerView = [self preferredPagingView]; + self.pagerView.mainTableView.gestureDelegate = self; + [self.view addSubview:self.pagerView]; + + self.categoryView.listContainer = (id)self.pagerView.listContainerView; + + //导航栏隐藏的情况,处理扣边返回,下面的代码要加上 +// [self.pagerView.listContainerView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:self.navigationController.interactivePopGestureRecognizer]; +// [self.pagerView.mainTableView.panGestureRecognizer requireGestureRecognizerToFail:self.navigationController.interactivePopGestureRecognizer]; + + self.automaticallyAdjustsScrollViewInsets = NO; + CGFloat naviHeight = KB_NAV_TOTAL_HEIGHT; + self.pagerView.pinSectionHeaderVerticalOffset = naviHeight; + + self.naviBGView = [[UIView alloc] init]; + self.naviBGView.alpha = 0; + self.naviBGView.backgroundColor = [UIColor whiteColor]; + self.naviBGView.frame = CGRectMake(0, 0, self.view.bounds.size.width, naviHeight); + [self.view addSubview:self.naviBGView]; + + UILabel *naviTitleLabel = [[UILabel alloc] init]; + naviTitleLabel.text = @"导航栏隐藏"; + naviTitleLabel.textAlignment = NSTextAlignmentCenter; + naviTitleLabel.frame = CGRectMake(0, KB_STATUSBAR_HEIGHT, self.view.bounds.size.width, 44); + [self.naviBGView addSubview:naviTitleLabel]; + +// UIButton *back = [UIButton buttonWithType:UIButtonTypeSystem]; +// [back setTitle:@"返回" forState:UIControlStateNormal]; +// back.frame = CGRectMake(12, KB_STATUSBAR_HEIGHT, 44, 44); +// [back addTarget:self action:@selector(backButtonClicked:) forControlEvents:UIControlEventTouchUpInside]; +// [self.naviBGView addSubview:back]; + + [self.view addSubview:self.closeButton]; + [self.closeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.view).offset(KB_NAV_TOTAL_HEIGHT - 30); + make.left.equalTo(self.view).offset(15); + make.width.height.mas_equalTo(36); + }]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + + self.navigationController.interactivePopGestureRecognizer.enabled = (self.categoryView.selectedIndex == 0); +} + +- (void)viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + + self.navigationController.interactivePopGestureRecognizer.enabled = YES; +} + +- (JXPagerView *)preferredPagingView { + return [[JXPagerView alloc] initWithDelegate:self]; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + + self.pagerView.frame = self.view.bounds; +} + +#pragma mark - JXPagerViewDelegate + +- (UIView *)tableHeaderViewInPagerView:(JXPagerView *)pagerView { + return self.userHeaderView; +} + +- (NSUInteger)tableHeaderViewHeightInPagerView:(JXPagerView *)pagerView { + return JXTableHeaderViewHeight; +} + +- (NSUInteger)heightForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { + return JXheightForHeaderInSection; +} + +- (UIView *)viewForPinSectionHeaderInPagerView:(JXPagerView *)pagerView { + return self.categoryView; +} + +- (NSInteger)numberOfListsInPagerView:(JXPagerView *)pagerView { + //和categoryView的item数量一致 + return self.categoryView.titles.count; +} + +- (id)pagerView:(JXPagerView *)pagerView initListAtIndex:(NSInteger)index { + if (index == 0) { + KBVipPay *list = [[KBVipPay alloc] init]; + return list; + + } + KBPaySvipVC *list = [[KBPaySvipVC alloc] init]; + + return list; +} + +#pragma mark - JXCategoryViewDelegate + +- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index { + self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0); +} + +#pragma mark - JXPagerMainTableViewGestureDelegate + +- (BOOL)mainTableViewGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { + //禁止categoryView左右滑动的时候,上下和左右都可以滚动 + if (otherGestureRecognizer == self.categoryView.collectionView.panGestureRecognizer) { + return NO; + } + return [gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && [otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; +} + +- (void)pagerView:(JXPagerView *)pagerView mainTableViewDidScroll:(UIScrollView *)scrollView { + CGFloat thresholdDistance = 100; + CGFloat percent = scrollView.contentOffset.y/thresholdDistance; + percent = MAX(0, MIN(1, percent)); + self.naviBGView.alpha = percent; +} + + +#pragma mark - Action +- (void)onTapClose{ + [[KBMaiPointReporter sharedReporter] reportClickWithEventName:@"click_vip_close_btn" + pageId:@"vip_pay" + elementId:@"close_btn" + extra:nil + completion:nil]; + [self.navigationController popViewControllerAnimated:true]; +} + +#pragma mark - lazy +- (UIButton *)closeButton { + if (!_closeButton) { + _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_closeButton setImage:[UIImage imageNamed:@"close_white2_icon"] forState:UIControlStateNormal]; + [_closeButton addTarget:self action:@selector(onTapClose) forControlEvents:UIControlEventTouchUpInside]; + } + return _closeButton; +} +@end diff --git a/keyBoard/Class/Pay/VC/KBPaySvipVC.h b/keyBoard/Class/Pay/VC/KBPaySvipVC.h new file mode 100644 index 0000000..493a27a --- /dev/null +++ b/keyBoard/Class/Pay/VC/KBPaySvipVC.h @@ -0,0 +1,17 @@ +// +// KBPaySvipVC.h +// keyBoard +// +// Created by Mac on 2026/2/3. +// + +#import "BaseViewController.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface KBPaySvipVC : UIViewController + +@end + +NS_ASSUME_NONNULL_END diff --git a/keyBoard/Class/Pay/VC/KBPaySvipVC.m b/keyBoard/Class/Pay/VC/KBPaySvipVC.m new file mode 100644 index 0000000..598fdb9 --- /dev/null +++ b/keyBoard/Class/Pay/VC/KBPaySvipVC.m @@ -0,0 +1,58 @@ +// +// KBPaySvipVC.m +// keyBoard +// +// Created by Mac on 2026/2/3. +// + +#import "KBPaySvipVC.h" + +@interface KBPaySvipVC () +@property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); +@property (nonatomic, strong) UICollectionView *collectionView; +@end + +@implementation KBPaySvipVC + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view. + // 懒加载 collectionView,并添加到视图 + [self.view addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.view); // mas 布局:铺满 + }]; +} + +#pragma mark - UIScrollView Delegate(转发给分页容器) +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + !self.scrollCallback ?: self.scrollCallback(scrollView); +} + +#pragma mark - JXPagingViewListViewDelegate +- (UIView *)listView { return self.view; } +- (UIScrollView *)listScrollView { return self.collectionView; } +- (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback { self.scrollCallback = callback; } +- (void)listWillAppear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } +- (void)listDidAppear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } +- (void)listWillDisappear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } +- (void)listDidDisappear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } + + +#pragma mark - Lazy +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new]; + layout.scrollDirection = UICollectionViewScrollDirectionVertical; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.backgroundColor = [UIColor clearColor]; +// _collectionView.dataSource = self; +// _collectionView.delegate = self; + // 注册皮肤卡片 cell +// [_collectionView registerClass:KBSkinCardCell.class forCellWithReuseIdentifier:@"KBSkinCardCell"]; // 复用标识 + } + return _collectionView; +} + + +@end diff --git a/keyBoard/Class/Pay/VC/KBVipPay.h b/keyBoard/Class/Pay/VC/KBVipPay.h index c5d254e..d4a4b2b 100644 --- a/keyBoard/Class/Pay/VC/KBVipPay.h +++ b/keyBoard/Class/Pay/VC/KBVipPay.h @@ -6,11 +6,12 @@ // #import +#import NS_ASSUME_NONNULL_BEGIN /// VIP 订阅页(整体使用 UICollectionView,上下滚动) -@interface KBVipPay : BaseViewController +@interface KBVipPay : BaseViewController /// 通过键盘深链配置初始商品及是否自动发起购买 - (void)configureWithProductId:(nullable NSString *)productId diff --git a/keyBoard/Class/Pay/VC/KBVipPay.m b/keyBoard/Class/Pay/VC/KBVipPay.m index 9d91517..e4c6662 100644 --- a/keyBoard/Class/Pay/VC/KBVipPay.m +++ b/keyBoard/Class/Pay/VC/KBVipPay.m @@ -20,10 +20,11 @@ static NSString * const kKBVipSubscribeCellId = @"kKBVipSubscribeCellId"; static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; @interface KBVipPay () +@property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView); + @property (nonatomic, strong) UICollectionView *collectionView; // 主列表(竖向滚动) @property (nonatomic, strong) NSArray *plans; // 订阅方案数组 @property (nonatomic, assign) NSInteger selectedIndex; // 当前选中的方案索引 -@property (nonatomic, strong) UIButton *closeButton; // 当前选中的方案索引 @property (nonatomic, strong) UIButton *restoreButton; @property (nonatomic, strong) UIImageView *bgImageView; // 全屏背景图 // Header 自适应测量 @@ -90,16 +91,10 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; make.top.equalTo(self.view).offset(0); make.bottom.equalTo(self.payButton.mas_top).offset(-16); }]; - [self.view addSubview:self.closeButton]; - [self.closeButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.top.equalTo(self.view).offset(KB_NAV_TOTAL_HEIGHT - 30); - make.left.equalTo(self.view).offset(15); - make.width.height.mas_equalTo(36); - }]; + [self.view addSubview:self.restoreButton]; [self.restoreButton mas_makeConstraints:^(MASConstraintMaker *make) { - make.centerY.equalTo(self.closeButton); - make.right.equalTo(self.view).offset(-15); + make.top.equalTo(self.view).offset(KB_NAV_TOTAL_HEIGHT - 30); make.right.equalTo(self.view).offset(-15); make.width.mas_equalTo(123); make.height.mas_equalTo(32); }]; @@ -292,14 +287,14 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; } #pragma mark - Action -- (void)onTapClose{ - [[KBMaiPointReporter sharedReporter] reportClickWithEventName:@"click_vip_close_btn" - pageId:@"vip_pay" - elementId:@"close_btn" - extra:nil - completion:nil]; - [self.navigationController popViewControllerAnimated:true]; -} +//- (void)onTapClose{ +// [[KBMaiPointReporter sharedReporter] reportClickWithEventName:@"click_vip_close_btn" +// pageId:@"vip_pay" +// elementId:@"close_btn" +// extra:nil +// completion:nil]; +// [self.navigationController popViewControllerAnimated:true]; +//} #pragma mark - Bottom Actions - (void)onTapPayButton { @@ -495,14 +490,7 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; } -- (UIButton *)closeButton { - if (!_closeButton) { - _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; - [_closeButton setImage:[UIImage imageNamed:@"close_white2_icon"] forState:UIControlStateNormal]; - [_closeButton addTarget:self action:@selector(onTapClose) forControlEvents:UIControlEventTouchUpInside]; - } - return _closeButton; -} + - (UIButton *)restoreButton { if (!_restoreButton) { @@ -575,4 +563,21 @@ static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; [layout invalidateLayout]; } } + + +#pragma mark - UIScrollView Delegate(转发给分页容器) +- (void)scrollViewDidScroll:(UIScrollView *)scrollView { + !self.scrollCallback ?: self.scrollCallback(scrollView); +} + +#pragma mark - JXPagingViewListViewDelegate +- (UIView *)listView { return self.view; } +- (UIScrollView *)listScrollView { return self.collectionView; } +- (void)listViewDidScrollCallback:(void (^)(UIScrollView *))callback { self.scrollCallback = callback; } +- (void)listWillAppear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } +- (void)listDidAppear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } +- (void)listWillDisappear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } +- (void)listDidDisappear { NSLog(@"%@:%@", self.title, NSStringFromSelector(_cmd)); } + + @end