Для своего приложения я свернул собственную цифровую клавиатуру. Создал модальное представление со всеми необходимыми мне кнопками, и когда мой подкласс UITextfield
становится первым респондентом, я анимирую его.
Довольно много работы, но вы также можете настроить внешний вид (с помощью своих собственных приятных кнопок и т. Д.), Что я и хотел для своего приложения.
Обновление : My DecimalKeyboardViewController:
На самом деле я использую подкласс UIControl вместо поля UIText, потому что я отображаю его некоторым пользовательским способом. Если бы я был подклассом UITextfield, я бы сделал что-то вроде этого:
@interface DecimalNumberTextfield : UITextfield {
NSDecimalNumber *value;
}
@property (nonatomic, retain) NSDecimalNumber *value
@end
@implementation DecimalNumberTextfield
- (BOOL)becomeFirstResponder
{
if ([super becomeFirstResponder]) {
[[DecimalKeyboardViewController sharedDecimalKeyboardViewController] showForField:self];
return YES;
} else {
return NO;
}
}
- (BOOL)resignFirstResponder
{
if ([super resignFirstResponder]) {
[[DecimalKeyboardViewController sharedDecimalKeyboardViewController] hide];
return YES;
} else {
return NO;
}
}
- (void)setValue:(NSDecimalNumber *)aValue {
// you need to set value and update the displayed text here
}
@end
Вот DecimalKeyboardViewController. Вам нужно будет создать файл пера и добавить теги к кнопкам (вероятно, цифры от 0 до 9 и другие теги для других кнопок, которые вы будете использовать), затем подключите кнопки к -buttonPressed:
:
@interface DecimalKeyboardViewController : UIViewController {
DecimalNumberTextField *fieldBeingEdited;
}
@property (nonatomic, retain) DecimalNumberTextField *fieldBeingEdited;
+ (id)sharedDecimalKeyboardViewController;
- (void)showForField:(DecimalNumberTextField *)aTextField;
- (void)hide;
- (IBAction)buttonPressed:(id)sender;
@end
@implementation DecimalKeyboardViewController
static DecimalKeyboardViewController *sharedViewController;
+ (id)sharedDecimalKeyboardViewController
{
if (!sharedViewController) {
sharedViewController = [[DecimalKeyboardViewController alloc]
initWithNibName:@"DecimalKeyboardViewController"
bundle:[NSBundle mainBundle]];
}
return sharedViewController;
}
- (void)showForField:(DecimalNumberTextField *)aTextField
{
self.fieldBeingEdited = aTextField;
// add ourselves to the window unless we're there already
UIWindow *theWindow = self.fieldBeingEdited.window;
CGRect frame = self.view.frame;
if (!self.view.superview) { // add ourselves to the UIWindow unless we're already visible
frame.origin.y = theWindow.frame.size.height; // we start just out of sight at the bottom
self.view.frame = frame;
[theWindow addSubview:self.view];
}
// start animating
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
// animate the keyboard in
frame.origin.y = theWindow.frame.size.height - frame.size.height;
self.view.frame = frame;
// GO!
[UIView commitAnimations];
}
- (void)hide
{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
if (self.view.superview) {
CGRect frame = self.view.frame;
frame.origin.y = self.view.superview.frame.size.height;
self.view.frame = frame;
}
[UIView commitAnimations];
self.fieldBeingEdited = nil;
}
- (IBAction)buttonPressed:(id)sender
{
UIButton *button = (UIButton *)sender;
NSDecimalNumber *oldNumber = self.fieldBeingEdited.value;
NSDecimalNumber *newNumber;
switch (button.tag) {
// calculate the new number based on what button the user pressed
}
// update the DecimalNumbertextfield
self.fieldBeingEdited.value = newNumber;
}
@end
Обновление 2 : с тех пор как я вложил в подкласс UIControl
, мне не приходилось сталкиваться с появлением стандартной клавиатуры. Если вы подкласс UITextfield
, я думаю, что нормальная клавиатура будет отображаться также. Вы должны были бы предотвратить это каким-либо образом (не уверен, как) или подкласс UIControl
, как я сделал.