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
(subclaseUILabel
) y coloque contenido de texto en él, como si fuera unUILabel
. 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 laUILabel
. - Cuando se
UILabel
laUILabel
, 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