Files
keyboard/keyBoard/Class/Home/VC/FunctionTest/KBSkinCenterVC.m

231 lines
10 KiB
Mathematica
Raw Normal View History

2025-11-04 21:01:46 +08:00
//
// KBSkinCenterVC.m
//
#import "KBSkinCenterVC.h"
#import "Masonry.h"
#import "KBNetworkManager.h"
#import "KBSkinManager.h"
#import "KBHUD.h"
2025-11-18 20:53:47 +08:00
#import "KBConfig.h"
#import "KBSkinService.h"
2025-11-04 21:01:46 +08:00
@interface KBSkinCell : UITableViewCell
@property (nonatomic, strong) UIButton *applyBtn;
@end
@implementation KBSkinCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
self.selectionStyle = UITableViewCellSelectionStyleNone;
_applyBtn = [UIButton buttonWithType:UIButtonTypeSystem];
2025-11-17 20:07:39 +08:00
[_applyBtn setTitle:KBLocalized(@"Download & Apply") forState:UIControlStateNormal];
2025-11-04 21:01:46 +08:00
_applyBtn.layer.cornerRadius = 6; _applyBtn.layer.borderWidth = 1;
_applyBtn.layer.borderColor = [UIColor colorWithWhite:0.85 alpha:1].CGColor;
[self.contentView addSubview:_applyBtn];
[_applyBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.contentView).offset(-16);
make.centerY.equalTo(self.contentView);
make.width.mas_equalTo(110);
make.height.mas_equalTo(34);
}];
}
return self;
}
@end
@interface KBSkinCenterVC () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, strong) UITableView *tableView;
2025-11-18 20:53:47 +08:00
@property (nonatomic, copy) NSArray<NSDictionary *> *skins; // JSON
2025-11-19 20:30:30 +08:00
@property (nonatomic, strong) UIButton *resetButton;
2025-11-04 21:01:46 +08:00
@end
@implementation KBSkinCenterVC
- (void)viewDidLoad {
[super viewDidLoad];
2025-11-18 13:48:22 +08:00
// self.title = KBLocalized(@"皮肤中心");
2025-11-04 21:01:46 +08:00
self.view.backgroundColor = [UIColor whiteColor];
2025-11-18 20:53:47 +08:00
// JSON
//
// - background_image URL使 picsum
// - background/key_bg/key_text/key_highlight/accent KBSkinManager.applyThemeFromJSON
// - hidden_keys identifier
// - key_icons
// * KB_SKIN_ICON_USE_REMOTE==0 value Assets "kb_space_melon"
2025-11-19 14:54:45 +08:00
// * KB_SKIN_ICON_USE_REMOTE==1 value Zip "key_space" Skins/<skinId>/icons/key_space.png
2025-11-19 15:39:47 +08:00
// self.skins = @[
// @{
// @"id": @"melon",
// @"name": KBLocalized(@"蜜瓜主题"),
// @"background_image": @"https://picsum.photos/id/1018/800/450.jpg",
// @"background": @"#F5FFE8",
// @"key_bg": @"#FFFFFF",
// @"key_text": @"#4A4A4A",
// @"key_highlight": @"#D9F4C4",
// @"accent": @"#A4D68A",
// @"hidden_keys": @[
// @"letter_q",@"letter_w",@"letter_e",@"letter_r",@"letter_t",
// @"letter_y",@"letter_u",@"letter_i",@"letter_o",@"letter_p",
// @"letter_a",@"letter_s",@"letter_d",@"letter_f",@"letter_g",
// @"letter_h",@"letter_j",@"letter_k",@"letter_l",
// @"letter_z",@"letter_x",@"letter_c",@"letter_v",
// @"letter_b",@"letter_n",@"letter_m",
// @"space"
// ],
// // Assets
// // Zip Zip "key_space"
// @"key_icons": @{
// //
// // *_lower / *_upper
// @"letter_q_lower": @"key_q",
// @"letter_q_upper": @"key_q",
// @"letter_w_lower": @"key_w",
// @"letter_w_upper": @"key_w",
// @"letter_e_lower": @"key_e",
// @"letter_e_upper": @"key_e",
// @"letter_r_lower": @"key_r",
// @"letter_r_upper": @"key_r",
// @"letter_t_lower": @"key_t",
// @"letter_t_upper": @"key_t",
// @"letter_y_lower": @"key_y",
// @"letter_y_upper": @"key_y",
// @"letter_u_lower": @"key_u",
// @"letter_u_upper": @"key_u",
// @"letter_i_lower": @"key_i",
// @"letter_i_upper": @"key_i",
// @"letter_o_lower": @"key_o",
// @"letter_o_upper": @"key_o",
// @"letter_p_lower": @"key_p",
// @"letter_p_upper": @"key_p",
//
// @"letter_a_lower": @"key_a",
// @"letter_a_upper": @"key_a",
// @"letter_s_lower": @"key_s",
// @"letter_s_upper": @"key_s",
// @"letter_d_lower": @"key_d",
// @"letter_d_upper": @"key_d",
// @"letter_f_lower": @"key_f",
// @"letter_f_upper": @"key_f",
// @"letter_g_lower": @"key_g",
// @"letter_g_upper": @"key_g",
// @"letter_h_lower": @"key_h",
// @"letter_h_upper": @"key_h",
// @"letter_j_lower": @"key_j",
// @"letter_j_upper": @"key_j",
// @"letter_k_lower": @"key_k",
// @"letter_k_upper": @"key_k",
// @"letter_l_lower": @"key_l",
// @"letter_l_upper": @"key_l",
//
// @"letter_z_lower": @"key_z",
// @"letter_z_upper": @"key_z",
// @"letter_x_lower": @"key_x",
// @"letter_x_upper": @"key_x",
// @"letter_c_lower": @"key_c",
// @"letter_c_upper": @"key_c",
// @"letter_v_lower": @"key_v",
// @"letter_v_upper": @"key_v",
// @"letter_b_lower": @"key_b",
// @"letter_b_upper": @"key_b",
// @"letter_n_lower": @"key_n",
// @"letter_n_upper": @"key_n",
// @"letter_m_lower": @"key_m",
// @"letter_m_upper": @"key_m",
//
// //
// @"space": @"key_space", //
// @"backspace": @"key_del", //
// @"shift": @"key_up", // Shift
// @"mode_123": @"key_123", // "123"
// @"ai": @"key_ai", // AI
// @"return": @"key_send" // /
// }
// }
// ];
2025-11-04 21:01:46 +08:00
self.skins = @[
2025-11-18 20:53:47 +08:00
@{
2025-11-19 15:39:47 +08:00
@"id": @"local001",
2025-11-19 20:30:30 +08:00
@"name": KBLocalized(@"本地001皮肤"),
2025-11-19 15:39:47 +08:00
// zip_url bundle:// +
@"zip_url": @"bundle://001.zip",
// 便
2025-11-18 20:53:47 +08:00
@"background": @"#F5FFE8",
@"key_bg": @"#FFFFFF",
@"key_text": @"#4A4A4A",
@"key_highlight": @"#D9F4C4",
2025-11-19 15:39:47 +08:00
@"accent": @"#A4D68A"
// key_icons
2025-11-18 20:53:47 +08:00
}
2025-11-04 21:01:46 +08:00
];
2025-11-18 13:48:22 +08:00
self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, KB_NAV_TOTAL_HEIGHT, KB_SCREEN_WIDTH, KB_SCREEN_HEIGHT - KB_NAV_TOTAL_HEIGHT) style:UITableViewStyleInsetGrouped];
2025-11-04 21:01:46 +08:00
self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.tableView.delegate = self; self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
2025-11-19 20:30:30 +08:00
//
UIButton *reset = [UIButton buttonWithType:UIButtonTypeSystem];
[reset setTitle:KBLocalized(@"恢复默认皮肤") forState:UIControlStateNormal];
reset.titleLabel.font = [UIFont systemFontOfSize:15 weight:UIFontWeightMedium];
reset.layer.cornerRadius = 8.0;
reset.layer.borderWidth = 1.0;
reset.layer.borderColor = [UIColor colorWithWhite:0.85 alpha:1.0].CGColor;
[reset addTarget:self action:@selector(onResetDefault:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:reset];
self.resetButton = reset;
[reset mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.view).offset(16);
make.right.equalTo(self.view).offset(-16);
make.bottom.equalTo(self.view.mas_safeAreaLayoutGuideBottom).offset(-16);
make.height.mas_equalTo(44);
}];
// tableView
UIEdgeInsets inset = self.tableView.contentInset;
inset.bottom += 44 + 24; // +
self.tableView.contentInset = inset;
self.tableView.scrollIndicatorInsets = inset;
2025-11-04 21:01:46 +08:00
}
#pragma mark - UITableView
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.skins.count; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cid = @"skin.cell";
KBSkinCell *cell = [tableView dequeueReusableCellWithIdentifier:cid];
if (!cell) { cell = [[KBSkinCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cid]; }
NSDictionary *skin = self.skins[indexPath.row];
cell.textLabel.text = skin[@"name"]; cell.detailTextLabel.text = skin[@"id"];
[cell.applyBtn removeTarget:nil action:NULL forControlEvents:UIControlEventTouchUpInside];
[cell.applyBtn addTarget:self action:@selector(onApplyBtn:) forControlEvents:UIControlEventTouchUpInside];
cell.applyBtn.tag = indexPath.row;
return cell;
}
- (void)onApplyBtn:(UIButton *)sender {
NSInteger idx = sender.tag;
if (idx < 0 || idx >= self.skins.count) return;
NSDictionary *skin = self.skins[idx];
2025-11-18 20:53:47 +08:00
if (!skin) return;
2025-11-19 20:16:19 +08:00
[[KBSkinService shared] applySkinWithJSON:skin
fromViewController:self
mode:KBSkinSourceModeLocalBundleZip
completion:nil];
2025-11-04 21:01:46 +08:00
}
2025-11-19 20:30:30 +08:00
- (void)onResetDefault:(UIButton *)sender {
// JSON
[[KBSkinService shared] applySkinWithJSON:@{}
fromViewController:self
mode:KBSkinSourceModeResetToDefault
completion:nil];
}
2025-11-04 21:01:46 +08:00
@end