tipos sirve que para paginas pagina otra hipervinculos hipervinculo hacer ejemplos crear con como swift interface-builder ios9 xcode8

swift - sirve - que es un hipervinculo



UITextView con texto de hipervínculo (7)

Con un UITextView no editable, me gustaría insertar texto como este en iOS9 +:

Simplemente haga clic aquí para registrarse

Puedo crear una función y manipular el texto, pero ¿hay alguna manera más simple?

Veo que puedo usar NSTextCheckingTypeLink, por lo que hacer que se pueda hacer clic en el texto sin la parte ''hacer clic aquí'' es sencillo en Interface Builder:

Solo http://example.com para registrarse

Estoy usando Xcode 8 y Swift 3 si eso es relevante.


Establezca isEditable = false o la vista de texto entrará en modo de edición de texto cuando el usuario la toque.

Swift 4 y posterior

let attributedString = NSMutableAttributedString(string: "Just click here to register") let url = URL(string: "https://www.apple.com")! // Set the ''click here'' substring to be the link attributedString.setAttributes([.link: url], range: NSMakeRange(5, 10)) self.textView.attributedText = attributedString self.textView.isUserInteractionEnabled = true self.textView.isEditable = false // Set how links should appear: blue and underlined self.textView.linkTextAttributes = [ .foregroundColor: UIColor.blue, .underlineStyle: NSUnderlineStyle.single.rawValue ]


La misma solución para Swift 4 usando extensiones:

extension UITextView { func hyperLink(originalText: String, hyperLink: String, urlString: String) { let style = NSMutableParagraphStyle() style.alignment = .left let attributedOriginalText = NSMutableAttributedString(string: originalText) let linkRange = attributedOriginalText.mutableString.range(of: hyperLink) let fullRange = NSMakeRange(0, attributedOriginalText.length) attributedOriginalText.addAttribute(NSAttributedStringKey.link, value: urlString, range: linkRange) attributedOriginalText.addAttribute(NSAttributedStringKey.paragraphStyle, value: style, range: fullRange) attributedOriginalText.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.blue, range: fullRange) attributedOriginalText.addAttribute(NSAttributedStringKey.font, value: UIFont.systemFont(ofSize: 10), range: fullRange) self.linkTextAttributes = [ kCTForegroundColorAttributeName: UIColor.blue, kCTUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue, ] as [String : Any] self.attributedText = attributedOriginalText } }


La misma solución para Swift 3 usando extensiones:

A. Agregar extensión -

extension UITextView { func hyperLink(originalText: String, hyperLink: String, urlString: String) { let style = NSMutableParagraphStyle() style.alignment = .center let attributedOriginalText = NSMutableAttributedString(string: originalText) let linkRange = attributedOriginalText.mutableString.range(of: hyperLink) let fullRange = NSMakeRange(0, attributedOriginalText.length) attributedOriginalText.addAttribute(NSLinkAttributeName, value: urlString, range: linkRange) attributedOriginalText.addAttribute(NSParagraphStyleAttributeName, value: style, range: fullRange) attributedOriginalText.addAttribute(NSFontAttributeName, value: UIFont.systemFont(ofSize: 10), range: fullRange) self.linkTextAttributes = [ NSForegroundColorAttributeName: UIConfig.primaryColour, NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue, ] self.attributedText = attributedOriginalText } }

B. Agregar URL de enlace - let linkUrl = "https://www.my_website.com"

C. Implemente UITextViewDelegate en su ViewController así:

class MyViewController: UIViewController, UITextViewDelegate { }

D. Agregar método delegado para manejar eventos de tap -

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { if (URL.absoluteString == linkUrl) { UIApplication.shared.openURL(URL) } return false } }

E. Y finalmente, cosas para asegurarse de su UITextView en el inspector de atributos:

  1. Comportamiento: Editable está desactivado y Seleccionable está activado.
  2. Detectores de datos: el enlace está activado.

Uso -

textView.hyperLink(originalText: "To find out more please visit our website", hyperLink: "website", urlString: linkUrl)

Saludos y feliz codificación!


Puede usar este método simple para agregar un hipervínculo a cualquier conjunto de caracteres que comience con la etiqueta

func addLink(forString string : NSMutableAttributedString ,baseURL : String ,tag : String){ let array = string.string.replacingOccurrences(of: "/n", with: " ").components(separatedBy: " ") let filterArray = array.filter { (string) -> Bool in return string.contains(tag) } for element in filterArray { let removedHashtag = element.replacingOccurrences(of: tag, with: "") let url = baseURL + removedHashtag let range = NSString.init(string: (string.string)).range(of: element) string.addAttributes([NSAttributedStringKey.link : url.replacingOccurrences(of: " ", with: "")], range: range) } }


