带声音/音频的NSMutableAttributedString

时间:2015-08-17 13:36:32

标签: ios swift

例如,我有一行

  

这是一个测试

点击每个单词后,会产生相应的声音。现在我将通过不同的方法来实现它,我发现了NSMutableAttributedString。您可以为单个单词添加属性,如图像或字体等。我的问题是,是否有任何属性可以将声音添加到字母组中。或者你能提出更好的方法吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

使用属性字符串,您可以为单击的每个单词调用您的方法,然后您可以在识别单词后播放相应的声音。 属性字符串允许您添加自定义属性,然后识别不同的单词类别并相应地应用不同的操作

首先添加识别器

UITapGestureRecognizer *singleFingerTap =
            [[UITapGestureRecognizer alloc] initWithTarget:self
                                                    action:@selector(textTapped:)];

然后在你的方法

- (void)textTapped:(UITapGestureRecognizer *)recognizer
{
    UITextView *textView = (UITextView *)recognizer.view;

    // Location of the tap in text-container coordinates

    NSLayoutManager *layoutManager = textView.layoutManager;
    CGPoint location = [recognizer locationInView:textView];
    location.x -= textView.textContainerInset.left;
    location.y -= textView.textContainerInset.top;

    NSLog(@"location: %@", NSStringFromCGPoint(location));

    // Find the character that's been tapped on

    NSUInteger characterIndex;
    characterIndex = [layoutManager characterIndexForPoint:location
                                           inTextContainer:textView.textContainer
                  fractionOfDistanceBetweenInsertionPoints:NULL];

    if (characterIndex < textView.textStorage.length) {

        NSRange range;
        NSDictionary *attributes = [textView.textStorage attributesAtIndex:characterIndex effectiveRange:&range];
        NSLog(@"%@", NSStringFromRange(range));
      }
}

enter code here

如果您添加了服装属性

[paragraph addAttribute:@"hashtag" value:@(YES) range:wordRange]; 

您可以使用

找到它
       NSDictionary *attributes = [textView.textStorage attributesAtIndex:characterIndex effectiveRange:&range];


        //Based on the attributes, do something
        if ([attributes objectForKey:@"hashtag"]) {
            NSLog(@"hashtag");
            NSLog(@"clicked: %@",[textView.text substringWithRange:range] );
        }

答案 1 :(得分:0)

主要任务是在用户触摸单词并识别单词时收到通知。

您可以将URL(具有特殊格式)添加到任何单词,并在用户单击时订阅通知(作为textView的委托)。 例如,您可以为&#34; word&#34;:

创建此网址
soundscheme://word 

如何使用带有字符串的URL和订阅作为UITextView的委托,您可以阅读here。 委托方法可以是这样的:

 -(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{

 // Play sound here
 return NO;
 }

此外,您可以使用TTTAttributedLabel在用户触摸网址时获取操作,它支持委托方法来通知网址的触摸。