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
할 것:
-
위의 링크 및 복사에서 다운로드
FRHyperLabel.h
,FRHyperLabel.m
프로젝트에. -
이미지와 같이 사용자 정의 클래스 이름을 드래그
UILabel
하여Storyboard
정의 하십시오FRHyperLabel
.
- 스토리 보드의 UILabel을 viewController.h 파일에 연결합니다.
@property (weak, nonatomic) IBOutlet FRHyperLabel *label;
- 이제 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"]];
}];`
- 그리고 그것을 실행하십시오.
답변
UILabel 대신 UITextView를 사용하고 텍스트를 하이퍼 링크로 변환하는 속성이 있습니다.
신속한 코드 :
yourTextView.editable = false
yourTextView.dataDetectorTypes = UIDataDetectorTypes.All
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.PhoneNumber
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.Link