2010-09-29 40 views
9

Tôi có một số trình xử lý cảm ứng phản ứng với một lần chạm trên một giao diện mà tôi đã vẽ một số văn bản được phân bổ trong đó thông qua điều này, tôi đã đến điểm mà tôi có CTRunRef (và liên kết dòng) cũng như số lượng glyphs trong lần chạy đó.Các ký tự ánh xạ lõi của

Những gì tôi không thể tìm ra một cách dễ dàng, là cách tôi có thể thực hiện việc chạy glyph đó và, cho chuỗi được phân bổ của tôi, ánh xạ nó ra các ký tự trong chuỗi.

Cụ thể vấn đề là tôi muốn biết từ người dùng đã nhấn vào trong chế độ xem, vì vậy tôi có thể xử lý liệu từ đó có phải là URL hay không và kích hoạt phương thức ủy quyền tùy chỉnh để tôi có thể mở chế độ xem web nó. Tôi có tất cả các nền tảng có thể, tôi chỉ không biết làm thế nào để bản đồ nơi người dùng khai thác một chuỗi con cụ thể.

Mọi trợ giúp sẽ được đánh giá cao.

CẬP NHẬT: Tôi đã thực sự đi và thực hiện theo cách khác, theo đề xuất của một người khác tắt lưu lượng truy cập. Về cơ bản những gì tôi đã làm là để thiết lập một thuộc tính tùy chỉnh, @"MyAppLinkAddress" với giá trị của URL tôi tìm thấy khi tôi đã chuyển đổi chuỗi thành một chuỗi được phân bổ. Điều này xảy ra trước khi tôi vẽ chuỗi. Vì vậy, khi một sự kiện tap xảy ra, tôi chỉ kiểm tra xem thuộc tính đó có tồn tại không, và nếu có, hãy gọi phương thức ủy nhiệm của tôi, nếu không, chỉ cần bỏ qua nó. Nó đang hoạt động như bây giờ, nhưng tôi sẽ để câu hỏi này mở thêm vài ngày nữa, nếu ai đó có thể đưa ra câu trả lời, tôi sẽ vui vẻ chấp nhận nó nếu một giải pháp làm việc của nó để một số người khác có thể tìm thấy thông tin này hữu ích tại một số thời điểm trong tương lai.

Trả lời

7

Vì vậy, như tôi đã đề cập trong bản cập nhật, tôi đã chọn để đi một tuyến đường khác. Thay vào đó, tôi đã có ý tưởng sử dụng thuộc tính tùy chỉnh trong chuỗi được phân bổ để chỉ định liên kết của tôi, vì tôi đã có nó tại thời điểm tạo. Vì vậy, tôi đã làm điều đó. Sau đó, trong xử lý cảm ứng của tôi, khi một chạy được khai thác, tôi kiểm tra xem chạy có thuộc tính đó, và nếu như vậy, hãy gọi đại biểu của tôi với nó. Từ đó tôi vui vẻ tải một webview với URL đó.

EDIT: Dưới đây là đoạn mã giải thích những gì tôi đã làm trong câu trả lời này. Thưởng thức.

// When creating the attribute on your text store. Assumes you have the URL already. 
// Filled in for convenience 
NSRange urlRange = [tmpString rangeOfString:@"http://www.foo.com/"]; 
[self.textStore addAttribute:(NSString*)kCTForegroundColorAttributeName value:(id)[UIColor blueColor].CGColor range:urlRange]; 
[self.textStore addAttribute:@"CustomLinkAddress" value:urlString range:urlRange]; 

sau đó ...

// Touch handling code — Uses gesture recognizers, not old school touch handling. 
// This is just a dump of code actually in use, read through it, ask questions if you 
// don't understand it. I'll do my best to put it in context. 
- (void)receivedTap:(UITapGestureRecognizer*)tapRecognizer 
{ 
     CGPoint point = [tapRecognizer locationInView:self]; 

     if(CGRectContainsPoint(textRect, point)) 
     { 
       CGContextRef context = UIGraphicsGetCurrentContext(); 

       point.y = CGRectGetHeight(self.contentView.bounds) - kCellNameLabelHeight - point.y; 

       CFArrayRef lines = CTFrameGetLines(ctframe); 
       CFIndex lineCount = CFArrayGetCount(lines); 
       CGPoint origins[lineCount]; 
       CTFrameGetLineOrigins(ctframe, CFRangeMake(0, 0), origins); 
       for(CFIndex idx = 0; idx < lineCount; idx++) 
       { 
         CTLineRef line = CFArrayGetValueAtIndex(lines, idx); 
         CGRect lineBounds = CTLineGetImageBounds(line, context); 
         lineBounds.origin.y += origins[idx].y; 

         if(CGRectContainsPoint(lineBounds, point)) 
         { 
           CFArrayRef runs = CTLineGetGlyphRuns(line); 
           for(CFIndex j = 0; j < CFArrayGetCount(runs); j++) 
           { 
             CTRunRef run = CFArrayGetValueAtIndex(runs, j); 
             NSDictionary* attributes = (NSDictionary*)CTRunGetAttributes(run); 
             NSString* urlString = [attributes objectForKey:@"CustomLinkAddress"]; 
             if(urlString && ![urlString isEqualToString:@""]) 
             { 
               [self.delegate didReceiveURL:[NSURL URLWithString:urlString]]; 
               UIGraphicsPopContext(); 
               return; 
             } 
           } 
         } 
       } 
       UIGraphicsPopContext(); 
     } 
} 
+0

Bạn không cần phải gọi 'UIGraphicsPopContext()' tại đây. Bạn chỉ nhận được bối cảnh, không phải đẩy một cái mới. – mohsenr

3

Sau khi bạn tìm thấy những dòng khai thác, bạn có thể yêu cầu các chỉ số trong chuỗi bằng cách gọi CTLineGetStringIndexForPosition(). Không cần truy cập vào các lần chạy riêng lẻ.

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