将标签文本作为链接

时间:2012-01-04 08:58:06

标签: ios

我使用“自己注册”作为文字。我想把它作为链接。点击该链接即可打开Register.xib

如何获得此链接?

6 个答案:

答案 0 :(得分:12)

卡里姆是对的。创建一个UIButton对象,将其类型设置为“自定义”,然后您可以给它一个标题。将操作连接到推送或显示您的注册视图控制器的方法,您将全部设置。

您可能希望向用户说明该文本是可点击的链接。将文本的颜色设置为蓝色。另一个完全独立的选项是使用NSAttributedString(具有下划线属性)向用户指示文本是可点击的。这需要an Open Source replacement for UITextView(您可以从this related question了解更多信息。)

答案 1 :(得分:2)

我想从下面你会得到你想要的......

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{   
    NSSet *allTouches = [event allTouches];
    if ([allTouches count] == 1)
    {
        UITouch *touch = (UITouch *)[allTouches anyObject];
        CGPoint touchPoint = [touch locationInView:self];

        // Convert to coordinate system of current view
        touchPoint.y -= self.bounds.size.height;
        touchPoint.y *= -1;

        CGPathRef statusPath = CTFrameGetPath(statusCTFrame);
        NSString *touchedInterStr = nil;
        if (CGPathContainsPoint(statusPath, NULL, touchPoint, FALSE))
        {
            touchedInterStr = [self getInteractiveStringInFrame:statusCTFrameatPosition:touchPoint];
        }
        else
        {
            return ;
        }
    }
}

答案 2 :(得分:2)

有一个值得一提的中间立场。将UIButtonUIButtonTypeCustom一起使用有一些缺点,即您对文本样式的控制有限(例如,您无法使其右对齐或左对齐,它将始终居中)。

使用NSAttributedString可能过度,如果您不熟悉NSAttributedString,CoreText等,则难以实施。

我使用的解决方案是UIControl的简单子类,它允许比子类化UIButton更多的自定义,并且比NSAttributedString等更少麻烦。仅当整个字符串是“链接”时,UIControl方法才适用。

您可以在UIControl子类中执行类似的操作:

  • 在init方法中添加UILabel子视图
  • 使用您想要的UILabelbackgroundColortextColor等配置textAlignment,如果您希望背景显示为UILabel图层,请更改setHighlighted:图层Twitter在其iOS应用程序中的推文链接
  • 覆盖@property方法以自定义触摸/跟​​踪时的外观更改
  • .h文件中添加{{1}}个设置器,以便拥有类可以设置状态

答案 3 :(得分:0)

首先,构造属性字符串并保存交互式文本和文本本身的范围。

然后,使用CoreText Framework绘制属性字符串,保留CTFrameRef。

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, bounds);

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
CFRelease(framesetter);

CTFrameDraw(frame, context);
//CFRelease(frame);

CGPathRelease(path);

最后,覆盖[view touchesEnded:(NSSet *)触及withEvent:(UIEvent *)事件],如下所示:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{   
    NSSet *allTouches = [event allTouches];
    if ([allTouches count] == 1) {
       UITouch *touch = (UITouch *)[allTouches anyObject];
       CGPoint touchPoint = [touch locationInView:self];

       // Convert to coordinate system of current view
       touchPoint.y -= self.bounds.size.height;
       touchPoint.y *= -1;

       CGPathRef statusPath = CTFrameGetPath(statusCTFrame);
       NSString *touchedInterStr = nil;
       if (CGPathContainsPoint(statusPath, NULL, touchPoint, FALSE)) {
          touchedInterStr = [self getInteractiveStringInFrame:statusCTFrame atPosition:touchPoint];
       } else {
          return ;
       }
   }
}

- (NSString *)getInteractiveStringInFrame:(CTFrameRef)frame atPosition:(CGPoint)point
{
    CGPathRef path = CTFrameGetPath(frame);
    CGRect rect;
    CGPathIsRect(path, &rect);

    // Convert point into rect of current frame, to accurately perform hit testing on CTLine
    CGPoint pointInsideRect = point;
    pointInsideRect.x = point.x - rect.origin.x;

    CFArrayRef lines = CTFrameGetLines(statusCTFrame);
    CFIndex count = CFArrayGetCount(lines);
    CGFloat curUpBound = rect.origin.y + rect.size.height;
    CFIndex touchedIndex = -1;
    for (CFIndex pos = 0; pos < count; pos++) {
        CTLineRef curLine = CFArrayGetValueAtIndex(lines, pos);
        CGFloat ascent, descent, leading;
        CTLineGetTypographicBounds(curLine, &ascent, &descent, &leading);
        CGFloat curHeight = ascent + descent + leading;
        if (pointInsideRect.y >= curUpBound-curHeight && pointInsideRect.y <= curUpBound){
            touchedIndex = CTLineGetStringIndexForPosition(curLine, pointInsideRect);   // Hit testing
            break;
        }
        curUpBound -= curHeight;
    }
    if (touchedIndex == -1)
        return nil;

    NSEnumerator *enumerator = [interactiveStrs objectEnumerator];
    InteractiveString *curString;
    while ((curString = (InteractiveString *)[enumerator nextObject])) {
        if (NSLocationInRange(touchedIndex, curString.range)) {
            return curString.content;
        }
    }

    return nil;
}

您可以在touchesEnded中获得交互式文本,然后您可以执行任何操作,例如触发委托方法。

PS:这是老式的解决方案,我听说iOS5提供了类似于增强的UIWebView来实现这些要求,也许你可以查看apple sdk文档库。

答案 4 :(得分:0)

按一个按钮并设置要设置为超链接文本的按钮的标题。您可以在iOS 7和iOS 8中选择默认和自定义按钮类型按钮,但对于iOS 7以下,您只能选择自定义按钮类型。您可以更改文本的颜色以突出显示UI的文本,然后添加要在该按钮单击上添加的任何操作。它会像魅力,祝你好运。

答案 5 :(得分:0)

看看TTTAttributedLabel。配置链接,电话等非常简单