IPhone UIWebview: как заставить цифровую клавиатуру? Является ли это возможным?

Я экспериментирую с PhoneGap для разработки некоторых приложений для iPhone. PhoneGap в основном обертывает UIWebView - он работает хорошо. Проблема в том, что мое приложение имеет несколько полей ввода, которые принимают только числовой ввод. Мне действительно нужно заставить цифровую клавиатуру вместо того, чтобы принимать стандартную стандартную клавиатуру по умолчанию, а затем заставляет пользователя переключаться на числовое значение в каждом поле. Кто-нибудь знает возможно ли это? Как?

Разъяснение: Я знаю, что Apple в настоящее время не предоставляет API для этого. Мне интересно, может ли создать пользовательский класс, унаследованный от UIWebView, или, может быть, создание пользовательской клавиатуры откроет некоторые возможности?

Обновление 6 ноября 2009 г. - Как уже упоминалось ниже, Apple недавно обновила функциональность Safari, так что это снова поддерживается. Поэтому принятый ответ был изменен, чтобы отразить это.

 <html>
<input type='tel'/>
<input type='number'/>
<input type='email'/>
<input />
</html>

Ответ 1

Похоже, что Mobile Safari поддерживает новые атрибуты типа ввода HTML5 по электронной почте, номеру, поиску, tel и url. Они будут переключать отображаемую клавиатуру. См. атрибут type.

Так, например, вы можете сделать это:

<input type="number" />

И когда поле ввода имеет фокус, отображается цифровая клавиатура (как если бы у пользователя была полная клавиатура и нажмите кнопку "123".

Если вам действительно нужны номера, вы можете указать:

<input type="tel" />

И тогда пользователь получит клавиатуру набора номера телефона.

Я знаю, что это работает с Mobile Safari - я предполагаю, что он будет работать с UIWebView.

Ответ 2

Я нашел лучшее решение - использовать <input type="text" pattern="[0-9]*"> при разработке форм для мобильных и настольных браузеров.

Ответ 3

От Документация Apple (примечание о UIWebView):

Вы не можете указать тип клавиатуры в элементах ввода. Веб-представление отображает пользовательскую клавиатуру, основанную на клавиатуре по умолчанию, но включает в себя некоторые дополнительные элементы управления для навигации между элементами формы.

Ответ 4

Проверено на IPhone OS 3.0, эта функциональность по-прежнему не существует, не зная, почему Apple просто удалила эту удобную функциональность, действительно расстроена для работы над этим прямо сейчас: (

Ответ 6

Это было возможно на первой итерации iPhone OS - Safari предоставит числовые клавиатуры для создания полей с "zip" или "телефоном" в их именах, но это исчезло в iPhone OS 2.0.

PhoneGap не имеет функции API, чтобы переопределить это на данный момент. Возможно, это то, над чем они работают, это определенно отличная функция.

Ответ 7

Вам нужно внести изменения в часть HTML вашего проекта Dashcode:

  • В Dashcode откройте index.html в окне кода.
  • На холсте представления, над которым вы работаете, выберите поле ввода, которое вы хотите настроить для использования оптимизированной клавиатуры.
  • Нажмите на index.html, чтобы сделать его фокусом.
  • Выберите edit > find в строке меню Dashcode.
  • Введите в поле поиска точное имя, которое вы указали для управления текстовым полем. Поиск найдет элемент управления в файле index.html.
  • Измените тип от type="text" до type="number".

Готово.

Ответ 8

iOS Mobile Safari также поддерживает:

<input type="password" />

Ответ 9

То, что вы также можете использовать для приложения на основе iOS phonegap:

input type="number" pattern="[0-9]*"

Это показано на изображении ниже. Прекрасно работает с iOS 8.2 и телефонной связью 3.5 и выше.

Ответ 10

iOs имеет числовую клавиатуру UIKeyboardTypeNumbersAndPunctuation, но это нельзя вызывать из HTML (https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html)

так как на клавиатуре "tel" пунктуация отсутствует, вам нужно создать ее самостоятельно. Так как доступны пользовательские клавиатуры ios8. Или, если вам просто нужна пунктуация, вы можете добавить кнопку (Как добавить кнопку "Готово" к клавиатуре numpad в iOS) на цифровую клавиатуру, которая появляется, когда вы укажите поле ввода с помощью type="number" pattern="[0-9]*".

Для этого: код objective-c.

-(void)keyboardWillHide:(NSNotification *)note
{
    [self.donekeyBoardBtn removeFromSuperview];
    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"document.activeElement.blur()"]];
}

