2013-02-06 11 views
5

私は段落を表示するUITextViewを持っています。たとえば:[self aFunction:@"This"]UITextViewタッチイベントを処理するときに単語をタッチする

は取り扱いのための任意のアイデアがありますように「この」として

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

私はこの段落で単語をタッチすると私が今やりたいことはある、関数が呼び出しになりますこのイベントとパラメータを取得する方法は、ユーザという言葉に触れています。たぶん、段落を表示するには別の方法が必要ですが、UITextViewではありません。次の例では

+0

Uは、その単語のハイパーリンクを作成する必要があります.... – IronManGill

+0

ギル-TheIronMan @:彼はハイパーリンクとしてテキスト全体をする必要がありますこの状況ではまた不可能である。 –

+0

良い質問、私はまた、ソリューションを参照してください:) –

答えて

1

使用(UITextView

私は私がインセット値を設定することができるシンプルなUILabelサブクラスを作成しました:

#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)]; 
} 

は、その後、私は私のカスタムラベルを含まUIViewのサブクラスを作成しましたタブ上では、タップ位置のサイズを超えるまで、ラベル内の各単語のテキストのサイズを作成しました。これがタップされた単語です。それは支配者ではありませんが、現在は十分に機能しています。

私は、テキストをハイライト表示するシンプルなNSAttributedStringを使用:

#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

ありがとう!私はそれを試してみます。 – hnimnart

+0

私はあなたの道を見ましたが、私はそれを実装することができず、バグを見つけられませんでした。 – hnimnart