Что эквивалентно Android Spannable в Objective-C

Я использую приложение iOS, которое должно выделять текст и делать его интерактивным.

Я прочитал о NSAttributedString в iOS, но все же сложнее, чем Spannable в Android.

Есть ли другой Objective c способ сделать это, если нет; что мне делать, используя NSAttributedString, чтобы выделить абзац слово за словом, и как сделать мой текст кликабельным.

Обновление:

Что именно я хочу, чтобы каждое слово было кликабельным и могло быть выделено как одно слово в одном абзаце.


person Mutawe    schedule 18.11.2013    source источник
comment
Самый простой способ, вероятно, загрузить HTML в UIWebView   -  person jbat100    schedule 18.11.2013
comment
Я хочу сделать это изначально, используя цель c   -  person Mutawe    schedule 18.11.2013
comment
возможный дубликат Невозможно сделать URL-адрес доступным для кликов в UITextView   -  person Abizern    schedule 18.11.2013
comment
Нет, он не дублируется, потому что при поиске эквивалента Spannable (каждое слово должно быть кликабельным и может быть выделено как одно слово), прочитайте вопрос !!!!   -  person Mutawe    schedule 18.11.2013
comment
Если вы читаете ответ, там довольно много подсказок, которые помогут. Или вы просто ждете, пока кто-нибудь даст вам несколько строк кода, которые вам нужны?   -  person Abizern    schedule 18.11.2013
comment
вы, вероятно, ищете не ту вещь. чтобы что-то было интерактивным в какао-тач, оно должно происходить от UIResponder. вам нужен какой-то тип представления, который может отображать строку с атрибутами.   -  person Brad Allred    schedule 20.11.2013
comment
Я нашел решение, и я разместил его как ответ   -  person Mutawe    schedule 24.11.2013


Ответы (2)


Я нашел идеальное решение, используя 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];

}

И это все, надеюсь, что это поможет другим.

person Mutawe    schedule 24.11.2013

К сожалению, поведение, которое вы ищете, не так просто в Objective-C, как Spannable.

Тем не менее, это может быть выполнено довольно легко:

  1. Создайте UILabel или UITextView.
  2. Выделите некоторые слова, используя NSMutableAttributedString и NSRange (см. ниже).
  3. Примените атрибутированную строку к свойству attributeText.
  4. Создавайте UIButtons с четким фоном, без меток и располагайте их поверх интерактивных слов.
  5. Добавьте цель к каждой кнопке и создайте метод селектора.

Вот пример кода для строки с атрибутами для начала:

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; 
person Andy Kaminski    schedule 22.11.2013
comment
У меня более 1000 слов, это тяжело!! - person Mutawe; 22.11.2013
comment
В этом случае у вас остается только 2 варианта: отформатировать текст как html и использовать UIWebView или найти библиотеку, в которой кто-то уже решил эту проблему. - person Andy Kaminski; 27.11.2013