2017-01-10 1 views
0

나는 다음과 같은 방법을 포함 UILabel의의 확장 생성 :스위프트 3에서 UILabel에서 해시 태그를 클릭 할 수있게하려면 어떻게해야합니까? 내 응용 프로그램에서

func formatTextInLabel() { 
    let text = self.text 
    let font = UIFont(name: fontName, size: 16.0) 
    let titleDict: NSDictionary = [NSFontAttributeName: font!] 
    // This will give me an attributedString with the desired font 
    let attributedString = NSMutableAttributedString(string: text!, attributes: titleDict as! [String : AnyObject]) 
    let regex = try? NSRegularExpression(pattern: "#(\\w+)", options: []) 
    let matches = regex!.matches(in: text!, options: [], range: NSMakeRange(0, text!.characters.count)) 
    for match in matches { 
     let matchRange = match.rangeAt(0) 

     let titleDict: NSDictionary = [NSForegroundColorAttributeName: orangeColor] 

     attributedString.addAttributes(titleDict as! [String : AnyObject], range: matchRange) 
    } 
    self.attributedText = attributedString 
} 

을하고 내 선택한 색상의 모든 #hashtags을 강조한다. 하지만 그들은 클릭 할 수 없습니다, 나는 그것을 달성하기 불가능하다는 것을 말하는 그래서 어떤 게시물을 발견 : How to detect and make hyperlinks/mentions/hashtags clickable in UILabel?하지만 그것은 (잘하면) 구식 것 같습니다. 내가 어떻게하면 좋을지 알려줄 수 있니? 선택한 해시 태그의 이름을 콘솔에 표시 하시겠습니까?

추가 할 것은 한 가지 더 - pod 같은 문자가 ActiveLabel 또는 그와 비슷한 것으로 알고 있지만 시도해 보았고 제 경우의 제약 조건에 문제가있어서 제 코드에서이 효과를 얻고 싶습니다. UITapGestureRecognizer 라벨에 추가

+0

해시 태그 –

답변

1

시도 :이 들어

let tap = UITapGestureRecognizer(target: self, action: #selector(handleLabelTap(_:))) 
label.addGestureRecognizer(tap) 

func handleLabelTap(_ sender: UITapGestureRecognizer) { 

    // Do something here for when the user taps on the label 

} 

당신은 아마 레이블에 trueisUserInteractionEnabled을 설정해야 작동합니다. 방금 Xcode에서 테스트를했고 효과가있었습니다. 그래서 :

label.isUserInteractionEnabled = true 

편집 :

당신이 빈 UILabel 배열 속성을 만들 초기화되기 전에, 당신의 클래스 선언의 상단에, 도청 된 해시 태그를 결정하려는 경우와 빈 UITapGestureRecognizer 배열 이 같은 :

var labels:[UILabel] = [UILabel]() 
var labelTaps:[UITapGestureRecognizer] = [UITapGestureRecognizer]() 

그런 다음 각 레이블은 각각의 배열에 라벨과 탭 제스처를 추가 생성 할 때

let label = UILabel() 
// Set all label properties as you wish 

// Make sure to add 
label.isUserInteractionEnabled = true 

// Create the tap gesture 
let tap = UITapGestureRecognizer(target: self, action: #selector(handleLabelTap(_:))) 
label.addGestureRecognizer(tap) 

labels.append(label) 
labelTaps.append(tap) 

그런 다음 사용자가 해시 태그 중 하나를 탭하면 해당 탭 제스처가 메소드에 전송 된 색인을 가져온 다음이를 사용하여 어떤 라벨을 사용했는지 파악할 수 있습니다 각각의 제스처 인식기가 'labelTaps'배열에 가지고있는 'labels'배열의 색인 여기에 당신이 그렇게하는 방법입니다 UITextField 또는 UITextView A의

func handleLabelTap(_ sender: UITapGestureRecognizer) { 

    if let index = labelTaps.index(of: sender) { 

     let tappedLabel:UILabel = labels[index] 

     // Now you can do whatever you want 
     print("User tapped label with hash-tag: \(tappedLabel.text)") 

    } 

} 
+0

흠에 대해서는 [this] (https://github.com/optonaut/ActiveLabel.swift)를 참조하십시오.하지만 해시 태그가 탭되었는지 구별 할 수 있습니까? 제 경우에는 하나의'UILabel'에 하나 이상의 해시 태그가있을 수 있습니다 – user3766930

+0

'UILabel'과'UITapGestureRecognizer'의 배열을 빈 배열로 만들고 각 레이블을 만들 때 레이블과 제스처 인식기를 추가하십시오 . 나는이 같은 것을 반영하기 위해 나의 대답을 편집 할 것이다. – Pierce

+0

@ user3766930 - 업데이트 된 답변보기 – Pierce

0

당신은 UILabel에서 링크를 클릭 할 수 없습니다,하지만 당신은 할 수 있습니다. 클릭 가능한 링크를 추가 할 수 있습니다.

링크가 링크로 표시되는 경우 http://[email protected]과 같이 링크 감지를 켜기 만하면됩니다. 링크에 "여기를 클릭하십시오"와 같은 임의의 문자열을 표시하고 해당 문자열을 클릭 가능하게 만들려면 텍스트 필드/텍스트보기에 속성 문자열을 설치해야합니다.

이러한 링크 유형은 무엇이며 텍스트에서 어떻게 보이길 원하나요?

+0

해봤지만 해시 태그 링크가 아랍어로되어있을 때 앱이 다운되는 문제가 있습니다. –

+0

허. 코드에서 링크를 만드는 경우 작동합니다.또 다른 옵션은 링크가 포함 된 RTF 파일을 만들어 텍스트 입력란에로드하는 것입니다. –

+0

이것은 최근에 물어 본 질문이며이 문제와 관련하여 답변이 없습니다. 네가 도울 수 있으면 기뻐할거야. 감사. https://stackoverflow.com/questions/48012614/does-nsattributedstringkey-link-accept-arabic-characters-as-value –