2014-02-10 2 views
2

커스텀 인풋 메소드를 개발했고, 이제 iOS에서 키보드로 등록 할 수있는 비틀기를 개발하고 싶습니다.커스텀 아이폰 OS (iOS) 본격적인 키보드 만들기

TouchPal 및 Baidu Input과 같이 키보드로 설정에 나타나는 Cydia (주로 중국 개발자)의 키보드가 많기 때문에 가능합니다.

내가 (THEOS 및 콘솔 IDA에서 거의 사일, 엑스 코드) 다음 옵션으로보고 시도 : 시스템 /에있는

  • 텍스트 입력 번들/라이브러리 /의 TextInput은 - 처리 할 게 없다 보인다 키보드 자체? 일부 수퍼 클래스 헤더가 누락되었습니다 (예 : TIZephyr ... 클래스). 그러나 네이티브 통합은 굉장 할 것입니다.
  • 의 TextInput 개인 프레임 워크 -도 .. 단지 사전과 너무
  • UIKit의 UIKB에있을 것으로 보인다 및 UIKeyboard은 .. 클래스 - UIKeyboardImpl 키보드의 기능과 관련이 뭔가 것으로 보인다 UIKeyboardLayout 당신이에 빌드 것입니다.

초기화시 UIKeyboardDayationLayout을 사용하여 일반 UIKeyboardLayout 인스턴스를 제공하려고 시도했습니다. 키보드의 마이크 버튼을 탭하면 키보드가 비어 있습니다. 그런 종류의 구현은 좋을 ​​것입니다 (비록 받아쓰기 기능을 죽이는 것은 바람직하지 않습니다). 그러나 타이핑 이벤트를 어디에서 보내야하는지 알 수 없습니다.

그래서 점은 다음과 같습니다

  • 입력 방법으로 클래스를 등록 할 책임이 무엇입니까?
  • 타이핑 이벤트 수신에 대한 책임은 무엇입니까?

나는 헤더 파일과 번들에 어떤 힌트도 줄 수있는 기사도 찾을 수 없기 때문에 이미 비슷한 것을해야하는 개발자가 있기를 바랍니다.

미리 감사드립니다.

+0

http://networkpx.googlecode.com/svn/trunk/hk.kennytm.iKeyEx3/src/ - 진행 상황을 계속 업데이트합니다. –

답변

1

응답해야 할 시간이 없었음에도 불구하고 iOS 8이 출시되었습니다. 아직도, 이것은 당신이 당신의 자신의 키보드를로드하는 방법입니다 TegakiLayout이 UIKeyboardLayout의 서브 클래스

%hook UIKeyboardInputMode 

+ (id)keyboardInputModeWithIdentifier:(id)arg1 { 
    id o = %orig; 
    return o; 
} 
- (id)primaryLanguage { 
    if([TegakiLayout isTegaki:[self identifier]]) return @"Tegaki"; 
    return %orig; 
} 
%end 

%hook UIKeyboardImpl 
/* This is where the magic is! */ 
+ (Class)layoutClassForInputMode:(NSString*)arg1 keyboardType:(int)arg2 { 
    Class sass = %orig; 
    if ([TegakiLayout isTegaki: arg1]) { 
     return [TegakiLayout class]; 
    } 
    return sass; 
} 
%end 



extern "C" NSArray*UIKeyboardGetSupportedInputModes(); 
extern "C" NSArray*UIKeyboardGetActiveInputModes(); 
static NSArray* (*orig_modes)(); 
NSArray* rep_modes() { 
    NSArray* res = [orig_modes() arrayByAddingObjectsFromArray:@[@"TEGAKI", @"TEGAKI_Graffiti"]]; 
    return res; 
} 

static NSArray* (*orig_active_modes)(); 
NSArray* rep_active_modes() { 
    NSArray* res = orig_active_modes(); 
    return res; 
} 



%ctor { 
    %init; 
    MSHookFunction(UIKeyboardGetSupportedInputModes, rep_modes, &orig_modes); 
    MSHookFunction(UIKeyboardGetActiveInputModes, rep_active_modes, &orig_active_modes); 
} 

.

그런 다음 전통적인 키보드 일지 여부와 showKeyboardWithInputTraits:screenTraits:splitTraits:에서 사용자 지정보기 만들기 여부를 반환하기 위해 - (BOOL)isAlphabeticPlane을 구현합니다.

입력하려면 [[UIKeyboardImpl activeInstance]insertText:@"\n"];을 사용하십시오.

은 사용에 '세계'버튼을 만들려면이 :

Class sw = NSClassFromString(@"UIInputSwitcherView"); 
[[sw sharedInstance]selectNextInputMode]; 

뿐만 아니라 -keyboardName-keyplaneName을 구현하는 것을 잊지 마세요! 아마 하루 전체 프로젝트를 게시 하겠지만, 지금은 설명하기에는 너무 큽니다. 그러나 이것은 당신을 기립시키고 운영하기에 충분할 것입니다.