2009-05-26 30 views
13

Có cách nào để kiểm soát vị trí của chế độ xem tự động chính xác bật lên khi nhập trong một UITextField không?Kiểm soát vị trí Xem AutoCorrect trên iPhone

Theo mặc định, nó dường như luôn xuất hiện bên dưới trường văn bản. Tuy nhiên, trong các ứng dụng của Apple như SMS, đôi khi nó xuất hiện phía trên trường văn bản.

Đối với các trường văn bản được căn chỉnh ngay phía trên bàn phím, tự động sửa bị chặn bởi bàn phím và không thể sử dụng được.

+0

Bump! Bất kỳ câu trả lời sau 1 năm? –

+0

về mặt kỹ thuật, điều đó là không thể, và không có API công cộng nào cho phép thực hiện điều này. Tuy nhiên, người ta có thể sửa đổi vị trí của cửa sổ bật lên chỉnh sửa: cửa sổ bật lên là phần phụ của vùng văn bản và do đó có thể tìm thấy bằng cách lặp qua các bản xem trước. Bạn có thể tìm thấy vị trí ban đầu của nó và di chuyển nó bất cứ nơi nào. Đặt logic này vào một phương thức và gọi nó mỗi lần "layoutSubviews" của trường văn bản được gọi là ... Tôi chưa thấy giải pháp sạch hơn – Nick

Trả lời

1

Vị trí của lời nhắc sửa lỗi tự động được xác định bởi phương thức firstRect ... của giao thức UITextInput. Thật không may UITextField sử dụng một lớp riêng như là đại biểu cho giao thức này, do đó bạn không thể phân lớp và ghi đè lên nó.

Bạn COULD tuy nhiên thực hiện thay thế UITextField của riêng bạn bằng cách tự vẽ nội dung (như với CoreText), thực hiện lựa chọn của riêng bạn và xử lý loupe và sau đó bạn sẽ có thể ảnh hưởng đến vị trí của lời nhắc tự động sửa. Mặc dù nó được thiết kế để luôn ở bên dưới văn bản đã chỉnh sửa, vì vậy bạn sẽ phải về cơ bản nằm trên phương thức firstRect ....

Câu chuyện dài ngắn: quá phức tạp.

0

Một câu trả lời phù hợp với tôi là sử dụng phương thức setInputAccessoryView của chế độ xem văn bản/văn bản. Tôi có một thanh công cụ chứa textView. Nếu tôi đặt thanh công cụ làm inputaccessoryview của trường văn bản và đặt thành NO clipToBound thuộc tính của thanh công cụ, tôi không biết chính xác tại sao, nhưng quả bóng xuất hiện phía trên bàn phím

+0

Bạn đã có thể tìm ra cách làm cho nó hiển thị ... phía trên trường đang được chỉnh sửa thay vì dưới đây ?. Cảm ơn bạn! –

0

Đây là giải pháp sử dụng API riêng tư không có cách nào để thực hiện việc này bằng API công khai.

  • Duyệt qua thuộc tính cửa sổ của ứng dụng để tìm cửa sổ UITextEffectsWindow riêng tư và tìm ra khung của nó. Đây là bàn phím
  • Lướt qua các bản xem phụ của TextView để tìm chế độ xem UIAutocorrectInlinePrompt riêng tư. Đây là bong bóng tự động sửa lỗi.
  • Di chuyển chế độ xem phụ đó thành chế độ xem trình bao bọc riêng biệt (được thêm vào TextView) và sau đó di chuyển chế độ xem trình bao bọc đó để phía trên cửa sổ bàn phím được đề cập ở trên.

Sử dụng layoutSubviews swizzled,

- (void) moveSpellingCorrection { 
for (UIView *view in self.subviews) 
{ 
    if ([[[view class] description] isEqualToString:@"UIAutocorrectInlinePrompt"]) 
    { 
     UIView *correctionShadowView = nil; // [view correctionShadowView]; 

     for (UIView *subview in view.subviews) 
     { 
      if ([[[subview class] description] isEqualToString:@"UIAutocorrectShadowView"]) 
      { 
       correctionShadowView = subview; 
       break; 
      } 
     } 

     if (correctionShadowView) 
     { 
      UIView *typedTextView = nil; //[view typedTextView]; 
      UIView *correctionView = nil; //[view correctionView]; 

      for (UIView *subview in view.subviews) 
      { 
       if ([[[subview class] description] isEqualToString:@"UIAutocorrectTextView"]) 
       { 
        if (CGRectContainsRect(correctionShadowView.frame,subview.frame)) 
        { 
         correctionView = subview; 
        } 
        else 
        { 
         typedTextView = subview; 
        } 
       } 

      } 
      if (correctionView && typedTextView) 
      { 

       CGRect textRect = [typedTextView frame]; 
       CGRect correctionRect = [correctionView frame]; 
       if (textRect.origin.y < correctionRect.origin.y) 
       { 
        CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0,-50.0); 
        [correctionView setTransform: moveUp]; 
        [correctionShadowView setTransform: moveUp]; 

        CGRect windowPos = [self convertRect: view.frame toView: nil ]; 
        [view removeFromSuperview]; 
        [self.window addSubview: view]; 
        view.frame = windowPos; 
       } 

      } 
     } 

    } 

} 

}

Để biết thêm chi tiết check.

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