2013-02-06 15 views
5

Bir paragraf görüntüleyen bir UITextView sahibim. Örneğin: [self aFunction:@"This"]İçinde bir kelime işaretlendiğinde UITextView dokunma olayını işleme

kullanım için orada herhangi bir fikir var:

self.myTextView.text = @"This is a sample paragraph" 

Şimdi ne yapmak istiyorum böyle "Bu", bir işlev çağırmak üzere, bu paragrafta bir kelime dokunduğumda olduğunu Bu olay ve parametreye ulaşmanın yolu, ki bu kullanıcı kelimesine dokundu. Belki de UITextView ile paragrafı görüntülemenin başka bir yoluna ihtiyacım var. Sonra

#import "WWLabel.h" 

#define WWLabelDefaultInset 5 

@implementation WWLabel 

@synthesize topInset, leftInset, bottomInset, rightInset; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.topInset = WWLabelDefaultInset; 
     self.bottomInset = WWLabelDefaultInset; 
     self.rightInset = WWLabelDefaultInset; 
     self.leftInset = WWLabelDefaultInset; 
    } 
    return self; 
} 

- (void)drawTextInRect:(CGRect)rect 
{ 
    UIEdgeInsets insets = {self.topInset, self.leftInset, 
     self.bottomInset, self.rightInset}; 

    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; 
} 

benim özel etiket bulunan bir UIView alt sınıfı oluşturuldu:

+0

U o kelimenin bir köprü .... – IronManGill

+0

Gill-TheIronMan @ yapmak zorunda kalacak: o köprü olarak tüm metnini yapmak gerekir bu durumda da mümkün değil. –

+0

Güzel bir soru, ben de çözümü görmek için bekliyorum :) –

cevap

1

örnek kullanımını (UITextView) Aşağıdaki yılında

bana gömme değerini ayarlamak olanak tanıyan basit UILabel alt sınıfı yarattı ve dokunun üzerine, etiket içindeki her kelime için metnin büyüklüğünü, dokunma noktasının boyutu aşana kadar oluşturdu - bu, dokunulduğu kelimedir. Bu valilik değil, ama şimdilik yeterince iyi çalışıyor.

Sonra metni vurgulamak için basit NSAttributedString kullandı:

#import "WWPhoneticTextView.h" 
#import "WWLabel.h" 

#define WWPhoneticTextViewInset 5 
#define WWPhoneticTextViewDefaultColor [UIColor blackColor] 
#define WWPhoneticTextViewHighlightColor [UIColor yellowColor] 

#define UILabelMagicTopMargin 5 
#define UILabelMagicLeftMargin -5 

@implementation WWPhoneticTextView { 
    WWLabel *label; 
    NSMutableAttributedString *labelText; 
    NSRange tappedRange; 
} 

// ... skipped init methods, very simple, just call through to configureView 

- (void)configureView 
{ 
    if(!label) { 
     tappedRange.location = NSNotFound; 
     tappedRange.length = 0; 

     label = [[WWLabel alloc] initWithFrame:[self bounds]]; 
     [label setLineBreakMode:NSLineBreakByWordWrapping]; 
     [label setNumberOfLines:0]; 
     [label setBackgroundColor:[UIColor clearColor]]; 
     [label setTopInset:WWPhoneticTextViewInset]; 
     [label setLeftInset:WWPhoneticTextViewInset]; 
     [label setBottomInset:WWPhoneticTextViewInset]; 
     [label setRightInset:WWPhoneticTextViewInset]; 

     [self addSubview:label]; 
    } 


    // Setup tap handling 
    UITapGestureRecognizer *singleFingerTap = [[UITapGestureRecognizer alloc] 
               initWithTarget:self action:@selector(handleSingleTap:)]; 
    singleFingerTap.numberOfTapsRequired = 1; 
    [self addGestureRecognizer:singleFingerTap]; 
} 

- (void)setText:(NSString *)text 
{ 
    labelText = [[NSMutableAttributedString alloc] initWithString:text]; 
    [label setAttributedText:labelText]; 
} 

- (void)handleSingleTap:(UITapGestureRecognizer *)sender 
{ 
    if (sender.state == UIGestureRecognizerStateEnded) 
    { 
     // Get the location of the tap, and normalise for the text view (no margins) 
     CGPoint tapPoint = [sender locationInView:sender.view]; 
     tapPoint.x = tapPoint.x - WWPhoneticTextViewInset - UILabelMagicLeftMargin; 
     tapPoint.y = tapPoint.y - WWPhoneticTextViewInset - UILabelMagicTopMargin; 

     // Iterate over each word, and check if the word contains the tap point in the correct line 
     __block NSString *partialString = @""; 
     __block NSString *lineString = @""; 
     __block int currentLineHeight = label.font.pointSize; 
     [label.text enumerateSubstringsInRange:NSMakeRange(0, [label.text length]) options:NSStringEnumerationByWords usingBlock:^(NSString* word, NSRange wordRange, NSRange enclosingRange, BOOL* stop){ 

      CGSize sizeForText = CGSizeMake(label.frame.size.width-2*WWPhoneticTextViewInset, label.frame.size.height-2*WWPhoneticTextViewInset); 
      partialString = [NSString stringWithFormat:@"%@ %@", partialString, word]; 

      // Find the size of the partial string, and stop if we've hit the word 
      CGSize partialStringSize = [partialString sizeWithFont:label.font constrainedToSize:sizeForText lineBreakMode:label.lineBreakMode]; 

      if (partialStringSize.height > currentLineHeight) { 
       // Text wrapped to new line 
       currentLineHeight = partialStringSize.height; 
       lineString = @""; 
      } 
      lineString = [NSString stringWithFormat:@"%@ %@", lineString, word]; 

      CGSize lineStringSize = [lineString sizeWithFont:label.font constrainedToSize:label.frame.size lineBreakMode:label.lineBreakMode]; 
      lineStringSize.width = lineStringSize.width + WWPhoneticTextViewInset; 

      if (tapPoint.x < lineStringSize.width && tapPoint.y > (partialStringSize.height-label.font.pointSize) && tapPoint.y < partialStringSize.height) { 
       NSLog(@"Tapped word %@", word); 
       if (tappedRange.location != NSNotFound) { 
        [labelText addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:tappedRange]; 
       } 

       tappedRange = wordRange; 
       [labelText addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:tappedRange]; 
       [label setAttributedText:labelText]; 
       *stop = YES; 
      } 
     }];   
    } 
} 
+0

Çok teşekkürler! Deneyeceğim. – hnimnart

+0

Yolunu gördüm, ama onu uygulayamadım ve şimdi hata buldum. – hnimnart

İlgili konular