type settitle change ios swift uibutton uilabel

ios - settitle - uibutton(type:)



¿Gira algunas partes de UILabel para actuar como un UIButton? (4)

La idea es usar una biblioteca como TTTAttributedLabel y usarla de esta manera:

Considere la siguiente cadena "Quiero que se pueda tocar aquí ", donde aquí se ejecutará un segmento al tocar.

  • Cree TTTAttributedLabel (subclase UILabel ) y coloque contenido de texto en él, como si fuera un UILabel . Establecer su delegado a sí mismo. Luego, agregue un enlace a una palabra de esta manera:

C objetivo

NSRange rangeWord = [attributedLabel.text rangeOfString:@"here"]; [attributedLabel addLinkToURL:[NSURL URLWithString:@"anActionOnClickHere"] withRange:rangeUser];

Rápido

NSRange rangeWord = attributedLabel.text.rangeOfString("here") attributedLabel.addLinkToURL(NSURL(string: "anActionOnClickHere"), withRange:rangeUser)

  • Al hacer clic en las palabras, llamará a este método en el que puede manejar el clic:

C objetivo

- (void)attributedLabel:(__unused TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url { NSString *urlToString = [url absoluteString]; if ([urlToString containsString:@"anActionOnClickHere"]) { //perform segue for example [self performSegueWithIdentifier:@"hereSegue" sender:self]; } }

Rápido

func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) { NSString *urlToString = url.absoluteString() if (urlToString.containsString("anActionOnClickHere")) { //perform segue for example self.performSegueWithIdentifier("hereSegue",sender:self) } }

Con el estilo de enlace predeterminado, obtendrá el color azul que está buscando.

Esta pregunta ya tiene una respuesta aquí:

Tengo una cadena UILabel atribuida, pude colorear algunas partes del texto

let text = "Why did /(event) give /(event2) a 5 stars review? Details here. " let linkTextWithColor = "Why did" let range = (text as NSString).rangeOfString(linkTextWithColor) let attributedString = NSMutableAttributedString(string:text) attributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.blackColor() , range: range) labelEvent.attributedText = attributedString

Ahora quiero hacer que algunas partes del texto sean intercambiables, como un UIButton , ¿cómo hacer esto?

Ejemplo 1

Ejemplo 2

Necesito tener texto azul para responder al tacto y para ejecutar una función específica, como un UIButton . La ayuda es muy apreciada, gracias.


Lo que desea hacer es usar una cadena con una vista de texto para crear un enlace que funcione como un botón.

let attributedString = NSMutableAttributedString(string: "Some string with link", attributes: [<attributes>])

Luego, establezca una parte de él como enlace y personalice su apariencia utilizando la propiedad linkAttributes de la Vista de texto. Debido a que este es un botón y no un enlace real, solo colocamos una URL ficticia para el enlace para poder manejarlo en nuestro delegado más adelante.

attributedString.setSubstringAsLink(substring: "link", linkURL: "CUSTOM://WHATEVER") let linkAttributes: [String : AnyObject] = [NSForegroundColorAttributeName : .redColor(), NSUnderlineColorAttributeName : .redColor(), NSUnderlineStyleAttributeName : NSUnderlineStyle.StyleSingle.rawValue] textView.linkTextAttributes = linkAttributes textView.attributedText = attributedString textView.selectable = true textView.editable = false textView.userInteractionEnabled = true

Finalmente, en la vista de texto del delegado, verificaremos el esquema y realizaremos alguna acción.

func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool { if URL.scheme == "CUSTOM" { // Do your button actions here } return true }

Extensión para setSubstringAsLink:

extension NSMutableAttributedString { // Set part of string as URL public func setSubstringAsLink(substring substring: String, linkURL: String) -> Bool { let range = self.mutableString.rangeOfString(substring) if range.location != NSNotFound { self.addAttribute(NSLinkAttributeName, value: linkURL, range: range) return true } return false } }


Supongamos que tiene una UILabel con el texto " abc 123" y desea que " abc " funcione como un UIButton .

  • Calcula y almacena el rectángulo que contiene "abc".
  • Agregue un UITapGestureRecognizer a la UILabel .
  • Cuando se UILabel la UILabel , compruebe si el grifo está dentro del rectángulo.

static func getRect(str: NSAttributedString, range: NSRange, maxWidth: CGFloat) -> CGRect { let textStorage = NSTextStorage(attributedString: str) let textContainer = NSTextContainer(size: CGSize(width: maxWidth, height: CGFloat.max)) let layoutManager = NSLayoutManager() layoutManager.addTextContainer(textContainer) textStorage.addLayoutManager(layoutManager) textContainer.lineFragmentPadding = 0 let pointer = UnsafeMutablePointer<NSRange>.alloc(1) layoutManager.characterRangeForGlyphRange(range, actualGlyphRange: pointer) return layoutManager.boundingRectForGlyphRange(pointer.move(), inTextContainer: textContainer) } let rect1 = getRect(label.attributedText!, range: NSMakeRange(0, 3), maxWidth: label.frame.width) label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(MyClass.tappedLabel(_:)))) func tappedLabel(sender: UITapGestureRecognizer) { if rect1.contains(sender.locationInView(sender.view)) { // ... } }


Te recomiendo que pruebes esta biblioteca

https://github.com/null09264/FRHyperLabel

Excelente biblioteca, fácil de usar y tiene algunos ejemplos integrados para que pruebes. Los ejemplos están tanto en Objective-c como en Swift

Ejemplo en Swift

let str = "This is a random bit of text" let attributes = [NSForegroundColorAttributeName: UIColor.blackColor(), NSFontAttributeName: UIFont.systemFontOfSize(15)] confirmLabel.attributedText = NSAttributedString(string: str, attributes: attributes) let handler = { (hyperLabel: FRHyperLabel!, substring: String!) -> Void in //action here } //Step 3: Add link substrings confirmLabel.setLinksForSubstrings(["random"], withLinkHandler: handler)

Editar:

Si desea deshacerse del subrayado, la mejor manera de hacerlo es seguir los consejos que DeyaEldeen dio en el comentario.

Si vas al archivo .m de FRHyperLabel, ve a este método

- (void)checkInitialization { if (!self.handlerDictionary) { self.handlerDictionary = [NSMutableDictionary new]; } if (!self.userInteractionEnabled) { self.userInteractionEnabled = YES; } if (!self.linkAttributeDefault) { self.linkAttributeDefault = @{NSForegroundColorAttributeName: FRHyperLabelLinkColorDefault, NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)}; } if (!self.linkAttributeHighlight) { self.linkAttributeHighlight = @{NSForegroundColorAttributeName: FRHyperLabelLinkColorHighlight, NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)}; } }

Y solo puedes quitar esto

NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)

de los atributos