什么是Objective-C中Android的“Spannable”

时间:2013-11-18 09:24:59

标签: ios objective-c core-text nsattributedstring spannablestring

我在一个iOS应用上,应该能够突出显示文字,并使其可以点击。

我在iOS中读到了NSAttributedString,但它比android中的Spannable更复杂。

是否有其他Objective c方法可以做到这一点,如果没有;如何使用NSAttributedString逐字突出显示段落,以及如何使我的文字可点击。

更新

  

我究竟想要的是每个单词应该可点击并且可以   在一个段落中突出显示为单个单词

2 个答案:

答案 0 :(得分:13)

我使用UITextView找到了一个完美的解决方案,它会使UITextView内的所有单词都可以点击。

首先,创建UITextView并向其添加UITapGestureRecognizer,如下所示:

CGRect textViewFrame = CGRectMake(0, 40, 100, 100);
textView = [[UITextView alloc]initWithFrame: textViewFrame];
textView.textAlignment = NSTextAlignmentCenter;
textView.backgroundColor = [UIColor clearColor];
textView.editable = NO;
textView.selectable = NO;

[self.view addSubView:textView];

// i used to `NSMutableAttributedString` highlight the text

 string = [[NSMutableAttributedString alloc]initWithString:@"Any text to detect A B $ & - +"];
    [string addAttribute:NSFontAttributeName
                  value:[UIFont systemFontOfSize:40.0]
                  range:NSMakeRange(0, [string length])];
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init] ;
    [paragraphStyle setAlignment:NSTextAlignmentCenter];

    [string addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, [string length])];

    [textView setAttributedText:string];

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];

//modify this number to recognizer number of tap
[singleTap setNumberOfTapsRequired:1];
[textView addGestureRecognizer:singleTap];

然后添加UITapGestureRecognizer @selector

- (void)tapRecognized:(UITapGestureRecognizer *)recognizer{

    if(recognizer.state == UIGestureRecognizerStateRecognized)
    {

        CGPoint point = [recognizer locationInView:recognizer.view];
        NSString * detectedText = [self getWordAtPosition:point inTextView: textView];

        if (![detectedText isEqualToString:@""]) {

    NSLog(@"detectedText  == %@", detectedText);


        } }

}

所有这些魔法与此方法有关,女巫可以检测到UITextView上的任何触摸并获取被点击的单词:

-(NSString*)getWordAtPosition:(CGPoint)pos inTextView:(UITextView*)_tv
{
    //eliminate scroll offset
    pos.y += _tv.contentOffset.y;

    //get location in text from textposition at point
    UITextPosition *tapPos = [_tv closestPositionToPoint:pos];

    //fetch the word at this position (or nil, if not available)
    UITextRange * wr = [_tv.tokenizer rangeEnclosingPosition:tapPos withGranularity:UITextGranularityWord inDirection:UITextLayoutDirectionRight];

    return [_tv textInRange:wr];
}

并突出显示文字:

-(void)setTextHighlited :(NSString *)txt{

    for (NSString *word in [textView.attributedText componentsSeparatedByString:@" "]) {

        if ([word hasPrefix:txt]) {
            NSRange range=[self.textLabel.text rangeOfString:word];
            [string addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:range];
         }}
    [textView setAttributedText:string];

}

就是这样,希望这有助于其他人。

答案 1 :(得分:0)

不幸的是,您在寻找的行为并不像Spannable那样简单。

但是,它可以很容易地完成:

  1. 创建UILabel或UITextView。
  2. 使用NSMutableAttributedString和NSRange突出显示一些单词(见下文)。
  3. 将属性字符串应用于attributedText属性。
  4. 创建UIButtons,背景清晰,没有标签和位置在可点击字词的顶部。
  5. 为每个按钮添加目标并创建选择器方法。
  6. 以下是一些代码字符串的示例代码,可帮助您入门:

    NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:  [NSString stringWithFormat:@"Text containing a bold word and another"];
    [string addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:14] range:NSMakeRange(18,4)];
    [string addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue-Bold" size:14] range:NSMakeRange(32, 7)];
    label.attributedText = string;