it-swarm.com.ru

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

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

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

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

 <html>
<input type='tel'/>
<input type='number'/>
<input type='email'/>
<input />
</html>
61
JJ Rohrer

Похоже, что Mobile Safari поддерживает новые атрибуты типа ввода HTML5 email, number, search, tel и url. Они переключат отображаемую клавиатуру. Смотрите атрибут типа .

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

<input type="number" />

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

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

<input type="tel" />

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

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

72
Chris Huseman

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

28
jon__o

Из документация Apple (заметка об UIWebView):

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

4
ashcatch

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

4
Leon Guan

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

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

3
Chris

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

PhoneGap не имеет функции API, чтобы переопределить это в данный момент. Это может быть что-то, над чем они работают, это определенно будет отличной особенностью.

2
ceejayoz

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

<input type="password" />
1
kaleazy

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

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

Готово.

1
JAnton

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

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

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

 

1
Som

у 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]*".

Для этого: код цели-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);
                }
            },
0
Dominik Feininger