MTLLinkLabel is linkable UILabel. Written in Swift.
Requirements
- iOS 8.0+
- Xcode 7.3+
Installation
Carthage
You can install Carthage with Homebrew.
$ brew update
$ brew install carthage
specify it in your Cartfile
github "recruit-mtl/MTLLinkLabel"
And run carthage
$ carthage update --platform ios
CocoaPods
$ pod init
specify it in your Podfile
platform :ios, '8.0'
target 'MTLLinkLabelExample' do
use_frameworks!
pod 'MTLLinkLabel', '~> 0.1.6'
end
And run CocoaPods
$ pod install
Usage
You can use MTLLinkLabel in Storyboard or XIB.
#####Drag and drop UILabel in your view.
#####Change UILabels custom class to 'LinkLabel', and Change module to 'MTLLinkLabel'.
You must change labels userInteractionEnabled property to true. Because, this labels properties default value is false.
label.userInteractionEnabled = true
#####Assign String to LinkLabels 'text' property.
label.text = "Hello. https://github.com/recruit-mtl/MTLLinkLabel"
--
Add custom link
You can add custom link in LinkLabel with range and Action at the time of the link selection.
let range = (text as NSString).rangeOfString("1829")
cell.label.addLink(
NSURL(string: "https://www.google.co.jp/#q=1829")!,
range: range,
linkAttribute: [
NSForegroundColorAttributeName: UIColor.redColor(),
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue
]
) { (url) -> Void in
let alert = UIAlertController(title: nil, message: url.absoluteString, preferredStyle: UIAlertControllerStyle.ActionSheet)
alert.addAction(UIAlertAction(title: "Go", style: .Default, handler: { (action) -> Void in
UIApplication.sharedApplication().openURL(url)
}))
alert.addAction(UIAlertAction(title: "Cancel", style: .Default, handler: nil))
self.presentViewController(alert, animated: true, completion: nil)
}
--
Delegate
LinkLabelDelegate methods are optional method.
The default implementation is implemented in protocol extension.
public extension LinkLabelDelegate {
func linkLabelExecuteLink(linkLabel: LinkLabel, text: String, result: NSTextCheckingResult) -> Void {
if result.resultType.contains(.Link) {
let pattern = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]+"
if NSPredicate(format: "SELF MATCHES '\(pattern)'").evaluateWithObject(text) {
UIApplication.sharedApplication().openURL(NSURL(string: "mailto:" + text)!)
return
}
let httpText = !text.hasPrefix("http://") && !text.hasPrefix("https://") ? "http://" + text : text
guard let url = NSURL(string: httpText) else { return }
UIApplication.sharedApplication().openURL(url)
}
else if result.resultType.contains(.PhoneNumber) {
let telURLString = "tel:" + text
UIApplication.sharedApplication().openURL(NSURL(string: telURLString)!)
}
}
func linkAttributeForLinkLabel(linkLabel: LinkLabel, checkingType: NSTextCheckingType) -> [String: AnyObject] {
return [
NSForegroundColorAttributeName: linkLabel.tintColor,
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue
]
}
func linkDefaultAttributeForCustomeLink(linkLabel: LinkLabel) -> [String: AnyObject] {
return [
NSForegroundColorAttributeName: linkLabel.tintColor,
NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue
]
}
func linkLabelCheckingLinkType() -> NSTextCheckingTypes {
return NSTextCheckingType.Link.rawValue
| NSTextCheckingType.PhoneNumber.rawValue
}
}