에서 하이퍼 링크를 클릭 할 수있게 만드는 것은 쉽지 않습니다 UITextView
. IB의보기에서 “링크 감지”확인란을 설정하면 HTTP 링크가 감지되어 하이퍼 링크로 바뀝니다.
그러나 이것은 여전히 사용자가 보는 것이 “원시”링크라는 것을 의미합니다. RTF 파일과 HTML 모두 “뒤에”링크가있는 사용자가 읽을 수있는 문자열을 설정할 수 있습니다.
중요한 텍스트를 텍스트보기 (또는 a UILabel
또는) 로 쉽게 설치할 수 있습니다 UITextField
. 그러나 해당 텍스트에 링크가 포함되어 있으면 클릭 할 수 없습니다.
사용자가 읽을 수있는 텍스트 A의 클릭 할 수있는 방법이 있나요 UITextView
, UILabel
또는 UITextField
?
마크 업은 SO와 다르지만 일반적인 아이디어는 다음과 같습니다. 내가 원하는 것은 다음과 같은 텍스트입니다.
이 모프는 Face Dancer 로 생성되었습니다 . 클릭하면 앱 스토어에서 볼 수 있습니다.
내가 얻을 수있는 유일한 것은 이것입니다.
이 모프는 Face Dancer로 생성되었습니다 . 앱 스토어에서 보려면 http://example.com/facedancer 를 클릭하십시오 .
답변
NSMutableAttributedString을 사용하십시오 .
NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"Google"];
[str addAttribute: NSLinkAttributeName value: @"http://www.google.com" range: NSMakeRange(0, str.length)];
yourTextView.attributedText = str;
편집 :
이것은 질문에 대한 것이 아니라 명확하게하기위한 UITextField
것이며 UILabel
URL 열기를 지원하지 않습니다. UILabel
링크와 함께 사용 하려면 TTTAttributedLabel 을 확인할 수 있습니다 .
또한 당신은 설정해야합니다 dataDetectorTypes
당신의 가치 UITextView
에 UIDataDetectorTypeLink
또는 UIDataDetectorTypeAll
클릭하면 열려있는 URL로. 또는 의견에서 제안한대로 위임 방법을 사용할 수 있습니다.
답변
나는 이것이 실제로 유용하다는 것을 알았지 만 꽤 많은 곳에서 그것을해야했기 때문에 간단한 접근 방식으로 접근 방식을 마무리했습니다 NSMutableAttributedString
.
스위프트 3
extension NSMutableAttributedString {
public func setAsLink(textToFind:String, linkURL:String) -> Bool {
let foundRange = self.mutableString.range(of: textToFind)
if foundRange.location != NSNotFound {
self.addAttribute(.link, value: linkURL, range: foundRange)
return true
}
return false
}
}
스위프트 2
import Foundation
extension NSMutableAttributedString {
public func setAsLink(textToFind:String, linkURL:String) -> Bool {
let foundRange = self.mutableString.rangeOfString(textToFind)
if foundRange.location != NSNotFound {
self.addAttribute(NSLinkAttributeName, value: linkURL, range: foundRange)
return true
}
return false
}
}
사용법 예 :
let attributedString = NSMutableAttributedString(string:"I love stackoverflow!")
let linkWasSet = attributedString.setAsLink("stackoverflow", linkURL: "http://stackoverflow.com")
if linkWasSet {
// adjust more attributedString properties
}
목표 -C
순수한 Objective-C 프로젝트에서 동일한 작업을 수행하기위한 요구 사항에 부딪 쳤으므로 Objective-C 범주가 있습니다.
@interface NSMutableAttributedString (SetAsLinkSupport)
- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL;
@end
@implementation NSMutableAttributedString (SetAsLinkSupport)
- (BOOL)setAsLink:(NSString*)textToFind linkURL:(NSString*)linkURL {
NSRange foundRange = [self.mutableString rangeOfString:textToFind];
if (foundRange.location != NSNotFound) {
[self addAttribute:NSLinkAttributeName value:linkURL range:foundRange];
return YES;
}
return NO;
}
@end
사용법 예 :
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:"I love stackoverflow!"];
BOOL linkWasSet = [attributedString setAsLink:@"stackoverflow" linkURL:@"http://stackoverflow.com"];
if (linkWasSet) {
// adjust more attributedString properties
}
답변
방금 그러한 사용 사례를 다루기 위해 UILabel의 하위 클래스를 만들었습니다. 여러 개의 링크를 쉽게 추가하고 다른 처리기를 정의 할 수 있습니다. 터치 피드백을 위해 아래로 터치 할 때 누른 링크를 강조 표시하는 기능도 지원합니다. https://github.com/null09264/FRHyperLabel 을 참조하십시오 .
귀하의 경우 코드는 다음과 같습니다.
FRHyperLabel *label = [FRHyperLabel new];
NSString *string = @"This morph was generated with Face Dancer, Click to view in the app store.";
NSDictionary *attributes = @{NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]};
label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];
[label setLinkForSubstring:@"Face Dancer" withLinkHandler:^(FRHyperLabel *label, NSString *substring){
[[UIApplication sharedApplication] openURL:aURL];
}];
샘플 스크린 샷 (이 경우 처리기는 URL을 여는 대신 경고를 표시하도록 설정되어 있음)
답변
ujell 솔루션의 사소한 개선 : NSString 대신 NSURL을 사용하는 경우 모든 URL (예 : 사용자 정의 URL)을 사용할 수 있습니다.
NSURL *URL = [NSURL URLWithString: @"whatsapp://app"];
NSMutableAttributedString * str = [[NSMutableAttributedString alloc] initWithString:@"start Whatsapp"];
[str addAttribute: NSLinkAttributeName value:URL range: NSMakeRange(0, str.length)];
yourTextField.attributedText = str;
즐기세요!
답변
스위프트 4 :
var string = "Google"
var attributedString = NSMutableAttributedString(string: string, attributes:[NSAttributedStringKey.link: URL(string: "http://www.google.com")!])
yourTextView.attributedText = attributedString
스위프트 3.1 :
var string = "Google"
var attributedString = NSMutableAttributedString(string: string, attributes:[NSLinkAttributeName: URL(string: "http://www.google.com")!])
yourTextView.attributedText = attributedString
답변
나도 비슷한 요구 사항을 가지고 있었고 처음에는 UILabel을 사용했으며 UITextView가 더 낫다는 것을 깨달았습니다. 상호 작용 및 스크롤을 비활성화하여 UITextView를 UILabel처럼 작동하게 만들고 NSMutableAttributedString
Karl이 수행 한 것과 동일한 텍스트로 링크를 설정 하는 범주 메서드를 만들었 습니다 (+1). 이것은 내 obj c 버전입니다.
-(void)setTextAsLink:(NSString*) textToFind withLinkURL:(NSString*) url
{
NSRange range = [self.mutableString rangeOfString:textToFind options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
[self addAttribute:NSLinkAttributeName value:url range:range];
[self addAttribute:NSForegroundColorAttributeName value:[UIColor URLColor] range:range];
}
}
아래 대리인을 사용하여 작업을 처리 할 수 있습니다
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)url inRange:(NSRange)characterRange
{
// do the task
return YES;
}
답변
UITextView를 사용하면 클릭 가능한 링크를 지원합니다. 다음 코드를 사용하여 속성 문자열 만들기
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:strSomeTextWithLinks];
그런 다음 UITextView 텍스트를 다음과 같이 설정하십시오.
NSDictionary *linkAttributes = @{NSForegroundColorAttributeName: [UIColor redColor],
NSUnderlineColorAttributeName: [UIColor blueColor],
NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};
customTextView.linkTextAttributes = linkAttributes; // customizes the appearance of links
textView.attributedText = attributedString;
XIB에서 UITextView의 “선택 가능”동작을 사용 가능하게하십시오.