2013-08-09 36 views
16

Làm cách nào để ngăn việc chỉnh sửa văn bản trong UITextField cùng với ẩn con trỏ/kính/kính lúp, nhưng vẫn hiển thị bàn phím, Tôi đang sử dụng một số inputView với UIPickerView/UIDatePickerView?Ngăn việc chỉnh sửa văn bản trong UITextField và ẩn con trỏ/kính/kính lúp khi sử dụng inputView

Đặt userInteractionEnabled thành NO không hoạt động, vì nó không còn nhận được bất kỳ chạm nào và sẽ không hiển thị bàn phím.

Trả lời

17

Subclass UITextField

//Disables caret 
- (CGRect)caretRectForPosition:(UITextPosition *)position 
{ 
    return CGRectZero; 
} 

//Disables magnifying glass 
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) 
    { 
     gestureRecognizer.enabled = NO; 
    } 
    [super addGestureRecognizer:gestureRecognizer]; 
} 

Trong UITextFieldDelegate bạn

//Prevent text from being copied and pasted or edited with bluetooth keyboard. 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    return NO; 
} 

Bây giờ chỉ cần thiết lập văn bản của bạn lập trình từ kết quả của UIPickerView/UIDatePicker của bạn.

+0

không hoạt động trong trình mô phỏng iOS6 – raistlin

+0

Không có trình nhận dạng cử chỉ (iOS 8): (lldb) po [textField gestureRecognizers] -> nil –

5

Tôi hy vọng điều này sẽ hữu ích cho bạn.

Đặt con trỏ UIColor -> Empty. Trong giao diện người dùng, nó sẽ bị ẩn.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"]; 
+0

đây có phải là cách chính thức không? Tôi nghĩ rằng đây là một thao tác của API riêng tư của Apple. –

+0

Tôi dono, đây là cách chính thức. Nhưng đây là một trong những cách để lưu trữ tác vụ .. –

+0

Điều này có vẻ đáng ngờ đối với tôi! Sử dụng câu trả lời của Walapu. –

15

Ẩn con trỏ là đơn giản hơn rất nhiều trong iOS 7. Tuy nhiên cần một số thủ đoạn gian trá để vô hiệu hóa kính lúp

textField.tintColor = [UIColor clearColor]; 
+0

Vẫn không biết lý do tại sao thiết lập tintColor từ bảng phân cảnh không có hiệu lực, mặc dù mã này thực hiện. – samthui7

0

Để vô hiệu hóa bất kỳ sự tương tác với textfield trừ làm cho nó một responder đầu tiên bạn có thể chỉ diễn ra một UIButton có cùng kích thước ngay trên trường văn bản. Mã cho sự kiện nút vòi có thể là một cái gì đó như thế này:

- (IBAction)btnEditPhoneTapped:(id)sender 
{ 
    if (self.tfClientPhoneNo.isFirstResponder == NO) [self.tfClientPhoneNo becomeFirstResponder]; 
} 
2

tôi tìm thấy giải pháp tốt nhất là

- (CGRect) caretRectForPosition:(UITextPosition*) position 
{ 
    return CGRectZero; 
} 

- (NSArray *)selectionRectsForRange:(UITextRange *)range 
{ 
    return nil; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:)) 
    { 
     returnNO; 
    } 

    return [super canPerformAction:action withSender:sender]; 
} 

http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

+0

Điều này làm việc, nhưng bạn vẫn có thể bấm và gõ vào textField trừ khi bạn cũng thực hiện ** textField: shouldChangeCharactersInRange: replaceString: ** theo câu trả lời của Walapu. –

1

Để có một UITextField mà không tương tác, nhưng vẫn còn làm việc với một inputView:

Phân lớp UITextField với các phương pháp sau:

// Hide the cursor 
- (CGRect)caretRectForPosition:(UITextPosition*)position 
{ 
    return CGRectZero; 
} 

// All touches inside will be ignored 
// and intercepted by the superview 
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    return NO; 
} 

Phương pháp cuối cùng sẽ đơn thương độc mã ngăn chặn bất kỳ chỉnh sửa và kính lúp, vì bạn sẽ không có khả năng để khai thác UITextField.

Điều này hoạt động tốt nếu bạn đang sử dụng trường văn bản trong ví dụ UITableViewCell và sau đó có thể chuyển trạng thái đầu tiênResponder thông qua tableView:didSelectRowAtIndexPath:.

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