2009-10-22 48 views
8

Tôi cần (nghĩa là yêu cầu của khách hàng) để cung cấp bàn phím tùy chỉnh để người dùng nhập văn bản vào cả hai trường và vùng văn bản. Tôi đã có một cái gì đó mà bàn phím và nối thêm thử nghiệm cho một trường văn bản, tuy nhiên tôi muốn làm cho nó chung chung hơn và có nó hoạt động như bàn phím iphone tiêu chuẩn, tức là xuất hiện khi người dùng chọn một điều khiển văn bản có thể chỉnh sửa. Hiện tại bộ điều khiển của tôi biết đích và mục tiêu không thể chỉnh sửa để ngăn bàn phím tiêu chuẩn.Bàn phím iPhone tùy chỉnh

Có cách nào để kết nối với hành vi của các điều khiển văn bản để tôi sử dụng bàn phím của riêng mình một cách dễ dàng không?

Xin cảm ơn, Vic

+0

Tôi hy vọng khách hàng của bạn không có ý định gửi ứng dụng này (có lẽ là không phải trò chơi) đến App Store ... –

+0

Tại sao không? _______ –

+0

Thay đổi thành phần giao diện người dùng lõi của iPhone? –

Trả lời

11

Đây là một ý tưởng: sửa đổi bàn phím hiện tại theo nhu cầu của riêng bạn. Đầu tiên, đăng ký để được thông báo khi nó xuất hiện trên màn hình:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(modifyKeyboard:) 
             name:UIKeyboardWillShowNotification 
             object:nil]; 

Sau đó, trong modifyKeyboard phương pháp của bạn:

- (void)modifyKeyboard:(NSNotification *)notification 
{ 
    UIView *firstResponder = [[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)]; 

    for (UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows]) 
     for (UIView *keyboard in [keyboardWindow subviews]) 
      if([[keyboard description] hasPrefix:@"<UIKeyboard"] == YES) 
      { 
       MyFancyKeyboardView *customKeyboard = [[MyFancyKeyboardView alloc] initWithFrame: CGRectMake(0, 0, keyboard.frame.size.width, keyboard.frame.size.height); 
       [keyboard addSubview: customKeyboard]; 
       [customKeyboard release]; 
      } 
} 

này cho biết thêm quan điểm của bạn trên đầu của bàn phím ban đầu, do đó hãy chắc chắn rằng bạn làm cho nó mờ mịt.

+0

Một ý tưởng thú vị khác, cảm ơn tôi cũng sẽ thử một lần nữa, cảm ơn – vickirk

0

Tùy thuộc vào cách bạn muốn tùy chỉnh. Cá nhân tôi muốn có bàn phím số, nhưng không thích bàn phím số, vì vậy tôi đã sử dụng bàn phím tiêu chuẩn và được thêm vào bộ lọc tiêu chuẩn, một phần của các tùy chọn, từ chối tất cả các phím nhấn không phải là số hoặc không gian hoặc xóa.

Tôi không thể nói liệu Apple có thích điều này hay không và bạn sẽ gặp khó khăn khi viết hành vi của riêng mình hoạt động giống như các bàn phím khác. Vì vậy, nhiều như vậy, rằng nó nên được tuyên bố là một ý tưởng tồi.

cập nhật dựa trên nhận xét của bạn có vẻ như bạn chỉ cần tạo chế độ xem có nhiều nút trên đó và di chuyển chế độ xem này với tùy chọn động được bật. Sau đó nó có thể sắp xếp trượt từ dưới lên như bàn phím và trượt đi một lần nữa khi bị loại bỏ.

+0

Thật không may bàn phím chúng ta cần không thực sự là một bàn phím với các ký tự trên nó, nó có một vài ký tự trên nó (đúng là phần còn lại có thể được ẩn trong mannner này) nhưng có các nút làm nhiều hơn gõ một char .Đúng, tôi có thể thêm các nút ở nơi khác nhưng nó sẽ phản trực giác và trông khủng khiếp. Tôi đã có bàn phím làm việc theo yêu cầu, tôi chỉ cần dây nó một cách dễ dàng, chỉ muốn các công cụ cảm ứng trên android là ổn định một mục tiêu như ipod :-( – vickirk

7

Miễn là bạn không gửi ứng dụng của mình đến cửa hàng ứng dụng, bạn có thể sử dụng kỹ thuật được gọi là phương pháp swizzling để tự động thay thế các phương thức của lớp lõi trong thời gian chạy. Ví dụ:

@interface UIControl(CustomKeyboard) 
- (BOOL)__my__becomeFirstResponder 
@end 

@implementation UIControl(CustomKeyboard) 
- (BOOL)__my__becomeFirstResponder 
{ 
    BOOL becameFirstResponder = [self __my__becomeFirstResponder]; 
    if ([self canBecomeFirstResponder]) { 
     [MyKeyboard orderFront]; 
    } 
    return becameFirstResponder; 
} 

+ (void)initialize 
{ 
    Method old = class_getInstanceMethod(self, @selector(becomeFirstResponder)); 
    Method new = class_getInstanceMethod(self, @selector(__my__becomeFirstResponder)); 
    method_exchangeImplementations(old, new); 
} 
@end 

Hãy không sử dụng bất cứ điều gì như thế này trong bất kỳ mã sản xuất. Ngoài ra, tôi đã không thực sự thử nghiệm này, vì vậy YMMV.

+0

Một ý tưởng thú vị, cảm ơn tôi sẽ cung cấp cho nó một – vickirk

10

Bạn có thể thực hiện việc này với iOS 3.2 trở lên. Kiểm tra thuộc tính inputView của UITextField để biết chi tiết.

+1

+1 cho câu trả lời hay :) –

Các vấn đề liên quan