在UITextView中更改一个链接的属性

时间:2015-04-06 12:08:18

标签: ios objective-c uitextview

通过将UITextView属性设置为dataDetectorTypes,我激活了多个网址UIDataDetectorTypeLink。然后我使用linkTextAttributes属性来设置链接的颜色。现在,当用户点击其中一个链接(使用UITapGestureRecognizer)时,我只想更改该链接的颜色。如果我更改linkTextAttributes,则所有链接都会改变颜色。

如何更改所点击链接的颜色?

2 个答案:

答案 0 :(得分:0)

如果这些网址是固定的。 例如: 我有以下网址:

我会将它们放到NSAttributedString中 使用NSMutableAttributedString将它们全部组合

NSMutableAttributedString *urlsAttributedText = [[NSMutableAttributedString alloc]init];

NSAttributedString *url1 = [[NSAttributedString alloc]initWithString:NSLocalizedString(@"http://www.123.com\n", nil) attributes:@{NSForegroundColorAttributeName : [UIColor whiteColor], NSFontAttributeName : [UIFont systemFontOfSize:15.0f]}];

NSAttributedString *url2 = [[NSAttributedString alloc]initWithString:NSLocalizedString(@"http://www.456.com\n", nil) attributes:@{NSForegroundColorAttributeName : [UIColor greenColor], NSFontAttributeName : [UIFont systemFontOfSize:15.0f]}];

NSAttributedString *url3 = [[NSAttributedString alloc]initWithString:NSLocalizedString(@"http://www.789.com\n", nil) attributes:@{NSForegroundColorAttributeName : [UIColor redColor], NSFontAttributeName : [UIFont systemFontOfSize:15.0f]}];

[urlsAttributedText url1];
[urlsAttributedText appendAttributedString:url2];
[urlsAttributedText appendAttributedString:url3];

self.texView.attributedText = urlsAttributedText;

干杯!

答案 1 :(得分:0)

我认为我使用UITextView的子类来解决它,该子类具有rangeOfLink属性。

首先,在我的UIViewController viewDidLoad:中,我添加了

self.textView.dataDetectorTypes = UIDataDetectorTypeLink; // change for other link types
self.textView.selectable = YES;
self.textView.userInteractionEnabled = YES;

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(handleTap:)];
tapGesture.cancelsTouchesInView = YES;

[self.textView addGestureRecognizer: tapGesture];
[self.textView setNeedsDisplay]; // force a redraw so that drawRect is called

然后在handleTap,我这样做:

MyTextViewWithLink *aTextView = (IDTextViewWithLink *) recognizer.view;

if (aTextView != self.textView)
    return;

if (recognizer.state == UIGestureRecognizerStateEnded)
{
    CGPoint location = [recognizer locationInView: aTextView];

 // this returns an NSTextCheckingResult if location is inside a link
    NSTextCheckingResult *result = [self textCheckingResultAtPoint: location inTextView: aTextView]; 

    if (result)
    {
        aTextView.rangeOfLink = result.range;
        [aTextView setNeedsDisplay]; // this will force the color change

        // open url
    }
}

最后,我在drawRect子类中重写UITextView

self.linkTextAttributes = [NSDictionary dictionary];

NSError *error = nil;
NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes: NSTextCheckingTypeLink error: &error];  // change for other link types

if (!error && dataDetector)
{
    NSArray* resultString = [dataDetector matchesInString: self.text
                                              options: NSMatchingReportProgress
                                                range: NSMakeRange(0, [self.text length])];
    if (resultString.count > 0)
    {
        NSMutableAttributedString *mas = [self.attributedText mutableCopy];

        for (NSTextCheckingResult* result in resultString)
        {
            if (result.resultType == NSTextCheckingTypeLink)
            {
                NSRange intersection = NSIntersectionRange(result.range, self.rangeOfLink);

                if (intersection.length <= 0) // no match
                    [mas addAttribute: NSForegroundColorAttributeName
                                value: [UIColor blueColor]
                                range: self.rangeOfLink];
                else
                    [mas addAttribute: NSForegroundColorAttributeName
                                value: [UIColor redColor]
                                range: self.rangeOfLink];
            }
        }

        self.attributedText = mas;
    }
}

[super drawRect: rect];

现在,如果textView有多个链接,则只有选定的链接会改变颜色。