From dace0a93099af227fae2432cac9896a2f24ca170 Mon Sep 17 00:00:00 2001 From: CodeST <694468528@qq.com> Date: Fri, 14 Nov 2025 19:48:15 +0800 Subject: [PATCH] 1 --- keyBoard.xcodeproj/project.pbxproj | 24 +++ .../Home/home_left_bg.imageset/Contents.json | 4 +- .../home_left_bg.imageset/home_left_bg 1.png | Bin 9735 -> 7604 bytes .../home_left_bg.imageset/home_left_bg 2.png | Bin 9735 -> 0 bytes .../home_left_bg.imageset/home_left_bg.png | Bin 0 -> 7604 bytes .../Home/home_right_bg.imageset/Contents.json | 4 +- .../home_right_bg 1.png | Bin 9249 -> 7412 bytes .../home_right_bg 2.png | Bin 9249 -> 0 bytes .../home_right_bg.imageset/home_right_bg.png | Bin 0 -> 7412 bytes keyBoard/Class/Home/V/HomeHeadView.m | 4 +- keyBoard/Class/Home/V/KBPanModalView.m | 4 +- keyBoard/Class/Pay/V/KBVipPayHeaderView.h | 19 ++ keyBoard/Class/Pay/V/KBVipPayHeaderView.m | 147 ++++++++++++++ keyBoard/Class/Pay/V/KBVipReviewItemCell.h | 17 ++ keyBoard/Class/Pay/V/KBVipReviewItemCell.m | 124 ++++++++++++ keyBoard/Class/Pay/V/KBVipReviewListCell.h | 16 ++ keyBoard/Class/Pay/V/KBVipReviewListCell.m | 82 ++++++++ keyBoard/Class/Pay/V/KBVipSubscribeCell.h | 20 ++ keyBoard/Class/Pay/V/KBVipSubscribeCell.m | 162 ++++++++++++++++ keyBoard/Class/Pay/VC/KBVipPay.h | 2 +- keyBoard/Class/Pay/VC/KBVipPay.m | 182 +++++++++++++++++- 21 files changed, 792 insertions(+), 19 deletions(-) delete mode 100644 keyBoard/Assets.xcassets/Home/home_left_bg.imageset/home_left_bg 2.png create mode 100644 keyBoard/Assets.xcassets/Home/home_left_bg.imageset/home_left_bg.png delete mode 100644 keyBoard/Assets.xcassets/Home/home_right_bg.imageset/home_right_bg 2.png create mode 100644 keyBoard/Assets.xcassets/Home/home_right_bg.imageset/home_right_bg.png create mode 100644 keyBoard/Class/Pay/V/KBVipPayHeaderView.h create mode 100644 keyBoard/Class/Pay/V/KBVipPayHeaderView.m create mode 100644 keyBoard/Class/Pay/V/KBVipReviewItemCell.h create mode 100644 keyBoard/Class/Pay/V/KBVipReviewItemCell.m create mode 100644 keyBoard/Class/Pay/V/KBVipReviewListCell.h create mode 100644 keyBoard/Class/Pay/V/KBVipReviewListCell.m create mode 100644 keyBoard/Class/Pay/V/KBVipSubscribeCell.h create mode 100644 keyBoard/Class/Pay/V/KBVipSubscribeCell.m diff --git a/keyBoard.xcodeproj/project.pbxproj b/keyBoard.xcodeproj/project.pbxproj index a21b4a6..60a8427 100644 --- a/keyBoard.xcodeproj/project.pbxproj +++ b/keyBoard.xcodeproj/project.pbxproj @@ -7,6 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 04122FAA2EC73C0100EF7AB3 /* KBVipPayHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04122FA92EC73C0100EF7AB3 /* KBVipPayHeaderView.m */; }; + 04122FAD2EC73C0100EF7AB3 /* KBVipSubscribeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04122FAC2EC73C0100EF7AB3 /* KBVipSubscribeCell.m */; }; + 04122FB02EC73C0100EF7AB3 /* KBVipReviewItemCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04122FAF2EC73C0100EF7AB3 /* KBVipReviewItemCell.m */; }; + 04122FB32EC73C0100EF7AB3 /* KBVipReviewListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04122FB22EC73C0100EF7AB3 /* KBVipReviewListCell.m */; }; 04122F5D2EC5E5A900EF7AB3 /* KBLoginVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 04122F5B2EC5E5A900EF7AB3 /* KBLoginVM.m */; }; 04122F622EC5F41D00EF7AB3 /* KBUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 04122F612EC5F41D00EF7AB3 /* KBUser.m */; }; 04122F6D2EC5F40800EF7AB3 /* NSObject+FGIsNullOrEmpty.m in Sources */ = {isa = PBXBuildFile; fileRef = 04122F6B2EC5F40800EF7AB3 /* NSObject+FGIsNullOrEmpty.m */; }; @@ -189,6 +193,14 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 04122FA82EC73C0100EF7AB3 /* KBVipPayHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBVipPayHeaderView.h; sourceTree = ""; }; + 04122FA92EC73C0100EF7AB3 /* KBVipPayHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBVipPayHeaderView.m; sourceTree = ""; }; + 04122FAB2EC73C0100EF7AB3 /* KBVipSubscribeCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBVipSubscribeCell.h; sourceTree = ""; }; + 04122FAC2EC73C0100EF7AB3 /* KBVipSubscribeCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBVipSubscribeCell.m; sourceTree = ""; }; + 04122FAE2EC73C0100EF7AB3 /* KBVipReviewItemCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBVipReviewItemCell.h; sourceTree = ""; }; + 04122FAF2EC73C0100EF7AB3 /* KBVipReviewItemCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBVipReviewItemCell.m; sourceTree = ""; }; + 04122FB12EC73C0100EF7AB3 /* KBVipReviewListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBVipReviewListCell.h; sourceTree = ""; }; + 04122FB22EC73C0100EF7AB3 /* KBVipReviewListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBVipReviewListCell.m; sourceTree = ""; }; 04122F592EC5D40000EF7AB3 /* KBAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBAPI.h; sourceTree = ""; }; 04122F5A2EC5E5A900EF7AB3 /* KBLoginVM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBLoginVM.h; sourceTree = ""; }; 04122F5B2EC5E5A900EF7AB3 /* KBLoginVM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBLoginVM.m; sourceTree = ""; }; @@ -552,6 +564,14 @@ children = ( 04122F7B2EC5FC5500EF7AB3 /* KBJfPayCell.h */, 04122F7C2EC5FC5500EF7AB3 /* KBJfPayCell.m */, + 04122FA82EC73C0100EF7AB3 /* KBVipPayHeaderView.h */, + 04122FA92EC73C0100EF7AB3 /* KBVipPayHeaderView.m */, + 04122FAB2EC73C0100EF7AB3 /* KBVipSubscribeCell.h */, + 04122FAC2EC73C0100EF7AB3 /* KBVipSubscribeCell.m */, + 04122FAE2EC73C0100EF7AB3 /* KBVipReviewItemCell.h */, + 04122FAF2EC73C0100EF7AB3 /* KBVipReviewItemCell.m */, + 04122FB12EC73C0100EF7AB3 /* KBVipReviewListCell.h */, + 04122FB22EC73C0100EF7AB3 /* KBVipReviewListCell.m */, ); path = V; sourceTree = ""; @@ -1591,6 +1611,7 @@ 04122F882EC6F07F00EF7AB3 /* KBFullAccessManager.m in Sources */, 04122F622EC5F41D00EF7AB3 /* KBUser.m in Sources */, 04122F8B2EC6F7C800EF7AB3 /* IAPVerifyTransactionObj.m in Sources */, + 04122FAD2EC73C0100EF7AB3 /* KBVipSubscribeCell.m in Sources */, 049FB31D2EC21BCD00FAB05D /* KBMyKeyboardCell.m in Sources */, 048909F62EC0AAAA00FABA60 /* KBCategoryTitleCell.m in Sources */, 048909F72EC0AAAA00FABA60 /* KBCategoryTitleView.m in Sources */, @@ -1656,12 +1677,14 @@ 04122F6E2EC5F40800EF7AB3 /* FGIAPProductsFilter.m in Sources */, 04122F6F2EC5F40800EF7AB3 /* FGIAPManager.m in Sources */, 04122F702EC5F40800EF7AB3 /* FGIAPService.m in Sources */, + 04122FB32EC73C0100EF7AB3 /* KBVipReviewListCell.m in Sources */, 048908DA2EBF61AF00FABA60 /* UICollectionViewLeftAlignedLayout.m in Sources */, 04C6EABF2EAF86530089C901 /* main.m in Sources */, 04FC95CC2EB1E780007BD342 /* BaseTabBarController.m in Sources */, 047C65502EBCBA9E0035E841 /* KBShopVC.m in Sources */, 0477BE042EBC83130055D639 /* HomeMainVC.m in Sources */, 0477BDFD2EBC6A170055D639 /* HomeHotVC.m in Sources */, + 04122FAA2EC73C0100EF7AB3 /* KBVipPayHeaderView.m in Sources */, 049FB2432EC4BBB700FAB05D /* KBLoginPopView.m in Sources */, 048908CC2EBE373500FABA60 /* KBSearchBarView.m in Sources */, 04122F872EC6198C00EF7AB3 /* WMDragView.m in Sources */, @@ -1679,6 +1702,7 @@ A1B2C4002EB4A0A100000004 /* KBAuthManager.m in Sources */, 047C65532EBCBAC60035E841 /* KBCommunityVC.m in Sources */, A1B2C4212EB4B7A100000001 /* KBKeyboardPermissionManager.m in Sources */, + 04122FB02EC73C0100EF7AB3 /* KBVipReviewItemCell.m in Sources */, 04122F822EC5FC6F00EF7AB3 /* KBJfPay.m in Sources */, 04122F5D2EC5E5A900EF7AB3 /* KBLoginVM.m in Sources */, 0459D1B42EBA284C00F2D189 /* KBSkinCenterVC.m in Sources */, diff --git a/keyBoard/Assets.xcassets/Home/home_left_bg.imageset/Contents.json b/keyBoard/Assets.xcassets/Home/home_left_bg.imageset/Contents.json index bcd7482..47ff9d0 100644 --- a/keyBoard/Assets.xcassets/Home/home_left_bg.imageset/Contents.json +++ b/keyBoard/Assets.xcassets/Home/home_left_bg.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "home_left_bg 1.png", + "filename" : "home_left_bg.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "home_left_bg 2.png", + "filename" : "home_left_bg 1.png", "idiom" : "universal", "scale" : "3x" } diff --git a/keyBoard/Assets.xcassets/Home/home_left_bg.imageset/home_left_bg 1.png b/keyBoard/Assets.xcassets/Home/home_left_bg.imageset/home_left_bg 1.png index 9d3ddc8a36f38c8c74ddaf201ed3c5313e284a73..aa01ad4fa514b4b08418a60803bc28015724f66f 100644 GIT binary patch literal 7604 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 literal 9735 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 literal 0 HcmV?d00001 diff --git a/keyBoard/Assets.xcassets/Home/home_right_bg.imageset/Contents.json b/keyBoard/Assets.xcassets/Home/home_right_bg.imageset/Contents.json index e64eb3f..1fee6fb 100644 --- a/keyBoard/Assets.xcassets/Home/home_right_bg.imageset/Contents.json +++ b/keyBoard/Assets.xcassets/Home/home_right_bg.imageset/Contents.json @@ -5,12 +5,12 @@ "scale" : "1x" }, { - "filename" : "home_right_bg 1.png", + "filename" : "home_right_bg.png", "idiom" : "universal", "scale" : "2x" }, { - "filename" : "home_right_bg 2.png", + "filename" : "home_right_bg 1.png", "idiom" : "universal", "scale" : "3x" } diff --git a/keyBoard/Assets.xcassets/Home/home_right_bg.imageset/home_right_bg 1.png b/keyBoard/Assets.xcassets/Home/home_right_bg.imageset/home_right_bg 1.png index 4972b28ba83ffaa62c5cb14f8b3627577c780109..a78575275c3069bf8d15591472cdcd2e58d1a96d 100644 GIT binary patch literal 7412 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 t=O}CVUW9Zo%+dsL-xbK3QLKOTM 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 t=O}CVUW + +NS_ASSUME_NONNULL_BEGIN + +@interface KBVipPayHeaderView : UICollectionReusableView + + +NS_ASSUME_NONNULL_END +@end + diff --git a/keyBoard/Class/Pay/V/KBVipPayHeaderView.m b/keyBoard/Class/Pay/V/KBVipPayHeaderView.m new file mode 100644 index 0000000..7160bb2 --- /dev/null +++ b/keyBoard/Class/Pay/V/KBVipPayHeaderView.m @@ -0,0 +1,147 @@ +// +// KBVipPayHeaderView.m +// keyBoard +// +// 中文注释:顶部头图区域,使用 Masonry 布局,包含 5 张图片。 +// + +#import "KBVipPayHeaderView.h" + +@interface KBVipPayHeaderView () +// 容器(为了便于以 KB_NAV_TOTAL_HEIGHT 作为内容起点) +@property (nonatomic, strong) UIView *containerView; +// 顶部大图:pay_vip_icon +@property (nonatomic, strong) UIImageView *vipImageView; +// 功能图标四宫格 +@property (nonatomic, strong) UIImageView *aiImageView; +@property (nonatomic, strong) UIImageView *keyboardImageView; +@property (nonatomic, strong) UIImageView *chatImageView; +@property (nonatomic, strong) UIImageView *emotionImageView; +@end + +@implementation KBVipPayHeaderView + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.backgroundColor = [UIColor clearColor]; + + [self addSubview:self.containerView]; + [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self); + }]; + + // 1. 顶部大图(略微下移,避开自定义导航栏) + [self.containerView addSubview:self.vipImageView]; + [self.vipImageView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.containerView).offset(16); + make.right.equalTo(self.containerView).offset(-16); + make.top.equalTo(self.containerView).offset(KB_NAV_TOTAL_HEIGHT + 8); + make.height.mas_equalTo(KBFit(180)); + }]; + + // 2. 下方四宫格图标(简单示意) + UIView *g1 = [self gridItemWithImageView:self.aiImageView]; + UIView *g2 = [self gridItemWithImageView:self.keyboardImageView]; + UIView *g3 = [self gridItemWithImageView:self.chatImageView]; + UIView *g4 = [self gridItemWithImageView:self.emotionImageView]; + [self.containerView addSubview:g1]; + [self.containerView addSubview:g2]; + [self.containerView addSubview:g3]; + [self.containerView addSubview:g4]; + + CGFloat spacing = 12; + [g1 mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.vipImageView); + make.top.equalTo(self.vipImageView.mas_bottom).offset(18); + make.height.mas_equalTo(KBFit(90)); + }]; + [g2 mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(self.vipImageView); + make.top.equalTo(g1); + make.height.equalTo(g1); + make.left.equalTo(g1.mas_right).offset(spacing); + make.width.equalTo(g1); + }]; + [g3 mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(g1); + make.top.equalTo(g1.mas_bottom).offset(spacing); + make.height.equalTo(g1); + make.width.equalTo(g1); + }]; + [g4 mas_makeConstraints:^(MASConstraintMaker *make) { + make.right.equalTo(self.vipImageView); + make.top.equalTo(g3); + make.left.equalTo(g3.mas_right).offset(spacing); + make.height.equalTo(g1); + make.width.equalTo(g1); + make.bottom.lessThanOrEqualTo(self.containerView).offset(-12); + }]; + } + return self; +} + +#pragma mark - Helpers +- (UIView *)gridItemWithImageView:(UIImageView *)iv { + // 简单白底圆角卡片承载图标 + UIView *v = [UIView new]; + v.backgroundColor = [UIColor colorWithWhite:0.97 alpha:1.0]; + v.layer.cornerRadius = 12; + v.layer.masksToBounds = YES; + [v addSubview:iv]; + [iv mas_makeConstraints:^(MASConstraintMaker *make) { + make.center.equalTo(v); + make.width.height.mas_equalTo(40); + }]; + return v; +} + +#pragma mark - Lazy +- (UIView *)containerView { + if (!_containerView) { + _containerView = [UIView new]; + _containerView.backgroundColor = [UIColor clearColor]; + } + return _containerView; +} + +- (UIImageView *)vipImageView { + if (!_vipImageView) { + _vipImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_vip_icon"]]; + _vipImageView.contentMode = UIViewContentModeScaleAspectFill; + _vipImageView.clipsToBounds = YES; + _vipImageView.layer.cornerRadius = 14; + } + return _vipImageView; +} + +- (UIImageView *)aiImageView { + if (!_aiImageView) { + _aiImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_ai_icon"]]; + _aiImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _aiImageView; +} +- (UIImageView *)keyboardImageView { + if (!_keyboardImageView) { + _keyboardImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_keyboard_icon"]]; + _keyboardImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _keyboardImageView; +} +- (UIImageView *)chatImageView { + if (!_chatImageView) { + _chatImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_chat_icon"]]; + _chatImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _chatImageView; +} +- (UIImageView *)emotionImageView { + if (!_emotionImageView) { + _emotionImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_emotion_icon"]]; + _emotionImageView.contentMode = UIViewContentModeScaleAspectFit; + } + return _emotionImageView; +} + +@end + diff --git a/keyBoard/Class/Pay/V/KBVipReviewItemCell.h b/keyBoard/Class/Pay/V/KBVipReviewItemCell.h new file mode 100644 index 0000000..cbdd238 --- /dev/null +++ b/keyBoard/Class/Pay/V/KBVipReviewItemCell.h @@ -0,0 +1,17 @@ +// +// KBVipReviewItemCell.h +// keyBoard +// +// 横向列表中的 item,包含 5 个爱心图标:pay_5aixin_icon +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface KBVipReviewItemCell : UICollectionViewCell +- (void)configWithName:(NSString *)name text:(NSString *)text; +@end + +NS_ASSUME_NONNULL_END + diff --git a/keyBoard/Class/Pay/V/KBVipReviewItemCell.m b/keyBoard/Class/Pay/V/KBVipReviewItemCell.m new file mode 100644 index 0000000..aca2622 --- /dev/null +++ b/keyBoard/Class/Pay/V/KBVipReviewItemCell.m @@ -0,0 +1,124 @@ +// +// KBVipReviewItemCell.m +// keyBoard +// +// 中文注释:简单的好评卡片,顶部头像/昵称,下面 5 个爱心图标,再下一行一段文案。 +// + +#import "KBVipReviewItemCell.h" + +@interface KBVipReviewItemCell () +@property (nonatomic, strong) UIView *cardView; +@property (nonatomic, strong) UIImageView *avatarView; +@property (nonatomic, strong) UILabel *nameLabel; +@property (nonatomic, strong) UIStackView *heartsStack; +@property (nonatomic, strong) UILabel *contentLabel; +@end + +@implementation KBVipReviewItemCell + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.contentView.backgroundColor = UIColor.clearColor; + + [self.contentView addSubview:self.cardView]; + [self.cardView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.contentView); + }]; + + [self.cardView addSubview:self.avatarView]; + [self.cardView addSubview:self.nameLabel]; + [self.cardView addSubview:self.heartsStack]; + [self.cardView addSubview:self.contentLabel]; + + [self.avatarView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.top.equalTo(self.cardView).offset(12); + make.width.height.mas_equalTo(28); + }]; + [self.nameLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.avatarView); + make.left.equalTo(self.avatarView.mas_right).offset(8); + make.right.lessThanOrEqualTo(self.cardView).offset(-12); + }]; + [self.heartsStack mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.avatarView); + make.top.equalTo(self.avatarView.mas_bottom).offset(8); + }]; + [self.contentLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.avatarView); + make.right.equalTo(self.cardView).offset(-12); + make.top.equalTo(self.heartsStack.mas_bottom).offset(6); + make.bottom.lessThanOrEqualTo(self.cardView).offset(-12); + }]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + self.cardView.layer.cornerRadius = 12; + self.cardView.layer.masksToBounds = YES; +} + +- (void)configWithName:(NSString *)name text:(NSString *)text { + self.nameLabel.text = name.length ? name : @"User"; + self.contentLabel.text = text.length ? text : @"I highly recommend this app."; +} + +#pragma mark - Lazy +- (UIView *)cardView { + if (!_cardView) { + _cardView = [UIView new]; + _cardView.backgroundColor = [UIColor whiteColor]; + } + return _cardView; +} +- (UIImageView *)avatarView { + if (!_avatarView) { + _avatarView = [UIImageView new]; + _avatarView.backgroundColor = [UIColor colorWithWhite:0.92 alpha:1.0]; + _avatarView.layer.cornerRadius = 14; + _avatarView.layer.masksToBounds = YES; + } + return _avatarView; +} +- (UILabel *)nameLabel { + if (!_nameLabel) { + _nameLabel = [UILabel new]; + _nameLabel.textColor = [UIColor colorWithHex:KBBlackValue]; + _nameLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightSemibold]; + _nameLabel.text = @"Sdsd666"; + } + return _nameLabel; +} +- (UIStackView *)heartsStack { + if (!_heartsStack) { + _heartsStack = [[UIStackView alloc] init]; + _heartsStack.axis = UILayoutConstraintAxisHorizontal; + _heartsStack.spacing = 4; + _heartsStack.alignment = UIStackViewAlignmentCenter; + _heartsStack.distribution = UIStackViewDistributionFillProportionally; + for (int i = 0; i < 5; i++) { + UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pay_5aixin_icon"]]; + iv.contentMode = UIViewContentModeScaleAspectFit; + [iv mas_makeConstraints:^(MASConstraintMaker *make) { + make.width.height.mas_equalTo(16); + }]; + [_heartsStack addArrangedSubview:iv]; + } + } + return _heartsStack; +} +- (UILabel *)contentLabel { + if (!_contentLabel) { + _contentLabel = [UILabel new]; + _contentLabel.textColor = [UIColor colorWithWhite:0.25 alpha:1.0]; + _contentLabel.font = [UIFont systemFontOfSize:12]; + _contentLabel.numberOfLines = 2; + _contentLabel.text = @"I Highly Recommend This App. It Taught Me How To Chat"; + } + return _contentLabel; +} + +@end + diff --git a/keyBoard/Class/Pay/V/KBVipReviewListCell.h b/keyBoard/Class/Pay/V/KBVipReviewListCell.h new file mode 100644 index 0000000..b3f96ae --- /dev/null +++ b/keyBoard/Class/Pay/V/KBVipReviewListCell.h @@ -0,0 +1,16 @@ +// +// KBVipReviewListCell.h +// keyBoard +// +// 末尾的横向滚动列表 Cell,内部自带一个 UICollectionView。 +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface KBVipReviewListCell : UICollectionViewCell +@end + +NS_ASSUME_NONNULL_END + diff --git a/keyBoard/Class/Pay/V/KBVipReviewListCell.m b/keyBoard/Class/Pay/V/KBVipReviewListCell.m new file mode 100644 index 0000000..c1cadd1 --- /dev/null +++ b/keyBoard/Class/Pay/V/KBVipReviewListCell.m @@ -0,0 +1,82 @@ +// +// KBVipReviewListCell.m +// keyBoard +// +// 中文注释:底部 Cell,内部是横向滚动的 UICollectionView。 +// + +#import "KBVipReviewListCell.h" +#import "KBVipReviewItemCell.h" + +static NSString * const kKBVipReviewItemCellId = @"kKBVipReviewItemCellId"; + +@interface KBVipReviewListCell () +@property (nonatomic, strong) UICollectionView *collectionView; // 内部横向滚动 +@property (nonatomic, strong) NSArray *data; // 简单模拟数据 +@end + +@implementation KBVipReviewListCell + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.contentView.backgroundColor = [UIColor clearColor]; + [self.contentView addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.contentView).insets(UIEdgeInsetsMake(0, 0, 0, 0)); + }]; + + // 模拟数据 + _data = @[ + @{@"name":@"Sdsd666", @"text":@"I Highly Recommend This App. It Taught Me How To Chat"}, + @{@"name":@"Joyce", @"text":@"Great keyboard and AI features!"}, + @{@"name":@"Luna", @"text":@"Amazing app, love it."}, + @{@"name":@"Mark", @"text":@"Helps with chat and emotion."}, + @{@"name":@"Alan", @"text":@"Useful personalized keyboard."}, + @{@"name":@"Coco", @"text":@"Recommend to friends."}, + ]; + } + return self; +} + +#pragma mark - DataSource +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + return self.data.count; +} +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + KBVipReviewItemCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kKBVipReviewItemCellId forIndexPath:indexPath]; + NSDictionary *d = self.data[indexPath.item]; + [cell configWithName:d[@"name"] text:d[@"text"]]; + return cell; +} + +#pragma mark - FlowLayout +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + CGFloat w = floor((KB_SCREEN_WIDTH - 16 - 16 - 10) / 2.0); // 一屏展示两个 + return CGSizeMake(MAX(120, w), 120); +} +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { return 10; } +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 10; } +- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { + return UIEdgeInsetsMake(0, 16, 0, 16); +} + +#pragma mark - Lazy +- (UICollectionView *)collectionView { + if (!_collectionView) { + UICollectionViewFlowLayout *layout = [UICollectionViewFlowLayout new]; + layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; + _collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout]; + _collectionView.backgroundColor = UIColor.clearColor; + _collectionView.showsHorizontalScrollIndicator = NO; + _collectionView.dataSource = self; + _collectionView.delegate = self; + [_collectionView registerClass:KBVipReviewItemCell.class forCellWithReuseIdentifier:kKBVipReviewItemCellId]; + if (@available(iOS 11.0, *)) { + _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + } + return _collectionView; +} + +@end + diff --git a/keyBoard/Class/Pay/V/KBVipSubscribeCell.h b/keyBoard/Class/Pay/V/KBVipSubscribeCell.h new file mode 100644 index 0000000..defa7c8 --- /dev/null +++ b/keyBoard/Class/Pay/V/KBVipSubscribeCell.h @@ -0,0 +1,20 @@ +// +// KBVipSubscribeCell.h +// keyBoard +// +// 订阅选项 Cell:右侧选择按钮(pay_circle_normal / pay_circle_sel) +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface KBVipSubscribeCell : UICollectionViewCell +/// 配置展示文案 +- (void)configTitle:(NSString *)title price:(NSString *)price strike:(nullable NSString *)strike; +/// 同步选中态(更新右侧选择图标、边框颜色) +- (void)applySelected:(BOOL)selected animated:(BOOL)animated; +@end + +NS_ASSUME_NONNULL_END + diff --git a/keyBoard/Class/Pay/V/KBVipSubscribeCell.m b/keyBoard/Class/Pay/V/KBVipSubscribeCell.m new file mode 100644 index 0000000..a2b1304 --- /dev/null +++ b/keyBoard/Class/Pay/V/KBVipSubscribeCell.m @@ -0,0 +1,162 @@ +// +// KBVipSubscribeCell.m +// keyBoard +// +// 中文注释:订阅选项样式,右侧有选中图标,使用 mas 布局 + 懒加载。 +// + +#import "KBVipSubscribeCell.h" + +@interface KBVipSubscribeCell () +@property (nonatomic, strong) UIView *cardView; // 白色卡片背景 +@property (nonatomic, strong) UILabel *titleLabel; // “Monthly Subscription” +@property (nonatomic, strong) UILabel *priceLabel; // “$4.49” +@property (nonatomic, strong) UILabel *strikeLabel; // 删除线原价 +@property (nonatomic, strong) UIButton *selectButton; // 右侧选择按钮 +@property (nonatomic, strong) CAShapeLayer *borderLayer; // 选中边框 +@end + +@implementation KBVipSubscribeCell + +- (instancetype)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + self.contentView.backgroundColor = [UIColor clearColor]; + + [self.contentView addSubview:self.cardView]; + [self.cardView mas_makeConstraints:^(MASConstraintMaker *make) { + make.edges.equalTo(self.contentView); + }]; + + [self.cardView addSubview:self.titleLabel]; + [self.cardView addSubview:self.priceLabel]; + [self.cardView addSubview:self.strikeLabel]; + [self.cardView addSubview:self.selectButton]; + + [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.cardView).offset(16); + make.top.equalTo(self.cardView).offset(16); + }]; + [self.priceLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.titleLabel); + make.top.equalTo(self.titleLabel.mas_bottom).offset(6); + }]; + [self.strikeLabel mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.equalTo(self.priceLabel.mas_right).offset(10); + make.centerY.equalTo(self.priceLabel); + }]; + [self.selectButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.centerY.equalTo(self.cardView); + make.right.equalTo(self.cardView).offset(-16); + make.width.height.mas_equalTo(28); + }]; + + // 边框层(选中时显示主题绿) + self.borderLayer = [CAShapeLayer layer]; + self.borderLayer.strokeColor = [UIColor colorWithWhite:0.9 alpha:1.0].CGColor; + // 使用透明填充,避免遮挡内部子视图;只显示描边 + self.borderLayer.fillColor = UIColor.clearColor.CGColor; + self.borderLayer.lineWidth = 1.5; + // 放到底层,避免盖住 label/button(修复滚动后偶现内容被遮挡变空白) + [self.cardView.layer insertSublayer:self.borderLayer atIndex:0]; + } + return self; +} + +- (void)layoutSubviews { + [super layoutSubviews]; + CGFloat radius = 16; + UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.cardView.bounds cornerRadius:radius]; + self.cardView.layer.cornerRadius = radius; + self.cardView.layer.masksToBounds = YES; + self.borderLayer.frame = self.cardView.bounds; + self.borderLayer.path = path.CGPath; +} + +- (void)prepareForReuse { + [super prepareForReuse]; + [self applySelected:NO animated:NO]; +} + +- (void)setSelected:(BOOL)selected { + [super setSelected:selected]; + [self applySelected:selected animated:NO]; +} + +- (void)configTitle:(NSString *)title price:(NSString *)price strike:(nullable NSString *)strike { + self.titleLabel.text = title.length ? title : @"Monthly Subscription"; + self.priceLabel.text = price.length ? price : @"$4.49"; + self.strikeLabel.hidden = (strike.length == 0); + if (strike.length) { + // 加删除线 + NSDictionary *attr = @{ + NSStrikethroughStyleAttributeName: @(NSUnderlineStyleSingle), + NSForegroundColorAttributeName: [UIColor colorWithWhite:0.7 alpha:1.0] + }; + self.strikeLabel.attributedText = [[NSAttributedString alloc] initWithString:strike attributes:attr]; + } +} + +- (void)applySelected:(BOOL)selected animated:(BOOL)animated { + UIImage *img = [UIImage imageNamed:(selected ? @"pay_circle_sel" : @"pay_circle_normal")]; + [self.selectButton setImage:img forState:UIControlStateNormal]; + CGColorRef color = (selected ? [UIColor colorWithHex:KBColorValue].CGColor : [UIColor colorWithWhite:0.9 alpha:1.0].CGColor); + void (^changes)(void) = ^{ + self.borderLayer.strokeColor = color; + self.cardView.layer.shadowOpacity = selected ? 0.12 : 0.0; + self.cardView.layer.shadowColor = [UIColor colorWithHex:KBColorValue].CGColor; + self.cardView.layer.shadowRadius = selected ? 8 : 0; + self.cardView.layer.shadowOffset = CGSizeMake(0, selected ? 4 : 0); + }; + if (animated) { + [UIView animateWithDuration:0.15 animations:changes]; + } else { + changes(); + } +} + +#pragma mark - Lazy +- (UIView *)cardView { + if (!_cardView) { + _cardView = [UIView new]; + _cardView.backgroundColor = [UIColor whiteColor]; + } + return _cardView; +} +- (UILabel *)titleLabel { + if (!_titleLabel) { + _titleLabel = [UILabel new]; + _titleLabel.text = @"Monthly Subscription"; + _titleLabel.textColor = [UIColor colorWithHex:KBBlackValue]; + _titleLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold]; + } + return _titleLabel; +} +- (UILabel *)priceLabel { + if (!_priceLabel) { + _priceLabel = [UILabel new]; + _priceLabel.text = @"$4.49"; + _priceLabel.textColor = [UIColor colorWithHex:KBBlackValue]; + _priceLabel.font = [UIFont systemFontOfSize:28 weight:UIFontWeightBold]; + } + return _priceLabel; +} +- (UILabel *)strikeLabel { + if (!_strikeLabel) { + _strikeLabel = [UILabel new]; + _strikeLabel.text = @"$4.49"; + _strikeLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold]; + _strikeLabel.textColor = [UIColor colorWithWhite:0.7 alpha:1.0]; + } + return _strikeLabel; +} +- (UIButton *)selectButton { + if (!_selectButton) { + _selectButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_selectButton setImage:[UIImage imageNamed:@"pay_circle_normal"] forState:UIControlStateNormal]; + _selectButton.userInteractionEnabled = NO; // 由外层控制选中 + _selectButton.contentMode = UIViewContentModeCenter; + } + return _selectButton; +} + +@end diff --git a/keyBoard/Class/Pay/VC/KBVipPay.h b/keyBoard/Class/Pay/VC/KBVipPay.h index 7c03641..d5a04d2 100644 --- a/keyBoard/Class/Pay/VC/KBVipPay.h +++ b/keyBoard/Class/Pay/VC/KBVipPay.h @@ -9,8 +9,8 @@ NS_ASSUME_NONNULL_BEGIN +/// VIP 订阅页(整体使用 UICollectionView,上下滚动) @interface KBVipPay : UIViewController - @end NS_ASSUME_NONNULL_END diff --git a/keyBoard/Class/Pay/VC/KBVipPay.m b/keyBoard/Class/Pay/VC/KBVipPay.m index 8a4694f..8e267f8 100644 --- a/keyBoard/Class/Pay/VC/KBVipPay.m +++ b/keyBoard/Class/Pay/VC/KBVipPay.m @@ -6,8 +6,19 @@ // #import "KBVipPay.h" +#import "KBVipPayHeaderView.h" +#import "KBVipSubscribeCell.h" +#import "KBVipReviewListCell.h" -@interface KBVipPay () +static NSString * const kKBVipHeaderId = @"kKBVipHeaderId"; +static NSString * const kKBVipSubscribeCellId = @"kKBVipSubscribeCellId"; +static NSString * const kKBVipReviewListCellId = @"kKBVipReviewListCellId"; + +@interface KBVipPay () +@property (nonatomic, strong) UICollectionView *collectionView; // 主列表(竖向滚动) +@property (nonatomic, strong) NSArray *plans; // 订阅方案数组 +@property (nonatomic, assign) NSInteger selectedIndex; // 当前选中的方案索引 +@property (nonatomic, strong) UIButton *closeButton; // 当前选中的方案索引 @end @@ -15,17 +26,168 @@ - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view. + // 标题与导航样式 +// self.kb_titleLabel.text = @"VIP"; +// self.kb_navView.backgroundColor = [UIColor clearColor]; + + self.view.backgroundColor = [UIColor colorWithWhite:0.97 alpha:1.0]; + + // 初始化数据(简单演示) + self.plans = @[ + @{@"title":@"Monthly Subscription", @"price":@"$4.49", @"strike":@"$4.49"}, + @{@"title":@"Monthly Subscription", @"price":@"$4.49", @"strike":@"$4.49"}, + @{@"title":@"Monthly Subscription", @"price":@"$4.49", @"strike":@"$4.49"}, + ]; + self.selectedIndex = 1; // 默认选中第二项 + [self.view addSubview:self.closeButton]; + [self.closeButton mas_makeConstraints:^(MASConstraintMaker *make) { + make.top.equalTo(self.view).offset(KB_NAV_TOTAL_HEIGHT); + make.left.equalTo(self.view).offset(15); + make.width.height.mas_equalTo(36); + }]; + // 组装主列表 + [self.view addSubview:self.collectionView]; + [self.collectionView mas_makeConstraints:^(MASConstraintMaker *make) { + make.left.right.bottom.equalTo(self.view); + make.top.equalTo(self.view).offset(KB_NAV_TOTAL_HEIGHT); + }]; + + [self.collectionView reloadData]; } -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + // 首次进入,确保订阅项保持选中态(避免首屏仅显示 Header,待滚动出现时没有选中样式) + NSIndexPath *ip = [NSIndexPath indexPathForItem:self.selectedIndex inSection:1]; + if (!ip) { return; } + // 系统层面也置为选中 + [self.collectionView selectItemAtIndexPath:ip animated:NO scrollPosition:UICollectionViewScrollPositionNone]; + // 若此时 cell 不可见,willDisplay 再兜底 + KBVipSubscribeCell *cell = (KBVipSubscribeCell *)[self.collectionView cellForItemAtIndexPath:ip]; + if (cell) { [cell applySelected:YES animated:NO]; } } -*/ +#pragma mark - UICollectionView DataSource + +- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { + // 0:头部;1:订阅选项;2:底部横滑好评 + return 3; +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + if (section == 1) { return self.plans.count; } + if (section == 2) { return 1; } + return 0; // 头部仅使用 header +} + +- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section == 1) { + KBVipSubscribeCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kKBVipSubscribeCellId forIndexPath:indexPath]; + NSDictionary *plan = self.plans[indexPath.item]; + [cell configTitle:plan[@"title"] price:plan[@"price"] strike:plan[@"strike"]]; + [cell applySelected:(indexPath.item == self.selectedIndex) animated:NO]; + return cell; + } else { + KBVipReviewListCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:kKBVipReviewListCellId forIndexPath:indexPath]; + return cell; + } +} + +- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section == 0 && [kind isEqualToString:UICollectionElementKindSectionHeader]) { + KBVipPayHeaderView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kKBVipHeaderId forIndexPath:indexPath]; + return header; + } + return [UICollectionReusableView new]; +} + +#pragma mark - UICollectionView Delegate +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + if (indexPath.section != 1) { return; } + if (self.selectedIndex == indexPath.item) { return; } + NSInteger old = self.selectedIndex; + self.selectedIndex = indexPath.item; + + KBVipSubscribeCell *newCell = (KBVipSubscribeCell *)[collectionView cellForItemAtIndexPath:indexPath]; + [newCell applySelected:YES animated:YES]; + if (old >= 0 && old < self.plans.count) { + NSIndexPath *oldIP = [NSIndexPath indexPathForItem:old inSection:1]; + KBVipSubscribeCell *oldCell = (KBVipSubscribeCell *)[collectionView cellForItemAtIndexPath:oldIP]; + [oldCell applySelected:NO animated:YES]; + } +} + +- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { + // 兜底:当订阅项第一次出现在屏幕上,强制同步选中样式 + if (indexPath.section == 1 && [cell isKindOfClass:KBVipSubscribeCell.class]) { + BOOL sel = (indexPath.item == self.selectedIndex); + KBVipSubscribeCell *c = (KBVipSubscribeCell *)cell; + if (sel) { + [collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone]; + } + [c applySelected:sel animated:NO]; + } +} + +#pragma mark - FlowLayout +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + CGFloat w = KB_SCREEN_WIDTH - 32; + if (indexPath.section == 1) { + return CGSizeMake(w, 106); + } else { + return CGSizeMake(w, 140); + } +} + +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { + if (section == 0) { + // 头部高度 = 484 + 导航栏高度 + return CGSizeMake(KB_SCREEN_WIDTH, 484 + KB_NAV_TOTAL_HEIGHT); + } + return CGSizeZero; +} + +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { + if (section == 1) { return 14; } + return 0; +} + +- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { + if (section == 1) { + return UIEdgeInsetsMake(0, 16, 10, 16); + } else if (section == 2) { + return UIEdgeInsetsMake(10, 16, 20, 16); + } + return UIEdgeInsetsZero; +} + +#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; + _collectionView.alwaysBounceVertical = YES; + if (@available(iOS 11.0, *)) { + _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever; + } + [_collectionView registerClass:KBVipPayHeaderView.class forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:kKBVipHeaderId]; + [_collectionView registerClass:KBVipSubscribeCell.class forCellWithReuseIdentifier:kKBVipSubscribeCellId]; + [_collectionView registerClass:KBVipReviewListCell.class forCellWithReuseIdentifier:kKBVipReviewListCellId]; + } + return _collectionView; +} + + +- (UIButton *)closeButton { + if (!_closeButton) { + _closeButton = [UIButton buttonWithType:UIButtonTypeCustom]; + [_closeButton setImage:[UIImage imageNamed:@"white_close_icon"] forState:UIControlStateNormal]; + [_closeButton addTarget:self action:@selector(onTapClose) forControlEvents:UIControlEventTouchUpInside]; + } + return _closeButton; +} @end