2011-12-30 31 views
7

Tôi đang cố gắng hiển thị một số UIPopoverController từ nội dung văn bản đã chọn trong một UITextView, Làm cách nào để có được văn bản đã chọn CGRect?Làm cách nào để có được khung văn bản đã chọn từ UITextView

Cảm ơn!

+0

Nếu câu hỏi này là những gì tôi nghĩ nó là gì, UIPopoverController trong tiêu đề có thể gây hiểu lầm? Bạn muốn có được CGPoint từ việc lựa chọn văn bản, nó không có gì đặc biệt đối với UIPopoverController, phải không? – barley

+0

Sửa tiêu đề vì đề xuất của bạn hợp lệ @barley. – Till

Trả lời

33

Tôi nghĩ rằng [UITextInput selectedTextRange][UITextInput caretRectForPosition:] là những gì bạn đang tìm kiếm.

[UITextInput selectedTextRange] trả về ranh giới được chọn nhân vật

[UITextInput caretRectForPosition:] trả về CGRect của dãy kí tự trong đầu vào này.

UITextView phù hợp với UITextInput (kể từ iOS 5), vì vậy bạn có thể sử dụng các phương pháp này cho ví dụ UITextView của mình.

Nó sẽ là một cái gì đó như thế này.

UITextRange * selectionRange = [textView selectedTextRange]; 
CGRect selectionStartRect = [textView caretRectForPosition:selectionRange.start]; 
CGRect selectionEndRect = [textView caretRectForPosition:selectionRange.end]; 
CGPoint selectionCenterPoint = (CGPoint){(selectionStartRect.origin.x + selectionEndRect.origin.x)/2,(selectionStartRect.origin.y + selectionStartRect.size.height/2)}; 

EDIT: Vì mã mẫu trở nên khó khăn một chút, tôi đã thêm hình ảnh để bổ sung.

An image that illustrates what local variables represent

+0

Vấn đề nhỏ, bạn gọi nó là điểm trung tâm nhưng bạn đang thực sự tính điểm dưới cùng bên phải. – Till

+0

@Vâng, ban đầu tôi nghĩ [UITextInput caretRectForPosition:] sẽ lấy UITextRange làm đầu vào, nhưng (như tên cho thấy) nó thực sự mất UITextPosition. Tôi đã sửa mã mẫu, và tôi nghĩ rằng nó bây giờ chính xác hơn mặc dù một chút khó khăn hơn để có được. Và cảm ơn phiên bản! – barley

+0

Bạn vẫn có một vấn đề nhỏ trong tính toán trung tâm của mình: D ... kiểm tra lại tọa độ X, các dấu ngoặc được đặt không chính xác thành calc trung tâm. – Till

19

Có một số tình huống mà câu trả lời của lúa mạch sẽ không thực sự cung cấp cho các trung tâm của vùng chọn. Ví dụ:

Screenshot showing an example of where using the caret rects would not be accurate

Trong trường hợp này bạn sẽ nhìn thấy Copy/Paste menu được hiển thị ở trung tâm của vùng chọn, mà kéo dài toàn bộ chiều rộng của trường text. Nhưng việc tính toán trung tâm của hai chú thú cưng sẽ cho một vị trí xa hơn về phía bên phải.

Bạn có thể có được một kết quả chính xác hơn bằng selectionRectsForRange:

UITextRange *selectionRange = [textView selectedTextRange]; 
NSArray *selectionRects = [self.textView selectionRectsForRange:selectionRange]; 
CGRect completeRect = CGRectNull; 
for (UITextSelectionRect *selectionRect in selectionRects) { 
    if (CGRectIsNull(completeRect)) { 
     completeRect = selectionRect.rect; 
    } else completeRect = CGRectUnion(completeRect,selectionRect.rect); 
} 

Nó cũng đáng làm rõ rằng nếu bạn vẫn đang hỗ trợ iOS 4 và sử dụng một trong các câu trả lời, bạn sẽ cần phải chắc chắn những phương pháp này được hỗ trợ trước khi gọi cho họ: if ([textView respondsToSelector:@selector(selectedTextRange)]) { …

+0

Hoàn hảo, làm việc như một nét duyên dáng – aryaxt

+2

Bạn không thực sự cần kiểm tra CGRectIsNull vì CGRectUnion đã xử lý việc này. Theo tài liệu cho CGRectUnion: "Nếu một trong hai hình chữ nhật là một hình chữ nhật rỗng, một bản sao của hình chữ nhật khác được trả về" –

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