Objective-C中Android的“Spannable”相当于什么
我在一个iOS
应用程序,应该能够突出文本,并使其可点击。
我在iOS中阅读了有关NSAttributedString的内容 ,但它比Android中的Spannable更复杂。
如果没有,还有没有其他的Objective c
方法可以做到这一点? 我应该怎么做,使用NSAttributedString
单词突出显示一个段落,以及如何使我的文本点击。
更新:
我想要什么,每个单词应该是可点击的,并且可以在一个段落中突出显示为单个单词 。
我find了一个使用UITextView
的完美解决scheme,它将使UITextView
每个单词UITextView
点击。
首先,创build一个UITextView
并UITapGestureRecognizer
添加一个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那样简单。
但是,它可以很容易地完成:
- 创build一个UILabel或UITextView。
- 使用NSMutableAttributedString和NSRange突出显示一些单词(见下文)。
- 将属性string应用于属性文字属性。
- 创build具有清晰背景的UIButton,并且在可点击的单词的顶部没有标签和位置。
- 为每个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;