Чтобы сделать текст ярлыка ссылкой

Я использовал "Регистрировать себя" как текст. Я хочу сделать это как ссылку. И нажав на эту ссылку, он должен открыть Register.xib.

Как я могу получить эту ссылку?

Ответ 1

Карим прав. Создайте объект UIButton, установите для него тип "Пользовательский", а затем вы можете присвоить ему название. Подключите действие к методу, который подталкивает или представляет ваш контроллер представления реестра, и все будет установлено.

Вероятно, вы захотите указать пользователю, что текст является ссылкой на клики. Либо установите цвет текста на синий. Другой, полностью отдельный вариант - использовать NSAttributedString (который имеет атрибут подчеркивания), чтобы указать пользователю, что текст доступен для клика. Для этого требуется замена Open Source для UITextView (о чем вы можете узнать из этого связанного вопроса).

Ответ 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 ;
        }
    }
}

Ответ 3

Там есть место, которое стоит упомянуть. Использование UIButton с UIButtonTypeCustom имеет некоторые недостатки, а именно, что у вас ограниченный контроль над стилем текста (например, вы не можете сделать его правым или левым выровненным, он всегда будет центрирован).

Использование NSAttributedString может быть чрезмерным и сложным для реализации, если вы не знакомы с NSAttributedString, CoreText и т.д.

Решение, которое я использовал, представляет собой простой подкласс UIControl, который позволяет настраивать больше, чем подклассификация UIButton и меньше хлопот, чем NSAttributedString et al. Подход UIControl подходит только в том случае, если вся строка будет "ссылкой".

Вы бы сделали что-то подобное в своем подклассе UIControl:

  • Добавить подтекст UILabel в методе init
  • Настройте UILabel с помощью ваших желаемых backgroundColor, textColor, textAlignment и т.д., включая изменения слоя UILabel, если вы хотите, чтобы фон отображался как Twitter в tweet-ссылках в приложении iOS
  • Переопределите метод setHighlighted:, чтобы настроить изменения внешнего вида прикосновения/отслеживания
  • Добавьте @property сеттеры в файл .h, чтобы класс владельца мог установить состояние

Ответ 4

Сначала создайте присланную строку и сохраните диапазон интерактивного текста и самого текста.

Затем нарисуйте присланную строку с помощью 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 *) касается событияEvent: (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 для реализации требований, возможно, вы могли бы проверить библиотеку документов sdk Apple.

Ответ 5

Возьмите кнопку и установите заголовок кнопки, которую вы хотите установить как текст гиперссылки. Вы можете выбрать кнопку по умолчанию и пользовательскую кнопку кнопки в iOS 7 и iOS 8, но для ниже iOS 7 вы должны использовать только тип кнопки. Вы можете изменить цвет текста, чтобы выделить текст для пользовательского интерфейса, а затем добавить любое действие, которое вы хотите добавить при нажатии этой кнопки. Это будет работать как шарм, удача.

Ответ 6

Взгляните на TTTAttributedLabel. Очень просто настроить ссылки, телефоны и т.д.