Пользовательский интерфейс iPhoneВеб-просмотр:Как заставить цифровую клавиатуру?Является ли это возможным?

StackOverflow https://stackoverflow.com/questions/773843

Вопрос

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

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

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

 <html>
<input type='tel'/>
<input type='number'/>
<input type='email'/>
<input />
</html>
Это было полезно?

Решение

Похоже, Mobile Safari поддерживает новые атрибуты типа ввода HTML5: электронная почта, число, поиск, тел., и URL.Это переключит отображаемую клавиатуру.Видеть атрибут типа.

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

<input type="number" />

А когда поле ввода находится в фокусе, отображается цифровая клавиатура (как если бы у пользователя была полная клавиатура и он нажал кнопку «123»).

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

<input type="tel" />

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

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

Другие советы

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

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

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

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

Вот список всех типов, совместимых с веб-представлениями iOS (4.0 и более поздних версий):

http://conecode.com/news/2011/12/mobile-safari-uiwebview-input-types/

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

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

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

<input type="password" />

Вам необходимо внести изменения в HTML-часть вашего проекта Dashcode:

  1. В Dashcode откройте index.html в окне кода.
  2. На холсте представления, над которым вы работаете, выберите поле ввода, которое вы хотите настроить для использования оптимизированной клавиатуры.
  3. Нажмите на index.html, чтобы передать ему фокус.
  4. Выберите «Редактировать»> «Найти» в строке меню Dashcode.
  5. Введите в поле поиска точное имя, которое вы дали элементу управления текстовым полем.Find найдет элемент управления в файле index.html.
  6. Измените тип с type="text" к type="number".

Сделанный.

Что вы также можете использовать для приложения iOS PhoneGap:

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

Это показано на изображении ниже.Прекрасно работает с iOS 8.2 и PhoneGap 3.5 и выше.

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

так как на клавиатуре "тел" пунктуация отсутствует, то вам придется создать ее самостоятельно.Поскольку доступны пользовательские клавиатуры для iOS8.Или, если вам просто нужна пунктуация, вы можете добавить кнопку (Как добавить кнопку «Готово» на цифровую клавиатуру в 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('.');"]];
}

Затем вам следует добавить метод a, к которому можно получить доступ во всем приложении, в вашем 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);
                }
            },
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top