修改UI
@@ -9,6 +9,9 @@
|
||||
#import "HomeVC.h"
|
||||
#import "HomeMainVC.h"
|
||||
#import "MyVC.h"
|
||||
#import "KBShopVC.h"
|
||||
#import "KBCommunityVC.h"
|
||||
|
||||
#import "BaseNavigationController.h"
|
||||
#import "KBAuthManager.h"
|
||||
@interface BaseTabBarController ()
|
||||
|
||||
16
keyBoard/Class/Community/VC/KBCommunityVC.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// KBCommunityVC.h
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/11/6.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface KBCommunityVC : UIViewController
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
31
keyBoard/Class/Community/VC/KBCommunityVC.m
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// KBCommunityVC.m
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/11/6.
|
||||
//
|
||||
|
||||
#import "KBCommunityVC.h"
|
||||
|
||||
@interface KBCommunityVC ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation KBCommunityVC
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
// Do any additional setup after loading the view.
|
||||
}
|
||||
|
||||
/*
|
||||
#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.
|
||||
}
|
||||
*/
|
||||
|
||||
@end
|
||||
@@ -23,6 +23,8 @@
|
||||
@property (nonatomic, strong) UIViewController *currentChild;
|
||||
@property (nonatomic, strong) HomeHotVC *hotVC;
|
||||
@property (nonatomic, strong) HomeRankVC *rankVC;
|
||||
@property (nonatomic, assign) NSInteger currentIndex;
|
||||
|
||||
@end
|
||||
@implementation KBPanModalView
|
||||
|
||||
@@ -83,6 +85,10 @@
|
||||
return NO; // 在 short 状态禁止继续往下拉(锁住最小高度)
|
||||
}
|
||||
|
||||
- (CGFloat)topOffset{
|
||||
return 0.001;
|
||||
}
|
||||
|
||||
/// 允许时间穿透
|
||||
- (BOOL)allowsTouchEventsPassingThroughTransitionView {
|
||||
return YES;
|
||||
@@ -94,7 +100,10 @@
|
||||
|
||||
|
||||
- (UIScrollView *)panScrollable {
|
||||
return self.hotVC.tableView;
|
||||
if (self.currentIndex == 0) {
|
||||
return self.hotVC.tableView;
|
||||
}
|
||||
return self.rankVC.tableView;
|
||||
}
|
||||
|
||||
// 可选:完全不允许拖拽关闭(避免被拉到底消失)
|
||||
@@ -130,7 +139,7 @@
|
||||
self.topBar.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
|
||||
[self addSubview:self.topBar];
|
||||
// 首次展示时先隐藏,待转场完成后再淡入,避免“自底向上滑入”的错觉
|
||||
self.topBar.alpha = 0.0;
|
||||
// self.topBar.alpha = 0.0;
|
||||
|
||||
// 两个按钮
|
||||
self.hotButton = [UIButton buttonWithType:UIButtonTypeCustom];
|
||||
@@ -200,12 +209,13 @@
|
||||
|
||||
- (void)onTapTopButton:(UIButton *)sender {
|
||||
[self switchToIndex:sender.tag animated:YES];
|
||||
[self hw_panModalSetNeedsLayoutUpdate];
|
||||
// [self hw_panModalSetNeedsLayoutUpdate];
|
||||
}
|
||||
|
||||
#pragma mark - Switch Child
|
||||
|
||||
- (void)switchToIndex:(NSInteger)index animated:(BOOL)animated {
|
||||
self.currentIndex = index;
|
||||
UIViewController *target = (index == 0) ? self.hotVC : self.rankVC;
|
||||
if (!target) {
|
||||
if (index == 0) {
|
||||
@@ -235,11 +245,11 @@
|
||||
[self.containerView addSubview:target.view];
|
||||
target.view.backgroundColor = [UIColor colorWithWhite:0.98 alpha:1];
|
||||
[target.view mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.edges.equalTo(self.containerView);
|
||||
make.left.top.right.equalTo(self.containerView);
|
||||
make.bottom.equalTo(self.containerView).offset(-KB_TABBAR_HEIGHT);
|
||||
}];
|
||||
[target didMoveToParentViewController:self];
|
||||
// [target didMoveToParentViewController:self];
|
||||
self.currentChild = target;
|
||||
|
||||
[self updateButtonStateForIndex:index animated:animated];
|
||||
}
|
||||
|
||||
|
||||
18
keyBoard/Class/Home/VC/HomeRankContentVC.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// HomeRankContentVC.h
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/11/6.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
#import "JXCategoryListContainerView.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface HomeRankContentVC : UIViewController<JXCategoryListContentViewDelegate>
|
||||
@property (nonatomic, strong) BaseTableView *tableView;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
96
keyBoard/Class/Home/VC/HomeRankContentVC.m
Normal file
@@ -0,0 +1,96 @@
|
||||
//
|
||||
// HomeRankContentVC.m
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/11/6.
|
||||
//
|
||||
|
||||
#import "HomeRankContentVC.h"
|
||||
#import "HomeHotCell.h"
|
||||
@interface HomeRankContentVC () <UITableViewDataSource, UITableViewDelegate>
|
||||
@property (nonatomic, strong) NSArray<NSDictionary *> *dataSource; // 简单模拟数据
|
||||
|
||||
@end
|
||||
|
||||
@implementation HomeRankContentVC
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
// Do any additional setup after loading the view.
|
||||
// 构建数据(演示)
|
||||
self.dataSource = @[
|
||||
@{@"rank":@4, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@5, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@YES},
|
||||
@{@"rank":@6, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@7, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@4, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@5, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@YES},
|
||||
@{@"rank":@6, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@7, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@4, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@5, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@YES},
|
||||
@{@"rank":@6, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO},
|
||||
@{@"rank":@7, @"title":@"Ambiguous", @"sub":@"Be Neither Too Close Nor Too Distant, Want To ...", @"joined":@NO}
|
||||
];
|
||||
// 设置背景颜色:随机色
|
||||
self.view.backgroundColor = COLOR_WITH_RGB(arc4random()%255/255.0, arc4random()%255/255.0, arc4random()%255/255.0, 1);
|
||||
[self.view addSubview:self.tableView];
|
||||
[self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||||
make.left.top.right.equalTo(self.view);
|
||||
make.bottom.equalTo(self.view);
|
||||
|
||||
}];
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDataSource
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
||||
return self.dataSource.count;
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
HomeHotCell *cell = [tableView dequeueReusableCellWithIdentifier:HomeHotCell.reuseId forIndexPath:indexPath];
|
||||
NSDictionary *item = self.dataSource[indexPath.row];
|
||||
// 配置 cell
|
||||
[cell configWithRank:[item[@"rank"] integerValue]
|
||||
title:item[@"title"]
|
||||
subtitle:item[@"sub"]
|
||||
joined:[item[@"joined"] boolValue]];
|
||||
return cell;
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDelegate
|
||||
|
||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
return 84.0;
|
||||
}
|
||||
|
||||
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
[tableView deselectRowAtIndexPath:indexPath animated:YES];
|
||||
|
||||
}
|
||||
|
||||
- (BaseTableView *)tableView {
|
||||
if (!_tableView) {
|
||||
// 使用 BaseTableView,统一默认配置
|
||||
_tableView = [[BaseTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
|
||||
_tableView.dataSource = self;
|
||||
_tableView.delegate = self;
|
||||
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // 设计为卡片式,去掉系统分割线
|
||||
_tableView.showsVerticalScrollIndicator = NO;
|
||||
_tableView.contentInset = UIEdgeInsetsMake(8, 0, KB_SafeAreaBottom(), 0);
|
||||
[_tableView registerClass:HomeHotCell.class forCellReuseIdentifier:HomeHotCell.reuseId];
|
||||
}
|
||||
return _tableView;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - JXCategoryListContentViewDelegate
|
||||
|
||||
/**
|
||||
实现 <JXCategoryListContentViewDelegate> 协议方法,返回该视图控制器所拥有的「视图」
|
||||
*/
|
||||
- (UIView *)listView {
|
||||
return self.view;
|
||||
}
|
||||
@end
|
||||
@@ -6,11 +6,13 @@
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
#import "JXCategoryView.h"
|
||||
#import "JXCategoryListContainerView.h"
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface HomeRankVC : UIViewController
|
||||
|
||||
@interface HomeRankVC : UIViewController<JXCategoryListContainerViewDelegate>
|
||||
// 列表
|
||||
@property (nonatomic, strong) BaseTableView *tableView;
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
@@ -6,8 +6,13 @@
|
||||
//
|
||||
|
||||
#import "HomeRankVC.h"
|
||||
#import "HomeRankContentVC.h"
|
||||
|
||||
@interface HomeRankVC ()
|
||||
@interface HomeRankVC ()<JXCategoryViewDelegate>
|
||||
@property (nonatomic, strong) NSArray *titles;
|
||||
@property (nonatomic, strong) JXCategoryTitleImageView *myCategoryView;
|
||||
@property (nonatomic, strong) JXCategoryListContainerView *listContainerView;
|
||||
@property (nonatomic, assign) JXCategoryTitleImageType currentType;
|
||||
|
||||
@end
|
||||
|
||||
@@ -17,16 +22,124 @@
|
||||
[super viewDidLoad];
|
||||
// Do any additional setup after loading the view.
|
||||
self.view.backgroundColor = [UIColor grayColor];
|
||||
self.titles = @[@"螃蟹啊斯柯达积分卡", @"小龙虾", @"苹果", @"胡萝卜", @"葡萄", @"西瓜"];
|
||||
[self.view addSubview:self.myCategoryView];
|
||||
[self.view addSubview:self.listContainerView];
|
||||
// self.listContainerView.scrollView.scrollEnabled = false;
|
||||
NSArray *imageNames = @[@"crab", @"lobster", @"apple", @"carrot", @"grape", @"watermelon"];
|
||||
NSArray *selectedImageNames = @[@"crab_selected", @"lobster_selected", @"apple_selected", @"carrot_selected", @"grape_selected", @"watermelon_selected"];
|
||||
|
||||
self.myCategoryView.titles = self.titles;
|
||||
self.myCategoryView.imageInfoArray = imageNames;
|
||||
self.myCategoryView.selectedImageInfoArray = selectedImageNames;
|
||||
self.myCategoryView.loadImageBlock = ^(UIImageView *imageView, id info) {
|
||||
NSString *imageName = info;
|
||||
imageView.image = [UIImage imageNamed:imageName];
|
||||
};
|
||||
self.myCategoryView.imageZoomEnabled = YES;
|
||||
self.myCategoryView.imageZoomScale = 1.3;
|
||||
self.myCategoryView.averageCellSpacingEnabled = NO;
|
||||
|
||||
JXCategoryIndicatorLineView *lineView = [[JXCategoryIndicatorLineView alloc] init];
|
||||
lineView.indicatorWidth = 20;
|
||||
self.myCategoryView.indicators = @[lineView];
|
||||
|
||||
[self configCategoryViewWithType:JXCategoryTitleImageType_LeftImage];
|
||||
}
|
||||
|
||||
/*
|
||||
#pragma mark - Navigation
|
||||
- (void)viewDidLayoutSubviews {
|
||||
[super viewDidLayoutSubviews];
|
||||
|
||||
// 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.
|
||||
self.myCategoryView.frame = CGRectMake(0, 0, self.view.bounds.size.width, [self preferredCategoryViewHeight]);
|
||||
self.listContainerView.frame = CGRectMake(0, [self preferredCategoryViewHeight], self.view.bounds.size.width, self.view.bounds.size.height - [self preferredCategoryViewHeight]);
|
||||
}
|
||||
|
||||
//- (JXCategoryBaseView *)preferredCategoryView {
|
||||
// return [[JXCategoryBaseView alloc] init];
|
||||
//}
|
||||
|
||||
- (CGFloat)preferredCategoryViewHeight {
|
||||
return 50;
|
||||
}
|
||||
|
||||
- (void)configCategoryViewWithType:(JXCategoryTitleImageType)imageType {
|
||||
self.currentType = imageType;
|
||||
if ((NSInteger)imageType == 100) {
|
||||
NSMutableArray *types = [NSMutableArray array];
|
||||
for (int i = 0; i < self.titles.count; i++) {
|
||||
if (i == 2) {
|
||||
[types addObject:@(JXCategoryTitleImageType_OnlyImage)];
|
||||
}else if (i == 4) {
|
||||
[types addObject:@(JXCategoryTitleImageType_LeftImage)];
|
||||
}else {
|
||||
[types addObject:@(JXCategoryTitleImageType_OnlyTitle)];
|
||||
}
|
||||
}
|
||||
self.myCategoryView.imageTypes = types;
|
||||
}else {
|
||||
NSMutableArray *types = [NSMutableArray array];
|
||||
for (int i = 0; i < self.titles.count; i++) {
|
||||
[types addObject:@(imageType)];
|
||||
}
|
||||
self.myCategoryView.imageTypes = types;
|
||||
}
|
||||
[self.myCategoryView reloadData];
|
||||
}
|
||||
|
||||
// 分页菜单视图
|
||||
- (JXCategoryTitleImageView *)myCategoryView {
|
||||
if (!_myCategoryView) {
|
||||
_myCategoryView = [[JXCategoryTitleImageView alloc] init];
|
||||
_myCategoryView.delegate = self;
|
||||
|
||||
// !!!: 将列表容器视图关联到 categoryView
|
||||
_myCategoryView.listContainer = self.listContainerView;
|
||||
}
|
||||
return _myCategoryView;
|
||||
}
|
||||
|
||||
// 列表容器视图
|
||||
- (JXCategoryListContainerView *)listContainerView {
|
||||
if (!_listContainerView) {
|
||||
_listContainerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_ScrollView delegate:self];
|
||||
}
|
||||
return _listContainerView;
|
||||
}
|
||||
|
||||
#pragma mark - JXCategoryViewDelegate
|
||||
|
||||
// 点击选中或者滚动选中都会调用该方法。适用于只关心选中事件,不关心具体是点击还是滚动选中的。
|
||||
- (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index {
|
||||
NSLog(@"%@", NSStringFromSelector(_cmd));
|
||||
self.
|
||||
// 侧滑手势处理
|
||||
self.navigationController.interactivePopGestureRecognizer.enabled = (index == 0);
|
||||
}
|
||||
|
||||
// 滚动选中的情况才会调用该方法
|
||||
- (void)categoryView:(JXCategoryBaseView *)categoryView didScrollSelectedItemAtIndex:(NSInteger)index {
|
||||
NSLog(@"%@", NSStringFromSelector(_cmd));
|
||||
}
|
||||
|
||||
#pragma mark - JXCategoryListContainerViewDelegate
|
||||
|
||||
// 返回列表的数量
|
||||
- (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView {
|
||||
return self.titles.count;
|
||||
}
|
||||
|
||||
// 返回各个列表菜单下的实例,该实例需要遵守并实现 <JXCategoryListContentViewDelegate> 协议
|
||||
- (id<JXCategoryListContentViewDelegate>)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index {
|
||||
HomeRankContentVC *list = [[HomeRankContentVC alloc] init];
|
||||
self.tableView = list.tableView;
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
#pragma mark - TitleImageSettingViewControllerDelegate
|
||||
|
||||
- (void)titleImageSettingVCDidSelectedImageType:(JXCategoryTitleImageType)imageType {
|
||||
[self configCategoryViewWithType:imageType];
|
||||
}
|
||||
*/
|
||||
|
||||
@end
|
||||
|
||||
@@ -26,12 +26,12 @@
|
||||
// 创建sheetVC
|
||||
HomeSheetVC *vc = [[HomeSheetVC alloc] init];
|
||||
// 使用宏,避免误写成函数指针判断导致恒为 true
|
||||
if (KB_DEVICE_HAS_NOTCH) {
|
||||
vc.minHeight = KB_SCREEN_HEIGHT - topV - 34;
|
||||
}else{
|
||||
// if (KB_DEVICE_HAS_NOTCH) {
|
||||
// vc.minHeight = KB_SCREEN_HEIGHT - topV - 34;
|
||||
// }else{
|
||||
vc.minHeight = KB_SCREEN_HEIGHT - topV;
|
||||
//
|
||||
}
|
||||
// }
|
||||
vc.topInset = 100;
|
||||
[self presentPanModal:vc];
|
||||
}
|
||||
|
||||
BIN
keyBoard/Class/Resource/Images/Indicator/boat.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
keyBoard/Class/Resource/Images/Indicator/city.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
keyBoard/Class/Resource/Images/Indicator/light.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
keyBoard/Class/Resource/Images/Indicator/lotus.png
Normal file
|
After Width: | Height: | Size: 174 KiB |
BIN
keyBoard/Class/Resource/Images/Indicator/river.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
keyBoard/Class/Resource/Images/Indicator/seaWave.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
BIN
keyBoard/Class/Resource/Images/JXCategoryView.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
BIN
keyBoard/Class/Resource/Images/JXCategoryViewStructure.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
keyBoard/Class/Resource/Images/apple.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
keyBoard/Class/Resource/Images/apple_selected.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
keyBoard/Class/Resource/Images/arrow_down.png
Normal file
|
After Width: | Height: | Size: 155 B |
BIN
keyBoard/Class/Resource/Images/arrow_up.png
Normal file
|
After Width: | Height: | Size: 156 B |
BIN
keyBoard/Class/Resource/Images/carrot.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
keyBoard/Class/Resource/Images/carrot_selected.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
keyBoard/Class/Resource/Images/crab.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
keyBoard/Class/Resource/Images/crab_selected.png
Normal file
|
After Width: | Height: | Size: 2.1 KiB |
BIN
keyBoard/Class/Resource/Images/filter.png
Normal file
|
After Width: | Height: | Size: 228 B |
BIN
keyBoard/Class/Resource/Images/football.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
keyBoard/Class/Resource/Images/grape.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
keyBoard/Class/Resource/Images/grape_selected.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
keyBoard/Class/Resource/Images/lobster.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
keyBoard/Class/Resource/Images/lobster_selected.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
keyBoard/Class/Resource/Images/lufei.jpg
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
keyBoard/Class/Resource/Images/watermelon.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
keyBoard/Class/Resource/Images/watermelon_selected.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
16
keyBoard/Class/Shop/VC/KBShopVC.h
Normal file
@@ -0,0 +1,16 @@
|
||||
//
|
||||
// KBShopVC.h
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/11/6.
|
||||
//
|
||||
|
||||
#import <UIKit/UIKit.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface KBShopVC : UIViewController
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
31
keyBoard/Class/Shop/VC/KBShopVC.m
Normal file
@@ -0,0 +1,31 @@
|
||||
//
|
||||
// KBShopVC.m
|
||||
// keyBoard
|
||||
//
|
||||
// Created by Mac on 2025/11/6.
|
||||
//
|
||||
|
||||
#import "KBShopVC.h"
|
||||
|
||||
@interface KBShopVC ()
|
||||
|
||||
@end
|
||||
|
||||
@implementation KBShopVC
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
// Do any additional setup after loading the view.
|
||||
}
|
||||
|
||||
/*
|
||||
#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.
|
||||
}
|
||||
*/
|
||||
|
||||
@end
|
||||