[iphone] URL / 전화 클릭 가능한 UILabel을 만드는 방법은 무엇입니까?

Safari 웹 페이지로 연결되는 클릭 가능한 레이블을 앱에 만들고 싶습니다. 또한 사용자가 번호를 클릭하는 것만으로 전화를 걸 수 있기를 원합니까?

조언 해 주셔서 감사합니다



답변

a를 사용 UITextView하고 검사기에서 링크, 전화 번호 및 기타 항목 감지를 선택할 수 있습니다 .


답변

UITextView대신 사용 UILabel하고 텍스트를 하이퍼 링크로 변환하는 속성이 있습니다.

목표 -C :

yourTextView.editable = NO;
yourTextView.dataDetectorTypes = UIDataDetectorTypeAll;

빠른:

yourTextView.editable = false; 
yourTextView.dataDetectorTypes = UIDataDetectorTypes.All;

그러면 링크가 자동으로 감지됩니다.

자세한 내용 은 설명서 를 참조하십시오.


답변

https://github.com/mattt/TTTAttributedLabel

그것은 확실히 당신이 필요로하는 것입니다. 레이블에 밑줄과 같은 속성을 적용하고 다른 색상을 적용 할 수도 있습니다. 클릭 가능한 URL에 대한 지침을 확인하십시오.

주로 다음과 같은 작업을 수행합니다.

NSRange range = [label.text rangeOfString:@"me"];
[label addLinkToURL:[NSURL URLWithString:@"http://github.com/mattt/"] withRange:range]; // Embedding a custom link in a substring


답변

원하는대로 사용자 정의 UIButton 및 setText를 만들고이를 사용하여 메서드를 추가 할 수 있습니다.

UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
[sampleButton setFrame:CGRectMake(kLeftMargin, 10, self.view.bounds.size.width - kLeftMargin - kRightMargin, 52)];
[sampleButton setTitle:@"URL Text" forState:UIControlStateNormal];
[sampleButton setFont:[UIFont boldSystemFontOfSize:20]];


[sampleButton addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:sampleButton];


-(void)buttonPressed:(id)sender{
  // open url
}


답변

이것을 UITextView가 아닌 ​​UILabel로 처리하려면 다음과 같이 UILabel 하위 클래스를 만들 수 있습니다.

class LinkedLabel: UILabel {

fileprivate let layoutManager = NSLayoutManager()
fileprivate let textContainer = NSTextContainer(size: CGSize.zero)
fileprivate var textStorage: NSTextStorage?


override init(frame aRect:CGRect){
    super.init(frame: aRect)
    self.initialize()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.initialize()
}

func initialize(){

    let tap = UITapGestureRecognizer(target: self, action: #selector(LinkedLabel.handleTapOnLabel))
    self.isUserInteractionEnabled = true
    self.addGestureRecognizer(tap)
}

override var attributedText: NSAttributedString?{
    didSet{
        if let _attributedText = attributedText{
            self.textStorage = NSTextStorage(attributedString: _attributedText)

            self.layoutManager.addTextContainer(self.textContainer)
            self.textStorage?.addLayoutManager(self.layoutManager)

            self.textContainer.lineFragmentPadding = 0.0;
            self.textContainer.lineBreakMode = self.lineBreakMode;
            self.textContainer.maximumNumberOfLines = self.numberOfLines;
        }

    }
}

func handleTapOnLabel(tapGesture:UITapGestureRecognizer){

    let locationOfTouchInLabel = tapGesture.location(in: tapGesture.view)
    let labelSize = tapGesture.view?.bounds.size
    let textBoundingBox = self.layoutManager.usedRect(for: self.textContainer)
    let textContainerOffset = CGPoint(x: ((labelSize?.width)! - textBoundingBox.size.width) * 0.5 - textBoundingBox.origin.x, y: ((labelSize?.height)! - textBoundingBox.size.height) * 0.5 - textBoundingBox.origin.y)

    let locationOfTouchInTextContainer = CGPoint(x: locationOfTouchInLabel.x - textContainerOffset.x, y: locationOfTouchInLabel.y - textContainerOffset.y)
    let indexOfCharacter = self.layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: self.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)


    self.attributedText?.enumerateAttribute(NSLinkAttributeName, in: NSMakeRange(0, (self.attributedText?.length)!), options: NSAttributedString.EnumerationOptions(rawValue: UInt(0)), using:{
        (attrs: Any?, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) in

        if NSLocationInRange(indexOfCharacter, range){
            if let _attrs = attrs{

                UIApplication.shared.openURL(URL(string: _attrs as! String)!)
            }
        }
    })

}}

이 클래스는이 답변의 코드를 재사용하여 만들어졌습니다 . 속성 문자열을 만들려면이 답변을 확인하십시오 . 그리고 여기에서 전화 URL을 만드는 방법을 찾을 수 있습니다.


답변

이것을 사용하면 전체 레이블 텍스트가 아닌 특정 텍스트에 대한 파란색 링크가 생성되기 때문에 너무 좋아했습니다 .FRHyperLabel

이용 약관에 하이퍼 링크를 스마트하게 적용

할 것:

  1. 위의 링크 및 복사에서 다운로드 FRHyperLabel.h, FRHyperLabel.m프로젝트에.

  2. 이미지와 같이 사용자 정의 클래스 이름을 드래그 UILabel하여 Storyboard정의 하십시오 FRHyperLabel.

여기에 이미지 설명 입력

  1. 스토리 보드의 UILabel을 viewController.h 파일에 연결합니다.

@property (weak, nonatomic) IBOutlet FRHyperLabel *label;

  1. 이제 viewController.m 파일에 다음 코드를 추가하십시오.

`NSString * string = @ “업로드함으로써 이용 약관에 동의합니다”; NSDictionary * attributes = @ {NSFontAttributeName : [UIFont preferredFontForTextStyle : UIFontTextStyleHeadline]};

_label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];
[_label setFont:[_label.font fontWithSize:13.0]];

[_label setLinkForSubstring:@"Terms of Use" withLinkHandler:^(FRHyperLabel *label, NSString *substring){
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.google.com"]];
}];`
  1. 그리고 그것을 실행하십시오.

답변

UILabel 대신 UITextView를 사용하고 텍스트를 하이퍼 링크로 변환하는 속성이 있습니다.

신속한 코드 :

yourTextView.editable = false
yourTextView.dataDetectorTypes = UIDataDetectorTypes.All
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.PhoneNumber
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.Link