2012-07-14 43 views
12

Tôi đã hỏi một nhà phát triển (TwoLivesLeft, người sáng tạo Codea) cách họ làm nổi bật cú pháp trong ứng dụng của họ. Ông trả lời:Nhận tọa độ X và Y của một từ trong UITextView

@ TD2 trình chỉnh sửa Codea được triển khai bằng UITextView. Việc đánh dấu được thực hiện bằng cách chồng lên các bản xem trước ở các vị trí thích hợp - thường là UILabels. Chúng được dequeued từ một hồ bơi tái sử dụng, tương tự như cách UITableViewCells làm việc. Trong khi di chuyển, các dòng yêu cầu đánh dấu lại các điểm đánh dấu kéo ra khỏi hồ bơi và các đường mà đã di chuyển khỏi màn hình đổ các điểm đánh dấu của chúng trở lại vào hồ bơi.

Bất kỳ ai có thể giải thích cách tôi nhận được x và y của một từ nhất định?

+0

Đây là cách thực hiện. https://discussions.apple.com/thread/2511930?start=0&tstart=0 –

Trả lời

33

UITextView phù hợp với UITextInput, trong đó mô tả chi tiết có thể được tìm thấy here.

Hãy xem các phương thức bắt buộc "textRangeFromPosition: toPosition:", "positionFromPosition: offset:", "positionFromPosition: inDirection: offset:" và một số phương thức dựa trên hình học khác trong Giao thức UITextInput. Những người có thể cung cấp các chức năng mà bạn đang tìm kiếm.

Tôi chưa thực sự cố gắng đảm bảo những công việc này theo cách bạn muốn, nhưng trông giống như những gì bạn cần.

Hãy cho tôi biết nếu bạn cần thêm trợ giúp nào!


UPDATE:

Dưới đây là một số mẫu mã như thế nào để làm điều này. Tôi đã nhận được phương thức "firstRectForRange:" để làm việc. Mã này về cơ bản có ba chữ cái cuối cùng của "textStuff" UITextView và làm nổi bật nó màu xanh lục.

UITextView *textStuff = [[UITextView alloc] init]; 
textStuff.frame = CGRectMake(2.0, 200.0, 200.0, 40.0); 
textStuff.text = @"how are you today?"; 
textStuff.textColor = [UIColor blackColor]; 

UITextPosition *Pos2 = [textStuff positionFromPosition: textStuff.endOfDocument offset: nil]; 
UITextPosition *Pos1 = [textStuff positionFromPosition: textStuff.endOfDocument offset: -3]; 

UITextRange *range = [textStuff textRangeFromPosition:Pos1 toPosition:Pos2]; 

CGRect result1 = [textStuff firstRectForRange:(UITextRange *)range ]; 

NSLog(@"%f, %f", result1.origin.x, result1.origin.y); 

UIView *view1 = [[UIView alloc] initWithFrame:result1]; 
view1.backgroundColor = [UIColor colorWithRed:0.2f green:0.5f blue:0.2f alpha:0.4f]; 
[textStuff addSubview:view1]; 

Kết quả chạy mã này:

enter image description here

+0

Bạn có mã bắt đầu có thể cho tôi điều gì đó để thúc đẩy không? – Sirens

+0

Tôi đã cập nhật câu trả lời với một số mã mẫu. Bắt đầu từ đó và sửa đổi nó để làm cho nó hoạt động theo cách bạn muốn. – bddicken

+0

Công việc này có phù hợp với bạn không? Tôi sẽ đánh giá cao bạn chấp nhận nó như là câu trả lời nếu có. – bddicken

5

@ bddicken của https://stackoverflow.com/a/11487125/3549781 công trình như một say mê. Nhưng vấn đề là, nó không hoạt động trên iOS 7+ nếu văn bản có dòng mới "\ n". Sau rất nhiều tìm kiếm, tôi tìm thấy một giải pháp cho điều đó.

Bạn phải đảm bảo bố trí của TextView trước khi gọi firstRectForRange: bởi

[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer]; 

Courtesy: UITextView firstRectForRange not working when there's new line characters in the mix

Tái bút: Lúc đầu, tôi nói thêm điều này như một bình luận cho câu trả lời @ bddicken của. Vì hầu hết mọi người không đọc nhận xét, tôi đã thêm nhận xét này làm câu trả lời.

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