programing

URL/전화로 클릭할 수 있는 UI 레이블을 만드는 방법은 무엇입니까?

bestprogram 2023. 6. 1. 23:04

URL/전화로 클릭할 수 있는 UI 레이블을 만드는 방법은 무엇입니까?

앱에 클릭 가능한 레이블을 만들어 Safari 웹 페이지로 이동하고 싶습니다.또한 사용자가 해당 번호를 클릭하는 것만으로 전화를 걸 수 있기를 바랍니다.

조언해 주셔서 감사합니다.

를 사용할 수 있습니다.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을 만들고 원하는 대로 Text를 설정하여 메서드를 추가할 수 있습니다.

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. 스토리보드의 UI 레이블을 viewController.h 파일에 연결합니다.

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

  1. 이제 Controller.m 파일에서 다음 코드를 추가합니다.

'NSString *string = @"업로드 시 사용 약관에 동의합니다."; NSDictionary *속성 = @{NSFontAttributeName: [UIFont가 선호하는 글꼴ForTextStyle:UIFontTextStyle 헤드라인]};

_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
extension UITapGestureRecognizer {

    func didTapAttributedTextInLabel(label: UILabel, inRange targetRange: NSRange) -> Bool {

        let layoutManager = NSLayoutManager()
        let textContainer = NSTextContainer(size: CGSize.zero)
        let textStorage = NSTextStorage(attributedString: label.attributedText!)

        // Configure layoutManager and textStorage
        layoutManager.addTextContainer(textContainer)
        textStorage.addLayoutManager(layoutManager)

        // Configure textContainer
        textContainer.lineFragmentPadding = 0.0
        textContainer.lineBreakMode = label.lineBreakMode
        textContainer.maximumNumberOfLines = label.numberOfLines
        textContainer.size = label.bounds.size

        // main code
        let locationOfTouchInLabel = self.location(in: label)

        let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInLabel, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
        let indexOfCharacterRange = NSRange(location: indexOfCharacter, length: 1)
        let indexOfCharacterRect = layoutManager.boundingRect(forGlyphRange: indexOfCharacterRange, in: textContainer)
        let deltaOffsetCharacter = indexOfCharacterRect.origin.x + indexOfCharacterRect.size.width

        if locationOfTouchInLabel.x > deltaOffsetCharacter {
            return false
        } else {
            return NSLocationInRange(indexOfCharacter, targetRange)
        }
    }
}

NSMutableAttributedString을 사용하는 것이 어떻습니까?

let attributedString = NSMutableAttributedString(string: "Want to learn iOS? Just visit developer.apple.com!")
        attributedString.addAttribute(.link, value: "https://developer.apple.com", range: NSRange(location: 30, length: 50))

        myView.attributedText = attributedString

자세한 내용은 여기에서 확인할 수 있습니다.

UIButton을 사용한 Swift 4.0 가능한 솔루션

     phoneButton = UIButton(frame: CGRect(x: view.frame.width * 0, y: view.frame.height * 0.1, width: view.frame.width * 1, height: view.frame.height * 0.05))
     phoneButton.setTitle("333-333-3333", for: .normal )
     phoneButton.setTitleColor(UIColor(red: 0 / 255, green: 0 / 255, blue: 238 / 255, alpha: 1.0), for: .normal)
     phoneButton.addTarget(self, action: #selector(self.callPhone), for: .touchUpInside )

     @objc func callPhone(){

         UIApplication.shared.open(URL(string:"tel://3333333333")!, options: [:] , completionHandler: nil)


    }

언급URL : https://stackoverflow.com/questions/10681965/how-to-make-url-phone-clickable-uilabel