私は「自分自身を登録」をテキストとして使用しました。私はリンクとしてそれを作りたい。そのリンクをクリックすると、Register.xib
が開きます。ラベルテキストをリンクとして作成する
どうすればこのリンクを取得できますか?
私は「自分自身を登録」をテキストとして使用しました。私はリンクとしてそれを作りたい。そのリンクをクリックすると、Register.xib
が開きます。ラベルテキストをリンクとして作成する
どうすればこのリンクを取得できますか?
カレンが正しいです。 UIButtonオブジェクトを作成し、その型を「カスタム」に設定してから、タイトルを付けることができます。アクションを、レジスタビューコントローラをプッシュまたは表示するメソッドに接続すると、すべて設定されます。
おそらく、テキストがクリック可能なリンクであることをユーザーに示したいと思うでしょう。テキストの色を青に設定します。別の完全に別のオプションは、NSAttributedString
(下線属性を持つ)を使用して、テキストがクリック可能であることをユーザーに示すことです。それにはan Open Source replacement for UITextViewが必要です(詳しくはthis related questionから学ぶことができます)。
Hey all、Kareem、Michael、ありがとうございました....しかし、私は、テキストがクリック可能であること、つまりテキストの色が青であることをユーザーに示すための方法を見つけることができないという別のクエリを持っています。別のものは、ユーザーがその文字列にカーソルを移動すると "手"のシンボルを持つことができます.. ??? – Krunal
私はあなたがiphoneアプリケーションを求めていると思うし、iphoneアプリケーションは画面上にカーソルを表示しないでください、右? – DivineDesert
おっと...ええ、私はそれを持っています... – Krunal
まず、属性付き文字列を作成し、対話テキストの範囲とテキスト自体を保存します。
次に、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ドキュメントライブラリを確認できました。
"InteractiveString"とは何ですか? –
私が言及する価値が妥協点があります
- (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 ;
}
}
}
...あなたが欲しいものを得るでしょうによって下だと思います。 UIButtonTypeCustom
にUIButton
を使用すると、テキストスタイルのコントロールが制限されているという欠点があります(たとえば、右揃えまたは左揃えにすることはできず、常に中央に配置されます)。あなたはNSAttributedString
に不慣れならNSAttributedString
を使用して
は、私が使用したソリューションはUIButton
と少ないのサブクラス化よりもカスタマイズできますUIControl
の簡単なサブクラスである
NSAttributedString
他
UIControl
アプローチは、文字列全体が「リンク」である場合にのみ適切です。
あなたのUIControl
サブクラス内でこのような何かをするだろう:
UILabel
への変更など、ご希望backgroundColor
、textColor
、textAlignment
など、とUILabel
を設定し、initメソッドUILabel
サブビューを追加します。レイヤーをiOS AppのTwitterのツイートリンクのように表示したい場合はsetHighlighted:
メソッドをオーバーライドして所有しているクラスは、状態ボタンとあなたにハイパーリンクテキストを設定したいボタンの設定タイトルを取るを設定することができるよう
.h
ファイルに@property
セッターを追加/トラッキングタッチに変化を感じdは。 iOS 7とiOS 8ではデフォルトとカスタムのボタンタイプのボタンを選択できますが、iOS 7ではボタンタイプのカスタムのみを使用する必要があります。テキストの色を変更してUIのテキストを強調表示したり、そのボタンのクリックに追加するアクションを追加したりすることができます。それは魅力、幸運のように動作します。TTTAttributedLabelをご覧ください。リンク、電話などを構成するのは本当にシンプルです。
あなたの意味を理解することはできません。テキストのハイパーリンクを作成する方法を意味しますか?クリックすると、登録ビューに移動しますか? – Raptor
lablelの代わりにカスタムタイプのUIbuttonを使用する方が良いです。 –
このような感じです。 http://stackoverflow.com/questions/4743457/how-to-customize-uilabel-clickable – Ilanchezhian