2012-01-04 6 views
10

私は「自分自身を登録」をテキストとして使用しました。私はリンクとしてそれを作りたい。そのリンクをクリックすると、Register.xibが開きます。ラベルテキストをリンクとして作成する

どうすればこのリンクを取得できますか?

+0

あなたの意味を理解することはできません。テキストのハイパーリンクを作成する方法を意味しますか?クリックすると、登録ビューに移動しますか? – Raptor

+5

lablelの代わりにカスタムタイプのUIbuttonを使用する方が良いです。 –

+0

このような感じです。 http://stackoverflow.com/questions/4743457/how-to-customize-uilabel-clickable – Ilanchezhian

答えて

12

カレンが正しいです。 UIButtonオブジェクトを作成し、その型を「カスタム」に設定してから、タイトルを付けることができます。アクションを、レジスタビューコントローラをプッシュまたは表示するメソッドに接続すると、すべて設定されます。

おそらく、テキストがクリック可能なリンクであることをユーザーに示したいと思うでしょう。テキストの色を青に設定します。別の完全に別のオプションは、NSAttributedString(下線属性を持つ)を使用して、テキストがクリック可能であることをユーザーに示すことです。それにはan Open Source replacement for UITextViewが必要です(詳しくはthis related questionから学ぶことができます)。

+0

Hey all、Kareem、Michael、ありがとうございました....しかし、私は、テキストがクリック可能であること、つまりテキストの色が青であることをユーザーに示すための方法を見つけることができないという別のクエリを持っています。別のものは、ユーザーがその文字列にカーソルを移動すると "手"のシンボルを持つことができます.. ??? – Krunal

+0

私はあなたがiphoneアプリケーションを求めていると思うし、iphoneアプリケーションは画面上にカーソルを表示しないでください、右? – DivineDesert

+0

おっと...ええ、私はそれを持っています... – Krunal

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); 

最後、[ビューは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ドキュメントライブラリを確認できました。

+0

"InteractiveString"とは何ですか? –

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

...あなたが欲しいものを得るでしょうによって下だと思います。 UIButtonTypeCustomUIButtonを使用すると、テキストスタイルのコントロールが制限されているという欠点があります(たとえば、右揃えまたは左揃えにすることはできず、常に中央に配置されます)。あなたはNSAttributedStringに不慣れならNSAttributedStringを使用して

は、私が使用したソリューションはUIButtonと少ないのサブクラス化よりもカスタマイズできますUIControlの簡単なサブクラスである

CoreTextなど、やり過ぎ、および実装する厳しいものになることができますおしゃれです。 NSAttributedStringUIControlアプローチは、文字列全体が「リンク」である場合にのみ適切です。

あなたのUIControlサブクラス内でこのような何かをするだろう:

  • UILabelへの変更など、ご希望backgroundColortextColortextAlignmentなど、とUILabelを設定し、initメソッド
  • UILabelサブビューを追加します。レイヤーをiOS AppのTwitterのツイートリンクのように表示したい場合はsetHighlighted:メソッドをオーバーライドして所有しているクラスは、状態
0

ボタンとあなたにハイパーリンクテキストを設定したいボタンの設定タイトルを取るを設定することができるよう

  • .hファイルに@propertyセッターを追加/トラッキングタッチに変化を感じdは。 iOS 7とiOS 8ではデフォルトとカスタムのボタンタイプのボタンを選択できますが、iOS 7ではボタンタイプのカスタムのみを使用する必要があります。テキストの色を変更してUIのテキストを強調表示したり、そのボタンのクリックに追加するアクションを追加したりすることができます。それは魅力、幸運のように動作します。

  • 0

    TTTAttributedLabelをご覧ください。リンク、電話などを構成するのは本当にシンプルです。

    関連する問題