2012-01-04 15 views
10

Użyłem "Zarejestruj się" jako tekst. Chcę zrobić to jako link. I klikając ten link, powinien otworzyć się Register.xib.Aby utworzyć tekst etykiety jako link

Jak mogę uzyskać ten link?

+0

nie można odczytać znaczenia. Masz na myśli, jak utworzyć hiperłącze do tekstu, a następnie po kliknięciu przejść do widoku rejestru? – Raptor

+5

Lepiej używać UIbutton typu niestandardowego zamiast Lablel. –

+0

Brzmi tak. http://stackoverflow.com/questions/4743457/how-to-customize-uilabel-clickable – Ilanchezhian

Odpowiedz

12

Kareem ma rację. Utwórz obiekt UIButton, ustaw jego typ na "Niestandardowy", a następnie nadaj mu tytuł. Połącz akcję z metodą, która popycha lub prezentuje kontroler widoku rejestru, a wszystko zostanie ustawione.

Prawdopodobnie zechcesz poinformować użytkownika, że ​​tekst jest klikalnym linkiem. Ustaw kolor tekstu na niebieski. Inną, całkowicie oddzielną opcją jest użycie NSAttributedString (która ma atrybut podkreślenia), aby wskazać użytkownikowi, że tekst jest klikalny. To wymaga an Open Source replacement for UITextView (o czym możesz dowiedzieć się więcej od this related question).

+0

Hej wszystkim, Kareem, Michael, bardzo dziękuję ... ale mam inne zapytanie, że nie mogłem znaleźć żadnej metody wskazującej użytkownikowi, że tekst jest klikalny, tj. Ma kolor niebieski tekstu. Kolejna rzecz, czy mogę mieć symbol "ręki", gdy użytkownik przesuwa kursor nad tym ciągiem ... ??? – Krunal

+0

Myślę, że pytasz o aplikację na iPhone'a, a aplikacja iPhone nie wyświetla żadnego kursora na ekranie, prawda? – DivineDesert

+0

Ups ... tak, mam to ... – Krunal

0

Najpierw skonstruuj przypisany ciąg i zapisz zakres interaktywnego tekstu i samego tekstu.

Następnie narysuj przypisany ciąg za pomocą CoreText Framework, zachowaj 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); 

Ostatnim, przesłonić [view touchesEnded: (NSSet *) dotyka withEvent: (UIEvent *) event] tak:

- (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; 
} 

uzyskać tekst interaktywny touchesEnded, to można rób cokolwiek chcesz, na przykład wyzwalaj metodę delegata.

PS: to jest staromodne rozwiązanie, słyszałem, że iOS5 dostarczył coś w rodzaju ulepszonego interfejsu UIWebView do implementacji wymagań, może mógłbyś sprawdzić bibliotekę dokumentów Apple SDK.

+0

Co to jest "InteractiveString" Nie znalazłem tego .... –

2

myślę o poniżej was to, co chcesz ...

- (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

Jest kompromis, że warto wspomnieć. Używanie UIButton z UIButton z UIButtonTypeCustom ma pewne niedociągnięcia, a mianowicie, że masz ograniczoną kontrolę nad stylem tekstu (np. Nie możesz dokonać wyrównania w prawo lub w lewo, zawsze będzie ono wyśrodkowane).

Korzystanie NSAttributedString może być przesadą, i trudne do wdrożenia, jeśli jesteś zaznajomiony z NSAttributedString, CoreText itp

Rozwiązanie Użyłem jest prostą podklasą UIControl która umożliwia dostosowywanie więcej niż instacji UIButton i mniej kłopotów niż NSAttributedString i in. Podejście UIControl jest odpowiednie tylko wtedy, gdy cały ciąg będzie "linkiem".

Można by zrobić coś takiego w swoim UIControl podklasy:

  • Dodaj UILabel podrzędny w metodzie init,
  • Konfiguracja UILabel z żądanego backgroundColor, textColor, textAlignment etc, w tym zmian do UILabel warstwa, jeśli chcesz, aby tło wyglądało jak linki do Twittera w tweetach w aplikacji na iOS
  • Zastąp metodę setHighlighted:, aby dostosować wygląd d czuć zmiany na dotyk/śledzenia
  • Dodaj @property ustawiające w pliku .h więc klas posiadających można ustawić stan
0

Take przycisk i ustawić tytuł przycisku, który chcesz ustawić jako hiperłącza tekst. Możesz wybrać domyślny i niestandardowy przycisk typu przycisku w systemie iOS 7 i iOS 8, ale poniżej iOS 7 musisz wybrać tylko typ przycisku. Możesz zmienić kolor tekstu, aby podświetlić tekst interfejsu użytkownika, a następnie dodać dowolne działanie, które chcesz dodać do tego przycisku. Będzie działać jak urok, powodzenia.

Powiązane problemy