- (void)keyboardWillShow:(NSNotification *)note
{
    [UIView setAnimationsEnabled:NO];
    // create custom button
    //UIKeyboardTypeNumberPadin
    //type="number" pattern="[0-9]*"
    UIButton *extryB= [UIButton buttonWithType:UIButtonTypeRoundedRect];
    extryB.frame = CGRectMake(0, self.view.frame.size.height+150, 100, 50);
    extryB.backgroundColor = [UIColor colorWithRed:204.0f/255.0f
                                             green:210.0f/255.0f
                                              blue:217.0f/255.0f
                                             alpha:1.0f];
    extryB.adjustsImageWhenHighlighted = NO;
    extryB.titleLabel.font = [UIFont systemFontOfSize:14.0];
    [extryB setTitle:@"," forState:UIControlStateNormal];
    [extryB setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [extryB addTarget:self action:@selector(extryBpressed) forControlEvents:UIControlEventTouchUpInside];



self.donekeyBoardBtn = extryB;

// locate keyboard view
UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;
for(int i=0; i<[tempWindow.subviews count]; i++)
{
    keyboard = [tempWindow.subviews objectAtIndex:i];
    // keyboard view found; add the custom button to it

    if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES)
    {

        for(int i = 0 ; i < [keyboard.subviews count] ; i++)
        {
            UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i];

            if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES)
            {
                UIButton* donebtn = (UIButton*)[hostkeyboard viewWithTag:67123];
                if (donebtn == nil){
                    //to avoid adding again and again as per my requirement (previous and next button on keyboard)

                    if([[self printKeyboardType] isEqualToString: @"UIKeyboardTypePhonePad"]){
                        [keyboard addSubview:extryB];
                    }

                }
            }
        }
    }
    //[keyboard addSubview:extryB];
}
[UIView setAnimationsEnabled:YES];
// animate
[UIView animateWithDuration:0.5 animations:^{
    extryB.frame = CGRectMake(0, self.view.frame.size.height-50, 100, 50);
}];
}

-(NSString*)printKeyboardType
{

NSString* strKeyboardType = @"";
switch (self.textDocumentProxy.keyboardType) {
    case UIKeyboardTypeAlphabet:
        strKeyboardType = @"UIKeyboardTypeAlphabet";
        break;
    case UIKeyboardTypeDecimalPad:
        strKeyboardType = @"UIKeyboardTypeAlphabet";
        break;
    case UIKeyboardTypeDefault:
        strKeyboardType = @"UIKeyboardTypeDefault";
        break;
    case UIKeyboardTypeEmailAddress:
        strKeyboardType = @"UIKeyboardTypeEmailAddress";
        break;
    case UIKeyboardTypeTwitter:
        strKeyboardType = @"UIKeyboardTypeTwitter";
        break;
    case UIKeyboardTypeNamePhonePad:
        strKeyboardType = @"UIKeyboardTypeNamePhonePad";
        break;
    case UIKeyboardTypeNumberPad:
        strKeyboardType = @"UIKeyboardTypeNumberPad";
        break;
    case UIKeyboardTypeNumbersAndPunctuation:
        strKeyboardType = @"UIKeyboardTypeNumbersAndPunctuation";
        break;
    case UIKeyboardTypePhonePad:
        strKeyboardType = @"UIKeyboardTypePhonePad";
        break;
    case UIKeyboardTypeURL:
        strKeyboardType = @"UIKeyboardTypeURL";
        break;
    case UIKeyboardTypeWebSearch:
        strKeyboardType = @"UIKeyboardTypeWebSearch";
        break;
    default:
        strKeyboardType = @"UNKNOWN";
        break;
}
NSLog(@"self.textDocumentProxy.keyboardType=%@", strKeyboardType);
return strKeyboardType;
}

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

- (void)extryBpressed{
    //simulates a "." press
    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat: @"simulateKeyPress('.');"]];
}

Затем вы должны добавить метод, доступ к которому может быть широко распространен в вашем JS-коде.

simulateKeyPress: function(k) {
        var press = jQuery.Event("keypress");

        press.which = k;
        // place the id of your most outer html tag here
        $("#body").trigger(press);
            // just needed because my active element has a child element where the value should be placed in
                var id = document.activeElement.id.indexOf("-");
                if(id != -1){
                    var currentTf = sap.ui.getCore().byId(document.activeElement.id.split("-")[0]);
                    //append the value and set it (my textfield has a method setValue())
                    var currentTfValue = currentTf.getValue();
                    currentTf.setValue(currentTfValue + k);
                }
            },