Quería hacer lo mismo y terminé usando un UIButton con el título "haga clic aquí" rodeado de UILabels "solo" y "para registrarse", y luego:

@IBAction func btnJustClickHereLink(_ sender: UIButton) { if let url = URL(string: "http://example.com") { UIApplication.shared.openURL(url) } }


Código Swift 4. Puede ser que soy el único que necesita establecer varios enlaces y colorear las palabras en un mensaje. Creé una clase AttribTextHolder para acumular toda la información sobre el texto dentro de este soporte y pasarla fácilmente entre objetos para configurar el texto en UITextView en algún lugar dentro de un controlador.

class AttribTextHolder { enum AttrType { case link case color } let originalText: String var attributes: [(text: String, type: AttrType, value: Any)] init(text: String, attrs: [(text: String, type: AttrType, value: Any)] = []) { originalText = text attributes = attrs } func addAttr(_ attr: (text: String, type: AttrType, value: Any)) -> AttribTextHolder { attributes.append(attr) return self } func setTo(textView: UITextView) { let style = NSMutableParagraphStyle() style.alignment = .left let attributedOriginalText = NSMutableAttributedString(string: originalText) for item in attributes { let arange = attributedOriginalText.mutableString.range(of: item.text) switch item.type { case .link: attributedOriginalText.addAttribute(NSAttributedString.Key.link, value: item.value, range: arange) case .color: var color = UIColor.black if let c = item.value as? UIColor { color = c } else if let s = item.value as? String { color = s.color() } attributedOriginalText.addAttribute(NSAttributedString.Key.foregroundColor, value: color, range: arange) default: break } } let fullRange = NSMakeRange(0, attributedOriginalText.length) attributedOriginalText.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: fullRange) textView.linkTextAttributes = [ kCTForegroundColorAttributeName: UIColor.blue, kCTUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue, ] as [String : Any] textView.attributedText = attributedOriginalText } }

Úselo así:

let txt = AttribTextHolder(text: "To find out more visit our website or email us your questions") .addAttr((text: "our website", type: .link, "http://example.com")) .addAttr((text: "our website", type: .color, "#33BB22")) .addAttr((text: "email us", type: .link, "mailto:[email protected]")) .addAttr((text: "email us", type: .color, UIColor.red)) .... .... txt.setTo(textView: myUITextView)

También en este código uso una extensión de cadena simple para convertir los valores hexadecimales de cadena en objetos UIColor

extension String { /// Converts string color (ex: #23FF33) into UIColor func color() -> UIColor { let hex = self.trimmingCharacters(in: CharacterSet.alphanumerics.inverted) var int = UInt32() Scanner(string: hex).scanHexInt32(&int) let a, r, g, b: UInt32 switch hex.characters.count { case 3: // RGB (12-bit) (a, r, g, b) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17) case 6: // RGB (24-bit) (a, r, g, b) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF) case 8: // ARGB (32-bit) (a, r, g, b) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF) default: (a, r, g, b) = (255, 0, 0, 0) } return UIColor(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: CGFloat(a) / 255) } }


Swift 5 Esto se basa en la respuesta de Tejas ya que algunos elementos en ambas clases quedaron en desuso.

extension UITextView { func hyperLink(originalText: String, hyperLink: String, urlString: String) { let style = NSMutableParagraphStyle() style.alignment = .left let attributedOriginalText = NSMutableAttributedString(string: originalText) let linkRange = attributedOriginalText.mutableString.range(of: hyperLink) let fullRange = NSMakeRange(0, attributedOriginalText.length) attributedOriginalText.addAttribute(NSAttributedString.Key.link, value: urlString, range: linkRange) attributedOriginalText.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: fullRange) attributedOriginalText.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.blue, range: fullRange) attributedOriginalText.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 10), range: fullRange) self.linkTextAttributes = [ kCTForegroundColorAttributeName: UIColor.blue, kCTUnderlineStyleAttributeName: NSUnderlineStyle.single.rawValue, ] as [NSAttributedString.Key : Any] self.attributedText = attributedOriginalText }

No olvide agregar UITextViewDelegate a su controlador de vista y configure let linkUrl = " https://example.com "

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool { if (URL.absoluteString == linkUrl) { UIApplication.shared.open(URL) { (Bool) in } } return false }

El uso permanece igual:

textView.hyperLink(originalText: "To find out more please visit our website", hyperLink: "website", urlString: linkUrl)