// // KBSkinCenterVC.m // #import "KBSkinCenterVC.h" #import "Masonry.h" #import "KBNetworkManager.h" #import "KBSkinManager.h" #import "KBHUD.h" #import "KBConfig.h" #import "KBSkinService.h" #import "KBSkinInstallBridge.h" @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]; [_applyBtn setTitle:KBLocalized(@"Download & Apply") forState:UIControlStateNormal]; _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_greaterThanOrEqualTo(110); make.height.mas_equalTo(34); }]; } return self; } @end @interface KBSkinCenterVC () @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, copy) NSArray *skins; // 每个元素即一套皮肤的 JSON(与后端约定格式一致) @property (nonatomic, strong) UIButton *resetButton; @end @implementation KBSkinCenterVC - (void)viewDidLoad { [super viewDidLoad]; // self.title = KBLocalized(@"皮肤中心"); self.view.backgroundColor = [UIColor whiteColor]; self.skins = @[ @{ @"id": @"local本地", @"name": KBLocalized(@"粉色皮肤"), // 关键:zip_url 写成 bundle:// 前缀 + 文件名 @"zip_url": @"bundle://fense.zip", // 颜色你可以先随便写一套,或者继承默认 @"background": @"#F5FFE8", @"key_bg": @"#FFFFFF", @"key_text": @"#4A4A4A", @"key_highlight": @"#D9F4C4", @"accent": @"#A4D68A" // 不写 key_icons,代码会自动用本地那份映射表 }, @{ @"id": @"remote002", @"name": KBLocalized(@"远程皮肤"), // 关键:zip_url 写成 bundle:// 前缀 + 文件名 @"zip_url": @"http://gx.zhukeping.com/download/Christmas.zip", // // 颜色你可以先随便写一套,或者继承默认 // @"background": @"#F5FFE8", // @"key_bg": @"#FFFFFF", // @"key_text": @"#4A4A4A", // @"key_highlight": @"#D9F4C4", // @"accent": @"#A4D68A" // 不写 key_icons,代码会自动用本地那份映射表 } ]; self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, KB_NAV_TOTAL_HEIGHT, KB_SCREEN_WIDTH, KB_SCREEN_HEIGHT - KB_NAV_TOTAL_HEIGHT) style:UITableViewStyleInsetGrouped]; self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.tableView.delegate = self; self.tableView.dataSource = self; [self.view addSubview:self.tableView]; // 底部添加“恢复默认皮肤”测试按钮 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; [[KBNetworkManager shared] GET:@"https://www.apple.com" parameters:nil headers:nil completion:^(id jsonOrData, NSURLResponse *response, NSError *error) { NSLog(@"[Test] apple.com finished, error = %@", error); }]; } #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]; if (!skin) return; if (idx == 0) { // NSString *title = (indexPath.item < self.dataSource.count) ? self.dataSource[indexPath.item] : KBLocalized(@"专属皮肤002"); // 将需求固定到 002.zip,本地写死皮肤 id,便于键盘扩展识别并解压。 static NSString * const kKBBundleSkinId002 = @"bundle_skin_fense"; [KBSkinInstallBridge publishBundleSkinRequestWithId:kKBBundleSkinId002 name:@"" ?: kKBBundleSkinId002 zipName:@"fense.zip" iconShortNames:nil]; [KBHUD showInfo:KBLocalized(@"已通知键盘解压,切换到自定义键盘即可生效")]; }else if (idx == 1){ [[KBSkinService shared] applySkinWithJSON:skin fromViewController:self mode:KBSkinSourceModeRemoteZip completion:nil]; }else if (idx == 2){ // [[KBSkinService shared] applySkinWithJSON:skin // fromViewController:self // mode:KBSkinSourceModeLocalBundleZip // completion:nil]; static NSString * const kKBBundleSkinId002 = @"bundle_Christmas"; [KBSkinInstallBridge publishBundleSkinRequestWithId:kKBBundleSkinId002 name:@"" ?: kKBBundleSkinId002 zipName:@"Christmas.zip" iconShortNames:nil]; [KBHUD showInfo:KBLocalized(@"已通知键盘解压,切换到自定义键盘即可生效")]; } } - (void)onResetDefault:(UIButton *)sender { // 不需要皮肤 JSON,传空字典即可 [[KBSkinService shared] applySkinWithJSON:@{} fromViewController:self mode:KBSkinSourceModeResetToDefault completion:nil]; } @end