2010-09-29 19 views
9

Bazı öznitelikli metinleri çizdiğim bir görünümde bir dokunuşa yanıt veren bazı dokunmatik işleyicide var. Bu sayede CTRunRef (ve ilişkili olan bir noktaya var) satır) yanı sıra o glif sayısı.CoreText eşleme karakterleri

Kolayca anlayamadığım şey, bu glifler akışını nasıl alabildiğim ve öznitelikli dizgim verildiğinde dizedeki karakterlerle eşleştirebileceğim.

Özellikle sorun, kullanıcının bakışta hangi kelimeye dokunduğunu bilmek istiyorum, bu yüzden bu kelimenin bir URL olup olmadığını işleyebilir ve özel bir temsilci yöntemini devre dışı bırakabilirim böylece bir web görünümü açabilirim o. Tüm olası alt yazılara sahibim, sadece kullanıcının belirli bir alt dizgeye nasıl bağlandığını bilmiyorum.

Herhangi bir yardım büyük memnuniyetle karşılanacaktır.

UPDATE: Ben aslında başka bir kişinin stackoverflow off önerisi üzerine farklı bir şekilde gittim ve yaptım. Temel olarak yaptığım şey, özniteliği bir özniteliğe dönüştürdüğümde bulduğum URL'nin değeriyle @"MyAppLinkAddress" özel bir öznitelik ayarlamaktır. Bu dizeyi çizmeden önce olur. Bu nedenle, bir dokunma olayı oluştuğunda, yalnızca bu özniteliğin var olup olmadığını kontrol ederim ve eğer öyleyse, delege yöntemimi çağırın, eğer görmezseniz, sadece görmezden gel. Şu an nasıl çalışacağım, ama bu soruyu bir kaç gün daha açık bırakacağım, eğer birisi bir cevap bulabilirse, başkalarının da işine yarayacaksa mutlu olurum. Bu bilgiyi gelecekte bir noktada faydalı bulabilir.

cevap

7

Güncellemede bahsettiğim gibi farklı bir rotaya gitmeyi seçtim. Bunun yerine, bağlantı oluşturduğumu belirtmek için atıfta bulunulan dizgede özel bir özellik kullanma fikrini aldım, çünkü zaten oluşturma saatindeydim. Ben de öyle yaptım. Ardından, dokunma işleyicimde, bir akışa dokunulduğunda, bu koşunun o niteliğe sahip olup olmadığını kontrol ederim ve eğer öyleyse, temsilci ile görüşün. Oradan, bu URL ile mutlu bir şekilde bir web fotoğrafı yüklüyorum.

EDIT: Aşağıda bu yanıtta ne yaptığımı açıklayan kod parçacıkları vardır. Keyfini çıkarın. Dokunduğunuz çizgiyi bulduktan sonra sonra

// 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]; 

...

// 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

Burada "UIGraphicsPopContext()" aramanız gerekmez. Sadece bağlamı alıyorsun, yeni bir şeyi zorlamıyorsun. – mohsenr

3

, sen CTLineGetStringIndexForPosition() arayarak dizesinde dizin için sorabilirsiniz. Bireysel işlemlere erişmeye gerek yok.