固定键盘高度250

优化kbkeyboardview
优化ui
This commit is contained in:
2025-11-21 16:22:00 +08:00
parent c371c7224e
commit 0f4ca89060
5 changed files with 326 additions and 241 deletions

View File

@@ -22,7 +22,7 @@
- (void)kb_consumePendingShopSkin; - (void)kb_consumePendingShopSkin;
@end @end
static CGFloat KEYBOARDHEIGHT = 256 + 20; static CGFloat KEYBOARDHEIGHT = 200 + 50;
static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center, static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center,
void *observer, void *observer,
@@ -84,10 +84,17 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center,
- (void)setupUI { - (void)setupUI {
// High self.view.translatesAutoresizingMaskIntoConstraints = NO;
NSLayoutConstraint *h = [self.view.heightAnchor constraintEqualToConstant:KEYBOARDHEIGHT];
h.priority = UILayoutPriorityDefaultHigh; // 750 CGFloat keyboardHeight = KEYBOARDHEIGHT; // 250
h.active = YES; CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
NSLayoutConstraint *h = [self.view.heightAnchor constraintEqualToConstant:keyboardHeight];
NSLayoutConstraint *w = [self.view.widthAnchor constraintEqualToConstant:screenWidth];
h.priority = UILayoutPriorityRequired;
w.priority = UILayoutPriorityRequired;
[NSLayoutConstraint activateConstraints:@[h, w]];
// UIInputView // UIInputView
if ([self.view isKindOfClass:[UIInputView class]]) { if ([self.view isKindOfClass:[UIInputView class]]) {
UIInputView *iv = (UIInputView *)self.view; UIInputView *iv = (UIInputView *)self.view;
@@ -200,7 +207,9 @@ static void KBSkinInstallNotificationCallback(CFNotificationCenterRef center,
- (void)keyBoardMainView:(KBKeyBoardMainView *)keyBoardMainView didTapToolActionAtIndex:(NSInteger)index { - (void)keyBoardMainView:(KBKeyBoardMainView *)keyBoardMainView didTapToolActionAtIndex:(NSInteger)index {
if (index == 0) { if (index == 0) {
[self showFunctionPanel:YES]; ///
[KBHUD showInfo:KBLocalized(@"Recharge Now")];
// [self showFunctionPanel:YES];
} else { } else {
[self showFunctionPanel:NO]; [self showFunctionPanel:NO];
} }

View File

@@ -23,16 +23,12 @@
- (instancetype)initWithFrame:(CGRect)frame { - (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) { if (self = [super initWithFrame:frame]) {
self.backgroundColor = [KBSkinManager shared].current.keyboardBackground; self.backgroundColor = [KBSkinManager shared].current.keyboardBackground;
// //
self.topBar = [[KBToolBar alloc] init]; self.topBar = [[KBToolBar alloc] init];
self.topBar.delegate = self; self.topBar.delegate = self;
[self addSubview:self.topBar]; [self addSubview:self.topBar];
[self.topBar mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(self.mas_top).offset(6);
make.height.mas_equalTo(40);
}];
// //
self.keyboardView = [[KBKeyboardView alloc] init]; self.keyboardView = [[KBKeyboardView alloc] init];
self.keyboardView.delegate = self; self.keyboardView.delegate = self;
@@ -44,6 +40,14 @@
make.bottom.equalTo(self.mas_bottom).offset(-4); make.bottom.equalTo(self.mas_bottom).offset(-4);
}]; }];
[self.topBar mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.right.equalTo(self);
make.top.equalTo(self.mas_top).offset(0);
// make.height.mas_equalTo(40);
make.bottom.equalTo(self.keyboardView.mas_top).offset(-6);
}];
// / // /
} }

View File

@@ -10,6 +10,24 @@
#import "KBSkinManager.h" #import "KBSkinManager.h"
#import "KBKeyPreviewView.h" #import "KBKeyPreviewView.h"
// UI 便
static const CGFloat kKBRowVerticalSpacing = 8.0;
static const CGFloat kKBRowHorizontalInset = 6.0;
static const CGFloat kKBRowHeight = 40.0;
static const NSTimeInterval kKBBackspaceLongPressMinDuration = 0.35;
static const NSTimeInterval kKBBackspaceRepeatInterval = 0.06;
static const NSTimeInterval kKBPreviewShowDuration = 0.08;
static const NSTimeInterval kKBPreviewHideDuration = 0.06;
static const CGFloat kKBSpecialKeySquareMultiplier = 1.2;
static const CGFloat kKBReturnWidthMultiplier = 2.4;
static const CGFloat kKBSpaceWidthMultiplier = 3.0;
//
static const CGFloat kKBLettersRow2EdgeSpacerMultiplier = 0.5;
@interface KBKeyboardView () @interface KBKeyboardView ()
@property (nonatomic, strong) UIView *row1; @property (nonatomic, strong) UIView *row1;
@property (nonatomic, strong) UIView *row2; @property (nonatomic, strong) UIView *row2;
@@ -44,36 +62,39 @@
} }
} }
#pragma mark - Base Layout
- (void)buildBase { - (void)buildBase {
[self addSubview:self.row1]; [self addSubview:self.row1];
[self addSubview:self.row2]; [self addSubview:self.row2];
[self addSubview:self.row3]; [self addSubview:self.row3];
[self addSubview:self.row4]; [self addSubview:self.row4];
CGFloat vSpacing = 8;
[self.row1 mas_makeConstraints:^(MASConstraintMaker *make) { [self.row1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.mas_top).offset(8); make.top.equalTo(self.mas_top).offset(kKBRowVerticalSpacing);
make.left.right.equalTo(self); make.left.right.equalTo(self);
make.height.mas_equalTo(40); make.height.mas_equalTo(kKBRowHeight);
}]; }];
[self.row2 mas_makeConstraints:^(MASConstraintMaker *make) { [self.row2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.row1.mas_bottom).offset(vSpacing); make.top.equalTo(self.row1.mas_bottom).offset(kKBRowVerticalSpacing);
make.left.right.equalTo(self); make.left.right.equalTo(self);
make.height.equalTo(self.row1); make.height.equalTo(self.row1);
}]; }];
[self.row3 mas_makeConstraints:^(MASConstraintMaker *make) { [self.row3 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.row2.mas_bottom).offset(vSpacing); make.top.equalTo(self.row2.mas_bottom).offset(kKBRowVerticalSpacing);
make.left.right.equalTo(self); make.left.right.equalTo(self);
make.height.equalTo(self.row1); make.height.equalTo(self.row1);
}]; }];
[self.row4 mas_makeConstraints:^(MASConstraintMaker *make) { [self.row4 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.row3.mas_bottom).offset(vSpacing); make.top.equalTo(self.row3.mas_bottom).offset(kKBRowVerticalSpacing);
make.left.right.equalTo(self); make.left.right.equalTo(self);
make.height.equalTo(self.row1); make.height.equalTo(self.row1);
make.bottom.equalTo(self.mas_bottom).offset(-6); make.bottom.equalTo(self.mas_bottom).offset(-6);
}]; }];
} }
#pragma mark - Public
- (void)reloadKeys { - (void)reloadKeys {
// //
for (UIView *row in @[self.row1, self.row2, self.row3, self.row4]) { for (UIView *row in @[self.row1, self.row2, self.row3, self.row4]) {
@@ -81,148 +102,49 @@
} }
self.keysForRows = [self buildKeysForCurrentLayout]; self.keysForRows = [self buildKeysForCurrentLayout];
if (self.keysForRows.count < 4) return;
[self buildRow:self.row1 withKeys:self.keysForRows[0]]; [self buildRow:self.row1 withKeys:self.keysForRows[0]];
// //
CGFloat row2Spacer = (self.layoutStyle == KBKeyboardLayoutStyleLetters) ? 0.5 : 0.0; CGFloat row2Spacer = (self.layoutStyle == KBKeyboardLayoutStyleLetters)
? kKBLettersRow2EdgeSpacerMultiplier : 0.0;
[self buildRow:self.row2 withKeys:self.keysForRows[1] edgeSpacerMultiplier:row2Spacer]; [self buildRow:self.row2 withKeys:self.keysForRows[1] edgeSpacerMultiplier:row2Spacer];
[self buildRow:self.row3 withKeys:self.keysForRows[2]]; [self buildRow:self.row3 withKeys:self.keysForRows[2]];
[self buildRow:self.row4 withKeys:self.keysForRows[3]]; [self buildRow:self.row4 withKeys:self.keysForRows[3]];
} }
#pragma mark - Key Model Construction
// KBKey
- (NSArray<NSArray<KBKey *> *> *)buildKeysForCurrentLayout { - (NSArray<NSArray<KBKey *> *> *)buildKeysForCurrentLayout {
if (self.layoutStyle == KBKeyboardLayoutStyleNumbers) { if (self.layoutStyle == KBKeyboardLayoutStyleNumbers) {
// /3 + return [self buildKeysForNumbersLayout];
NSArray *r1 = nil; } else {
NSArray *r2 = nil; return [self buildKeysForLettersLayout];
NSArray *r3 = nil;
if (!self.symbolsMoreOn) {
// 123
r1 = @[ [KBKey keyWithIdentifier:@"digit_1" title:@"1" output:@"1" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_2" title:@"2" output:@"2" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_3" title:@"3" output:@"3" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_4" title:@"4" output:@"4" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_5" title:@"5" output:@"5" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_6" title:@"6" output:@"6" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_7" title:@"7" output:@"7" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_8" title:@"8" output:@"8" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_9" title:@"9" output:@"9" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_0" title:@"0" output:@"0" type:KBKeyTypeCharacter] ];
r2 = @[ [KBKey keyWithIdentifier:@"sym_minus" title:@"-" output:@"-" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_slash" title:@"/" output:@"/" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_colon" title:@":" output:@":" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_semicolon" title:@";" output:@";" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_paren_l" title:@"(" output:@"(" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_paren_r" title:@")" output:@")" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_dollar" title:@"$" output:@"$" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_amp" title:@"&" output:@"&" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_at" title:@"@" output:@"@" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_quote_double" title:@"\"" output:@"\"" type:KBKeyTypeCharacter] ];
// #+=退
KBKey *toggle = [KBKey keyWithIdentifier:@"symbols_toggle_more"
title:@"#+="
output:@""
type:KBKeyTypeSymbolsToggle];
KBKey *comma = [KBKey keyWithIdentifier:@"sym_comma" title:@"," output:@"," type:KBKeyTypeCharacter];
KBKey *dot = [KBKey keyWithIdentifier:@"sym_dot" title:@"." output:@"." type:KBKeyTypeCharacter];
KBKey *q = [KBKey keyWithIdentifier:@"sym_question" title:@"?" output:@"?" type:KBKeyTypeCharacter];
KBKey *ex = [KBKey keyWithIdentifier:@"sym_exclam" title:@"!" output:@"!" type:KBKeyTypeCharacter];
KBKey *quote = [KBKey keyWithIdentifier:@"sym_quote_single" title:@"'" output:@"'" type:KBKeyTypeCharacter];
KBKey *back = [KBKey keyWithIdentifier:@"backspace"
title:@"⌫"
output:@""
type:KBKeyTypeBackspace];
r3 = @[ toggle, comma, dot, q, ex, quote, back ];
} else {
// #+=123
r1 = @[ [KBKey keyWithIdentifier:@"sym_bracket_l" title:@"[" output:@"[" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_bracket_r" title:@"]" output:@"]" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_brace_l" title:@"{" output:@"{" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_brace_r" title:@"}" output:@"}" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_hash" title:@"#" output:@"#" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_percent" title:@"%" output:@"%" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_caret" title:@"^" output:@"^" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_asterisk" title:@"*" output:@"*" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_plus" title:@"+" output:@"+" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_equal" title:@"=" output:@"=" type:KBKeyTypeCharacter] ];
r2 = @[ [KBKey keyWithIdentifier:@"sym_underscore" title:@"_" output:@"_" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_backslash" title:@"\\" output:@"\\" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_pipe" title:@"|" output:@"|" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_tilde" title:@"~" output:@"~" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_lt" title:@"<" output:@"<" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_gt" title:@">" output:@">" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_dollar" title:@"$" output:@"$" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_euro" title:@"€" output:@"€" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_pound" title:@"£" output:@"£" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_bullet" title:@"•" output:@"•" type:KBKeyTypeCharacter] ];
KBKey *toggle = [KBKey keyWithIdentifier:@"symbols_toggle_123"
title:@"123"
output:@""
type:KBKeyTypeSymbolsToggle];
KBKey *comma = [KBKey keyWithIdentifier:@"sym_comma" title:@"," output:@"," type:KBKeyTypeCharacter];
KBKey *dot = [KBKey keyWithIdentifier:@"sym_dot" title:@"." output:@"." type:KBKeyTypeCharacter];
KBKey *q = [KBKey keyWithIdentifier:@"sym_question" title:@"?" output:@"?" type:KBKeyTypeCharacter];
KBKey *ex = [KBKey keyWithIdentifier:@"sym_exclam" title:@"!" output:@"!" type:KBKeyTypeCharacter];
KBKey *quote = [KBKey keyWithIdentifier:@"sym_quote_single" title:@"'" output:@"'" type:KBKeyTypeCharacter];
KBKey *back = [KBKey keyWithIdentifier:@"backspace"
title:@"⌫"
output:@""
type:KBKeyTypeBackspace];
r3 = @[ toggle, comma, dot, q, ex, quote, back ];
}
KBKey *modeABC = [KBKey keyWithIdentifier:@"mode_abc"
title:@"abc"
output:@""
type:KBKeyTypeModeChange];
KBKey *customAI = [KBKey keyWithIdentifier:@"ai"
title:@"AI"
output:@""
type:KBKeyTypeCustom];
KBKey *space = [KBKey keyWithIdentifier:@"space"
title:@"space"
output:@" "
type:KBKeyTypeSpace];
KBKey *ret = [KBKey keyWithIdentifier:@"return"
title:KBLocalized(@"Send")
output:@"\n"
type:KBKeyTypeReturn];
NSArray *r4 = @[ modeABC, customAI, space, ret ];
return @[r1, r2, r3, r4];
} }
}
#pragma mark - Letters Layout
- (NSArray<NSArray<KBKey *> *> *)buildKeysForLettersLayout {
// QWERTY // QWERTY
NSArray *r1 = @[ @"Q", @"W", @"E", @"R", @"T", @"Y", @"U", @"I", @"O", @"P" ]; NSArray *r1Letters = @[ @"q", @"w", @"e", @"r", @"t", @"y", @"u", @"i", @"o", @"p" ];
NSArray *r2 = @[ @"A", @"S", @"D", @"F", @"G", @"H", @"J", @"K", @"L" ]; NSArray *r2Letters = @[ @"a", @"s", @"d", @"f", @"g", @"h", @"j", @"k", @"l" ];
NSArray *r3chars = @[ @"Z", @"X", @"C", @"V", @"B", @"N", @"M" ]; NSArray *r3Letters = @[ @"z", @"x", @"c", @"v", @"b", @"n", @"m" ];
NSMutableArray *row1 = [NSMutableArray arrayWithCapacity:r1.count]; NSMutableArray *row1 = [NSMutableArray arrayWithCapacity:r1Letters.count];
// Shift for (NSString *s in r1Letters) {
for (NSString *s in r1) { [row1 addObject:[self kb_letterKeyWithChar:s]];
NSString *shown = self.shiftOn ? s : s.lowercaseString;
NSString *identifier = [NSString stringWithFormat:@"letter_%@", s.lowercaseString];
KBKey *k = [KBKey keyWithIdentifier:identifier
title:shown
output:shown
type:KBKeyTypeCharacter];
k.caseVariant = self.shiftOn ? KBKeyCaseVariantUpper : KBKeyCaseVariantLower;
[row1 addObject:k];
} }
NSMutableArray *row2 = [NSMutableArray arrayWithCapacity:r2.count]; NSMutableArray *row2 = [NSMutableArray arrayWithCapacity:r2Letters.count];
for (NSString *s in r2) { for (NSString *s in r2Letters) {
NSString *shown = self.shiftOn ? s : s.lowercaseString; [row2 addObject:[self kb_letterKeyWithChar:s]];
NSString *identifier = [NSString stringWithFormat:@"letter_%@", s.lowercaseString];
KBKey *k = [KBKey keyWithIdentifier:identifier
title:shown
output:shown
type:KBKeyTypeCharacter];
k.caseVariant = self.shiftOn ? KBKeyCaseVariantUpper : KBKeyCaseVariantLower;
[row2 addObject:k];
} }
// Shift + Z...M + Backspace
NSMutableArray *row3 = [NSMutableArray array]; NSMutableArray *row3 = [NSMutableArray array];
KBKey *shift = [KBKey keyWithIdentifier:@"shift" KBKey *shift = [KBKey keyWithIdentifier:@"shift"
title:@"⇧" title:@"⇧"
@@ -233,22 +155,126 @@
// - shift.caseVariant = Upper 使 "shift_upper" // - shift.caseVariant = Upper 使 "shift_upper"
shift.caseVariant = self.shiftOn ? KBKeyCaseVariantUpper : KBKeyCaseVariantLower; shift.caseVariant = self.shiftOn ? KBKeyCaseVariantUpper : KBKeyCaseVariantLower;
[row3 addObject:shift]; [row3 addObject:shift];
for (NSString *s in r3chars) {
NSString *shown = self.shiftOn ? s : s.lowercaseString; for (NSString *s in r3Letters) {
NSString *identifier = [NSString stringWithFormat:@"letter_%@", s.lowercaseString]; [row3 addObject:[self kb_letterKeyWithChar:s]];
KBKey *k = [KBKey keyWithIdentifier:identifier
title:shown
output:shown
type:KBKeyTypeCharacter];
k.caseVariant = self.shiftOn ? KBKeyCaseVariantUpper : KBKeyCaseVariantLower;
[row3 addObject:k];
} }
KBKey *backspace = [KBKey keyWithIdentifier:@"backspace" KBKey *backspace = [KBKey keyWithIdentifier:@"backspace"
title:@"⌫" title:@"⌫"
output:@"" output:@""
type:KBKeyTypeBackspace]; type:KBKeyTypeBackspace];
[row3 addObject:backspace]; [row3 addObject:backspace];
NSArray *row4 = [self kb_bottomControlRowKeysForLettersLayout];
return @[row1.copy, row2.copy, row3.copy, row4];
}
#pragma mark - Numbers / Symbols Layout
- (NSArray<NSArray<KBKey *> *> *)buildKeysForNumbersLayout {
// /3 +
NSArray *r1 = nil;
NSArray *r2 = nil;
NSArray *r3 = nil;
if (!self.symbolsMoreOn) {
// 123
r1 = @[ [KBKey keyWithIdentifier:@"digit_1" title:@"1" output:@"1" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_2" title:@"2" output:@"2" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_3" title:@"3" output:@"3" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_4" title:@"4" output:@"4" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_5" title:@"5" output:@"5" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_6" title:@"6" output:@"6" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_7" title:@"7" output:@"7" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_8" title:@"8" output:@"8" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_9" title:@"9" output:@"9" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"digit_0" title:@"0" output:@"0" type:KBKeyTypeCharacter] ];
r2 = @[ [KBKey keyWithIdentifier:@"sym_minus" title:@"-" output:@"-" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_slash" title:@"/" output:@"/" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_colon" title:@":" output:@":" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_semicolon" title:@";" output:@";" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_paren_l" title:@"(" output:@"(" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_paren_r" title:@")" output:@")" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_dollar" title:@"$" output:@"$" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_amp" title:@"&" output:@"&" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_at" title:@"@" output:@"@" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_quote_double" title:@"\"" output:@"\"" type:KBKeyTypeCharacter] ];
r3 = [self kb_symbolsCommonThirdRowWithToggleIsMore:NO];
} else {
// #+=123
r1 = @[ [KBKey keyWithIdentifier:@"sym_bracket_l" title:@"[" output:@"[" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_bracket_r" title:@"]" output:@"]" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_brace_l" title:@"{" output:@"{" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_brace_r" title:@"}" output:@"}" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_hash" title:@"#" output:@"#" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_percent" title:@"%" output:@"%" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_caret" title:@"^" output:@"^" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_asterisk" title:@"*" output:@"*" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_plus" title:@"+" output:@"+" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_equal" title:@"=" output:@"=" type:KBKeyTypeCharacter] ];
r2 = @[ [KBKey keyWithIdentifier:@"sym_underscore" title:@"_" output:@"_" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_backslash" title:@"\\" output:@"\\" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_pipe" title:@"|" output:@"|" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_tilde" title:@"~" output:@"~" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_lt" title:@"<" output:@"<" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_gt" title:@">" output:@">" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_dollar" title:@"$" output:@"$" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_euro" title:@"€" output:@"€" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_pound" title:@"£" output:@"£" type:KBKeyTypeCharacter],
[KBKey keyWithIdentifier:@"sym_bullet" title:@"•" output:@"•" type:KBKeyTypeCharacter] ];
r3 = [self kb_symbolsCommonThirdRowWithToggleIsMore:YES];
}
NSArray *r4 = [self kb_bottomControlRowKeysForNumbersLayout];
return @[r1, r2, r3, r4];
}
#pragma mark - Key Factories
// shiftOn
- (KBKey *)kb_letterKeyWithChar:(NSString *)charString {
NSParameterAssert(charString.length == 1);
NSString *lower = charString.lowercaseString;
NSString *upper = charString.uppercaseString;
NSString *shown = self.shiftOn ? upper : lower;
NSString *identifier = [NSString stringWithFormat:@"letter_%@", lower];
KBKey *k = [KBKey keyWithIdentifier:identifier
title:shown
output:shown
type:KBKeyTypeCharacter];
k.caseVariant = self.shiftOn ? KBKeyCaseVariantUpper : KBKeyCaseVariantLower;
return k;
}
// 123 #+=
- (NSArray<KBKey *> *)kb_symbolsCommonThirdRowWithToggleIsMore:(BOOL)isMorePage {
NSString *identifier = isMorePage ? @"symbols_toggle_123" : @"symbols_toggle_more";
NSString *title = isMorePage ? @"123" : @"#+=";
KBKey *toggle = [KBKey keyWithIdentifier:identifier
title:title
output:@""
type:KBKeyTypeSymbolsToggle];
KBKey *comma = [KBKey keyWithIdentifier:@"sym_comma" title:@"," output:@"," type:KBKeyTypeCharacter];
KBKey *dot = [KBKey keyWithIdentifier:@"sym_dot" title:@"." output:@"." type:KBKeyTypeCharacter];
KBKey *q = [KBKey keyWithIdentifier:@"sym_question" title:@"?" output:@"?" type:KBKeyTypeCharacter];
KBKey *ex = [KBKey keyWithIdentifier:@"sym_exclam" title:@"!" output:@"!" type:KBKeyTypeCharacter];
KBKey *quote = [KBKey keyWithIdentifier:@"sym_quote_single" title:@"'" output:@"'" type:KBKeyTypeCharacter];
KBKey *back = [KBKey keyWithIdentifier:@"backspace"
title:@"⌫"
output:@""
type:KBKeyTypeBackspace];
return @[ toggle, comma, dot, q, ex, quote, back ];
}
//
- (NSArray<KBKey *> *)kb_bottomControlRowKeysForLettersLayout {
KBKey *mode123 = [KBKey keyWithIdentifier:@"mode_123" KBKey *mode123 = [KBKey keyWithIdentifier:@"mode_123"
title:@"123" title:@"123"
output:@"" output:@""
@@ -265,26 +291,49 @@
title:KBLocalized(@"Send") title:KBLocalized(@"Send")
output:@"\n" output:@"\n"
type:KBKeyTypeReturn]; type:KBKeyTypeReturn];
return @[ mode123, customAI, space, ret ];
NSArray *row4 = @[ mode123, customAI, space, ret ];
return @[row1.copy, row2.copy, row3.copy, row4];
} }
//
- (NSArray<KBKey *> *)kb_bottomControlRowKeysForNumbersLayout {
KBKey *modeABC = [KBKey keyWithIdentifier:@"mode_abc"
title:@"abc"
output:@""
type:KBKeyTypeModeChange];
KBKey *customAI = [KBKey keyWithIdentifier:@"ai"
title:@"AI"
output:@""
type:KBKeyTypeCustom];
KBKey *space = [KBKey keyWithIdentifier:@"space"
title:@"space"
output:@" "
type:KBKeyTypeSpace];
KBKey *ret = [KBKey keyWithIdentifier:@"return"
title:KBLocalized(@"Send")
output:@"\n"
type:KBKeyTypeReturn];
return @[ modeABC, customAI, space, ret ];
}
#pragma mark - Row Building
- (void)buildRow:(UIView *)row withKeys:(NSArray<KBKey *> *)keys { - (void)buildRow:(UIView *)row withKeys:(NSArray<KBKey *> *)keys {
[self buildRow:row withKeys:keys edgeSpacerMultiplier:0.0]; [self buildRow:row withKeys:keys edgeSpacerMultiplier:0.0];
} }
- (void)buildRow:(UIView *)row withKeys:(NSArray<KBKey *> *)keys edgeSpacerMultiplier:(CGFloat)edgeSpacerMultiplier { - (void)buildRow:(UIView *)row
withKeys:(NSArray<KBKey *> *)keys
edgeSpacerMultiplier:(CGFloat)edgeSpacerMultiplier {
// 4 使 // 4 使
// 123/ABCAISend Space // 123/ABCAISend Space
BOOL isBottomControlRow = [self kb_isBottomControlRowWithKeys:keys]; BOOL isBottomControlRow = [self kb_isBottomControlRowWithKeys:keys];
CGFloat hInset = 6; //
CGFloat spacing = 0; // CGFloat spacing = 0; //
UIView *previous = nil; UIView *previous = nil;
UIView *leftSpacer = nil; UIView *leftSpacer = nil;
UIView *rightSpacer = nil; UIView *rightSpacer = nil;
if (edgeSpacerMultiplier > 0.0) { if (edgeSpacerMultiplier > 0.0) {
leftSpacer = [UIView new]; leftSpacer = [UIView new];
rightSpacer = [UIView new]; rightSpacer = [UIView new];
@@ -293,16 +342,17 @@
[row addSubview:leftSpacer]; [row addSubview:leftSpacer];
[row addSubview:rightSpacer]; [row addSubview:rightSpacer];
[leftSpacer mas_makeConstraints:^(MASConstraintMaker *make) { [leftSpacer mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(row.mas_left).offset(hInset); make.left.equalTo(row.mas_left).offset(kKBRowHorizontalInset);
make.centerY.equalTo(row); make.centerY.equalTo(row);
make.height.mas_equalTo(1); make.height.mas_equalTo(1);
}]; }];
[rightSpacer mas_makeConstraints:^(MASConstraintMaker *make) { [rightSpacer mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(row.mas_right).offset(-hInset); make.right.equalTo(row.mas_right).offset(-kKBRowHorizontalInset);
make.centerY.equalTo(row); make.centerY.equalTo(row);
make.height.mas_equalTo(1); make.height.mas_equalTo(1);
}]; }];
} }
for (NSInteger i = 0; i < keys.count; i++) { for (NSInteger i = 0; i < keys.count; i++) {
KBKey *key = keys[i]; KBKey *key = keys[i];
KBKeyButton *btn = [[KBKeyButton alloc] init]; KBKeyButton *btn = [[KBKeyButton alloc] init];
@@ -313,12 +363,12 @@
[btn addTarget:self action:@selector(onKeyTapped:) forControlEvents:UIControlEventTouchUpInside]; [btn addTarget:self action:@selector(onKeyTapped:) forControlEvents:UIControlEventTouchUpInside];
[row addSubview:btn]; [row addSubview:btn];
// NSTimer使 UILongPressGestureRecognizer // NSTimer使 UILongPressGestureRecognizer
// 1
if (key.type == KBKeyTypeBackspace) { if (key.type == KBKeyTypeBackspace) {
UILongPressGestureRecognizer *lp = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(onBackspaceLongPress:)]; UILongPressGestureRecognizer *lp =
// 0.5s [[UILongPressGestureRecognizer alloc] initWithTarget:self
lp.minimumPressDuration = 0.35; action:@selector(onBackspaceLongPress:)];
lp.minimumPressDuration = kKBBackspaceLongPressMinDuration;
lp.cancelsTouchesInView = YES; // lp.cancelsTouchesInView = YES; //
[btn addGestureRecognizer:lp]; [btn addGestureRecognizer:lp];
} }
@@ -336,35 +386,38 @@
if (leftSpacer) { if (leftSpacer) {
make.left.equalTo(leftSpacer.mas_right).offset(spacing); make.left.equalTo(leftSpacer.mas_right).offset(spacing);
} else { } else {
make.left.equalTo(row.mas_left).offset(hInset); make.left.equalTo(row.mas_left).offset(kKBRowHorizontalInset);
} }
} }
}]; }];
// //
if (key.type == KBKeyTypeCharacter) { if (key.type == KBKeyTypeCharacter) {
if (previous && previous != nil) { if (previous && [previous isKindOfClass:[KBKeyButton class]]) {
if (((KBKeyButton *)previous).key.type == KBKeyTypeCharacter) { KBKeyButton *prevBtn = (KBKeyButton *)previous;
if (prevBtn.key.type == KBKeyTypeCharacter) {
[btn mas_makeConstraints:^(MASConstraintMaker *make) { [btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(previous); make.width.equalTo(previous);
}]; }];
} }
} }
} else { } else {
// special keys: give 1.5x of a character key by deferring constraint equalities after loop // special keys:
} }
previous = btn; previous = btn;
} }
// 使 // 使
[previous mas_makeConstraints:^(MASConstraintMaker *make) { if (previous) {
if (rightSpacer) { [previous mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(rightSpacer.mas_left).offset(-spacing); if (rightSpacer) {
} else { make.right.equalTo(rightSpacer.mas_left).offset(-spacing);
make.right.equalTo(row.mas_right).offset(-hInset); } else {
} make.right.equalTo(row.mas_right).offset(-kKBRowHorizontalInset);
}]; }
}];
}
// 123/ABCAISend // 123/ABCAISend
// Space // Space
@@ -376,19 +429,20 @@
// //
KBKeyButton *firstChar = nil; KBKeyButton *firstChar = nil;
BOOL hasCharacterInRow = NO; BOOL hasCharacterInRow = NO;
for (KBKeyButton *b in row.subviews) { for (UIView *v in row.subviews) {
if (![b isKindOfClass:[KBKeyButton class]]) continue; if (![v isKindOfClass:[KBKeyButton class]]) continue;
KBKeyButton *b = (KBKeyButton *)v;
if (b.key.type == KBKeyTypeCharacter) { if (b.key.type == KBKeyTypeCharacter) {
firstChar = b; firstChar = b;
hasCharacterInRow = YES; hasCharacterInRow = YES;
break; break;
} }
} }
// 使 // 使
if (!firstChar) { if (!firstChar) {
for (KBKeyButton *b in row.subviews) { for (UIView *v in row.subviews) {
if ([b isKindOfClass:[KBKeyButton class]]) { if ([v isKindOfClass:[KBKeyButton class]]) {
firstChar = b; firstChar = (KBKeyButton *)v;
break; break;
} }
} }
@@ -401,41 +455,40 @@
firstChar.key.type == KBKeyTypeSymbolsToggle || firstChar.key.type == KBKeyTypeSymbolsToggle ||
firstChar.key.type == KBKeyTypeCustom)) { firstChar.key.type == KBKeyTypeCustom)) {
[firstChar mas_makeConstraints:^(MASConstraintMaker *make) { [firstChar mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(firstChar.mas_height); make.width.equalTo(firstChar.mas_height).multipliedBy(kKBSpecialKeySquareMultiplier);
}]; }];
} }
for (KBKeyButton *b in row.subviews) {
if (![b isKindOfClass:[KBKeyButton class]]) continue; for (UIView *v in row.subviews) {
// firstChar if (![v isKindOfClass:[KBKeyButton class]]) continue;
KBKeyButton *b = (KBKeyButton *)v;
// self == self * k // self == self * k
if (b == firstChar) continue; if (b == firstChar) continue;
if (b.key.type == KBKeyTypeCharacter) continue; if (b.key.type == KBKeyTypeCharacter) continue;
// 1:1
// - ShiftBackspace
// - 123/ABCModeChange#+=SymbolsToggleAICustom
// #+=
BOOL isBottomModeKey = (b.key.type == KBKeyTypeModeChange) || BOOL isBottomModeKey = (b.key.type == KBKeyTypeModeChange) ||
(b.key.type == KBKeyTypeSymbolsToggle) || (b.key.type == KBKeyTypeSymbolsToggle) ||
(b.key.type == KBKeyTypeCustom); (b.key.type == KBKeyTypeCustom);
// ~
if (b.key.type == KBKeyTypeShift || if (b.key.type == KBKeyTypeShift ||
b.key.type == KBKeyTypeBackspace || b.key.type == KBKeyTypeBackspace ||
isBottomModeKey) { isBottomModeKey) {
[b mas_makeConstraints:^(MASConstraintMaker *make) { [b mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(b.mas_height).multipliedBy(1.2); // = make.width.equalTo(b.mas_height).multipliedBy(kKBSpecialKeySquareMultiplier);
}]; }];
continue; continue;
} }
CGFloat multiplier = 1.5; CGFloat multiplier = 1.5;
// Space 4.0 3.0 // Space
if (b.key.type == KBKeyTypeSpace) { if (b.key.type == KBKeyTypeSpace) {
multiplier = 3.0; multiplier = kKBSpaceWidthMultiplier;
} }
// Send 2.4 // Send 2.4
else if (b.key.type == KBKeyTypeReturn) { else if (b.key.type == KBKeyTypeReturn) {
multiplier = 2.4; multiplier = kKBReturnWidthMultiplier;
} }
// Globe // Globe
else if (b.key.type == KBKeyTypeGlobe) { else if (b.key.type == KBKeyTypeGlobe) {
@@ -446,6 +499,7 @@
make.width.equalTo(firstChar).multipliedBy(multiplier); make.width.equalTo(firstChar).multipliedBy(multiplier);
}]; }];
} }
// //
if (leftSpacer && rightSpacer) { if (leftSpacer && rightSpacer) {
[leftSpacer mas_makeConstraints:^(MASConstraintMaker *make) { [leftSpacer mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -482,8 +536,8 @@
} }
// //
// - 123/ABCAI = // - 123/ABCAI = * multiplier
// - Send = 2.4 // - Send = 2
// - Space // - Space
- (void)kb_applyBottomControlRowWidthInRow:(UIView *)row { - (void)kb_applyBottomControlRowWidthInRow:(UIView *)row {
KBKeyButton *modeBtn = nil; KBKeyButton *modeBtn = nil;
@@ -519,14 +573,14 @@
// row1 // row1
[modeBtn mas_makeConstraints:^(MASConstraintMaker *make) { [modeBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(row.mas_height).multipliedBy(1.2); make.width.equalTo(row.mas_height).multipliedBy(kKBSpecialKeySquareMultiplier);
}]; }];
[aiBtn mas_makeConstraints:^(MASConstraintMaker *make) { [aiBtn mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.equalTo(row.mas_height).multipliedBy(1.2); make.width.equalTo(row.mas_height).multipliedBy(kKBSpecialKeySquareMultiplier);
}]; }];
[retBtn mas_makeConstraints:^(MASConstraintMaker *make) { [retBtn mas_makeConstraints:^(MASConstraintMaker *make) {
// Send 2.4 // Send 2
make.width.equalTo(modeBtn.mas_width).multipliedBy(2); make.width.equalTo(modeBtn.mas_width).multipliedBy(2.0);
}]; }];
// Space // Space
} }
@@ -571,12 +625,13 @@
CGFloat centerX = CGRectGetMidX(btnFrameInSelf); CGFloat centerX = CGRectGetMidX(btnFrameInSelf);
CGFloat centerY = CGRectGetMinY(btnFrameInSelf) - previewHeight * 0.6; CGFloat centerY = CGRectGetMinY(btnFrameInSelf) - previewHeight * 0.6;
self.previewView.frame = CGRectMake(0, 0, 40, previewHeight); // 40 previewWidth
self.previewView.frame = CGRectMake(0, 0, previewWidth, previewHeight);
self.previewView.center = CGPointMake(centerX, centerY); self.previewView.center = CGPointMake(centerX, centerY);
self.previewView.alpha = 0.0; self.previewView.alpha = 0.0;
self.previewView.hidden = NO; self.previewView.hidden = NO;
[UIView animateWithDuration:0.08 [UIView animateWithDuration:kKBPreviewShowDuration
delay:0 delay:0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseOut options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseOut
animations:^{ animations:^{
@@ -587,7 +642,7 @@
- (void)hidePreview { - (void)hidePreview {
if (!self.previewView || self.previewView.isHidden) return; if (!self.previewView || self.previewView.isHidden) return;
[UIView animateWithDuration:0.06 [UIView animateWithDuration:kKBPreviewHideDuration
delay:0 delay:0
options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseIn options:UIViewAnimationOptionBeginFromCurrentState | UIViewAnimationOptionCurveEaseIn
animations:^{ animations:^{
@@ -627,7 +682,9 @@
[proxy deleteBackward]; // 1 [proxy deleteBackward]; // 1
__weak typeof(self) weakSelf = self; __weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.06 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(kKBBackspaceRepeatInterval * NSEC_PER_SEC)),
dispatch_get_main_queue(), ^{
__strong typeof(weakSelf) selfStrong = weakSelf; __strong typeof(weakSelf) selfStrong = weakSelf;
[selfStrong kb_backspaceStep]; [selfStrong kb_backspaceStep];
}); });

View File

@@ -11,7 +11,7 @@
@interface KBToolBar () @interface KBToolBar ()
@property (nonatomic, strong) UIView *leftContainer; @property (nonatomic, strong) UIView *leftContainer;
@property (nonatomic, strong) NSArray<UIButton *> *leftButtonsInternal; @property (nonatomic, strong) NSArray<UIButton *> *leftButtonsInternal;
@property (nonatomic, strong) UIButton *settingsButtonInternal; //@property (nonatomic, strong) UIButton *settingsButtonInternal;
@property (nonatomic, strong) UIButton *globeButtonInternal; // @property (nonatomic, strong) UIButton *globeButtonInternal; //
@end @end
@@ -20,7 +20,7 @@
- (instancetype)initWithFrame:(CGRect)frame{ - (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) { if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor clearColor]; self.backgroundColor = [UIColor clearColor];
_leftButtonTitles = @[@"Item1", @"Item2", @"Item3", @"Item4"]; // _leftButtonTitles = @[KBLocalized(@"Recharge Now")]; //
[self setupUI]; [self setupUI];
} }
return self; return self;
@@ -33,9 +33,9 @@
return self.leftButtonsInternal; return self.leftButtonsInternal;
} }
- (UIButton *)settingsButton { //- (UIButton *)settingsButton {
return self.settingsButtonInternal; // return self.settingsButtonInternal;
} //}
- (void)setLeftButtonTitles:(NSArray<NSString *> *)leftButtonTitles { - (void)setLeftButtonTitles:(NSArray<NSString *> *)leftButtonTitles {
_leftButtonTitles = [leftButtonTitles copy]; _leftButtonTitles = [leftButtonTitles copy];
@@ -51,15 +51,15 @@
- (void)setupUI { - (void)setupUI {
[self addSubview:self.leftContainer]; [self addSubview:self.leftContainer];
[self addSubview:self.settingsButtonInternal]; // [self addSubview:self.settingsButtonInternal];
[self addSubview:self.globeButtonInternal]; [self addSubview:self.globeButtonInternal];
// //
[self.settingsButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) { // [self.settingsButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.equalTo(self.mas_right).offset(-12); // make.right.equalTo(self.mas_right).offset(-12);
make.centerY.equalTo(self.mas_centerY); // make.centerY.equalTo(self.mas_centerY);
make.width.height.mas_equalTo(32); // make.width.height.mas_equalTo(32);
}]; // }];
// //
[self.globeButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) { [self.globeButtonInternal mas_makeConstraints:^(MASConstraintMaker *make) {
@@ -71,33 +71,41 @@
// //
[self.leftContainer mas_makeConstraints:^(MASConstraintMaker *make) { [self.leftContainer mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.globeButtonInternal.mas_right).offset(8); make.left.equalTo(self.globeButtonInternal.mas_right).offset(8);
make.right.equalTo(self.settingsButtonInternal.mas_left).offset(-12); make.right.equalTo(self).offset(-12);
make.centerY.equalTo(self.mas_centerY); make.centerY.equalTo(self.mas_centerY);
make.height.mas_equalTo(32); make.height.mas_equalTo(32);
}]; }];
// 4 // =
NSMutableArray<UIButton *> *buttons = [NSMutableArray arrayWithCapacity:4]; NSMutableArray<UIButton *> *buttons = [NSMutableArray arrayWithCapacity:_leftButtonTitles.count];
UIView *previous = nil; UIView *previous = nil;
for (NSInteger i = 0; i < 4; i++) { for (NSInteger i = 0; i < _leftButtonTitles.count; i++) {
UIButton *btn = [self buildActionButtonAtIndex:i]; UIButton *btn = [self buildActionButtonAtIndex:i];
[self.leftContainer addSubview:btn]; [self.leftContainer addSubview:btn];
[buttons addObject:btn]; [buttons addObject:btn];
[btn mas_makeConstraints:^(MASConstraintMaker *make) { [btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.equalTo(self.leftContainer);
if (previous) { if (previous) {
make.left.equalTo(previous.mas_right).offset(8); make.left.equalTo(previous.mas_right).offset(8);
make.width.equalTo(previous);
} else { } else {
make.left.equalTo(self.leftContainer.mas_left); make.left.equalTo(self.leftContainer.mas_left);
} }
make.top.bottom.equalTo(self.leftContainer); // intrinsicContentSize
}]; }];
previous = btn; previous = btn;
} }
//
[previous mas_makeConstraints:^(MASConstraintMaker *make) { //
make.right.equalTo(self.leftContainer.mas_right); //
}]; if (previous) {
[previous mas_makeConstraints:^(MASConstraintMaker *make) {
make.right.lessThanOrEqualTo(self.leftContainer.mas_right);
}];
}
self.leftButtonsInternal = buttons.copy; self.leftButtonsInternal = buttons.copy;
// //
@@ -110,9 +118,16 @@
btn.layer.masksToBounds = YES; btn.layer.masksToBounds = YES;
btn.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9]; btn.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
btn.titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium]; btn.titleLabel.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium];
NSString *title = (idx < self.leftButtonTitles.count) ? self.leftButtonTitles[idx] : [NSString stringWithFormat:@"Item%ld", (long)(idx+1)];
NSString *title = (idx < self.leftButtonTitles.count) ? self.leftButtonTitles[idx] : @"";
[btn setTitle:title forState:UIControlStateNormal]; [btn setTitle:title forState:UIControlStateNormal];
[btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
// 10 = + 20
btn.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 10);
[btn setContentHuggingPriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
[btn setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal];
btn.tag = idx; btn.tag = idx;
[btn addTarget:self action:@selector(onLeftAction:) forControlEvents:UIControlEventTouchUpInside]; [btn addTarget:self action:@selector(onLeftAction:) forControlEvents:UIControlEventTouchUpInside];
return btn; return btn;
@@ -142,18 +157,18 @@
return _leftContainer; return _leftContainer;
} }
- (UIButton *)settingsButtonInternal { //- (UIButton *)settingsButtonInternal {
if (!_settingsButtonInternal) { // if (!_settingsButtonInternal) {
_settingsButtonInternal = [UIButton buttonWithType:UIButtonTypeSystem]; // _settingsButtonInternal = [UIButton buttonWithType:UIButtonTypeSystem];
_settingsButtonInternal.layer.cornerRadius = 16; // _settingsButtonInternal.layer.cornerRadius = 16;
_settingsButtonInternal.layer.masksToBounds = YES; // _settingsButtonInternal.layer.masksToBounds = YES;
_settingsButtonInternal.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9]; // _settingsButtonInternal.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
[_settingsButtonInternal setTitle:@"⚙︎" forState:UIControlStateNormal]; // 齿 // [_settingsButtonInternal setTitle:@"⚙︎" forState:UIControlStateNormal]; // 齿
[_settingsButtonInternal setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; // [_settingsButtonInternal setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[_settingsButtonInternal addTarget:self action:@selector(onSettings) forControlEvents:UIControlEventTouchUpInside]; // [_settingsButtonInternal addTarget:self action:@selector(onSettings) forControlEvents:UIControlEventTouchUpInside];
} // }
return _settingsButtonInternal; // return _settingsButtonInternal;
} //}
- (UIButton *)globeButtonInternal { - (UIButton *)globeButtonInternal {
if (!_globeButtonInternal) { if (!_globeButtonInternal) {
@@ -186,7 +201,7 @@
} else { } else {
make.left.equalTo(self.mas_left).offset(12); make.left.equalTo(self.mas_left).offset(12);
} }
make.right.equalTo(self.settingsButtonInternal.mas_left).offset(-12); make.right.equalTo(self).offset(-12);
make.centerY.equalTo(self.mas_centerY); make.centerY.equalTo(self.mas_centerY);
make.height.mas_equalTo(32); make.height.mas_equalTo(32);
}]; }];

View File

@@ -297,7 +297,7 @@ static NSString * const kKBJfPayCellId = @"kKBJfPayCellId";
- (UILabel *)rechargeLabel { - (UILabel *)rechargeLabel {
if (!_rechargeLabel) { if (!_rechargeLabel) {
_rechargeLabel = [UILabel new]; _rechargeLabel = [UILabel new];
_rechargeLabel.text = @"Recharge Now"; _rechargeLabel.text = KBLocalized(@"Recharge Now");
_rechargeLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold]; _rechargeLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold];
_rechargeLabel.textColor = [UIColor colorWithHex:KBBlackValue]; _rechargeLabel.textColor = [UIColor colorWithHex:KBBlackValue];
} }