Objective-C中Android的“Spannable”相当于什么

我在一个iOS应用程序,应该能够突出文本,并使其可点击。

我在iOS中阅读了有关NSAttributedString的内容 ,但它比Android中的Spannable更复杂。

如果没有,还有没有其他的Objective c方法可以做到这一点? 我应该怎么做,使用NSAttributedString单词突出显示一个段落,以及如何使我的文本点击。

更新:

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

我find了一个使用UITextView的完美解决scheme,它将使UITextView每个单词UITextView点击。

首先,创build一个UITextViewUITapGestureRecognizer添加一个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 AB $ & - +"]; [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]; } 

这就是它,希望这可以帮助别人。

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

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

  1. 创build一个UILabel或UITextView。
  2. 使用NSMutableAttributedString和NSRange突出显示一些单词(见下文)。
  3. 将属性string应用于属性文字属性。
  4. 创build具有清晰背景的UIButton,并且在可点击的单词的顶部没有标签和位置。
  5. 为每个button添加一个目标,并创build一个select器方法。

下面是一些示例代码,让你开始使用属性string:

 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;