Programing

iPhone UIWebview : 숫자 키보드를 강제하는 방법?

lottogame 2020. 12. 1. 07:32
반응형

iPhone UIWebview : 숫자 키보드를 강제하는 방법? 가능합니까?


일부 iPhone 앱을 개발하기 위해 PhoneGap을 실험하고 있습니다. PhoneGap은 기본적으로 UIWebView를 래핑합니다. 잘 작동합니다. 문제는 내 앱에 숫자 입력 만받는 여러 입력 필드가 있다는 것입니다. 기본 표준 키보드를 사용하는 대신 숫자 키패드를 강제로 사용해야합니다. 그러면 사용자가 모든 필드에서 숫자로 전환해야합니다. 이것이 가능한지 아는 사람이 있습니까? 어떻게?

설명 : Apple이 현재이를 허용하는 API를 제공하지 않는다는 것을 알고 있습니다. UIWebView에서 상속 된 사용자 지정 클래스를 만드는 것이 도움이 될지, 아니면 사용자 지정 키보드를 만드는 것이 몇 가지 가능성을 열어 줄 수 있는지 궁금합니다.

2009 년 11 월 6 일 업데이트-아래에서 언급했듯이 Apple은 최근에 safari 기능을 업데이트하여 다시 한 번 지원합니다. 그래서 받아 들여지는 대답은 그것을 반영하기 위해 변경되었습니다.

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

Mobile Safari가 email , number , search , telurl 의 새로운 HTML5 입력 유형 속성을 지원하는 것 같습니다 . 표시되는 키보드를 전환합니다. type 속성을 참조하십시오 .

예를 들어 다음과 같이 할 수 있습니다.

<input type="number" />

입력 상자에 포커스가 있으면 숫자 키보드가 표시됩니다 (사용자가 전체 키보드를 가지고 "123"버튼을 누르는 것처럼).

정말로 숫자 만 원하는 경우 다음을 지정할 수 있습니다.

<input type="tel" />

그런 다음 사용자는 전화 번호 다이얼 키패드를 받게됩니다.

나는 이것이 Mobile Safari에서 작동한다는 것을 알고 있습니다 .UIWebView와 함께 작동한다고 가정합니다.


더 나은 해결책은 <input type="text" pattern="[0-9]*">모바일 및 데스크톱 브라우저 용 양식을 디자인 할 때 사용하는 것 입니다.


에서 애플의 문서 (의 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" />

Dashcode 프로젝트의 HTML 부분을 변경해야합니다.

  1. Dashcode에서 코드 창에서 index.html을 엽니 다.
  2. 작업중인보기의 캔버스에서 최적화 된 키보드를 사용하도록 설정할 입력 필드를 선택하십시오.
  3. index.html을 클릭하여 초점을 맞 춥니 다.
  4. Dashcode 메뉴 바에서 edit> find를 선택하십시오.
  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]*".

To do so: the objective-c code.

-(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('.');"]];
}

Then you should add the a method which can be accessed application wide in your JS code.

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);
                }
            },

참고URL : https://stackoverflow.com/questions/773843/iphone-uiwebview-how-to-force-a-numeric-keyboard-is-it-possible

반응형