UITextView, NSAttributedString y attributes personalizados

He buscado mucho en Stack Overflow pero no pude encontrar una solución. Tal vez malinterpreté algunas respuestas.

He creado una UITextView y estoy usando NSAttributedStrings para trabajar con UITextView, que está bien.

Ahora, después de agregar un atributo personalizado, estoy atrapado.

¿Dónde puedo conectarme para UITextView mi atributo personalizado dentro de UITextView ? ¿Existe un método de delegado, o tendré que crear mi propio UITextView y sobrescribir un método?

Puede personalizar NSLayoutManager e implementar su -drawGlyphsForGlyphRange:atPoint: method.

Por ejemplo, desea un background personalizado con un radio de esquina

textView init:

 NSTextStorage *textStorage = [NSTextStorage new]; CustomLayoutManager *layoutManager = [[CustomLayoutManager alloc] init]; CGSize containerSize = CGSizeMake(self.view.bounds.size.width, CGFLOAT_MAX); NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:containerSize]; textContainer.widthTracksTextView = YES; [layoutManager addTextContainer:textContainer]; [textStorage addLayoutManager:layoutManager]; 

Y aplique su atributo personalizado:

 NSMutableAttributedString *mAttrStr = [[NSMutableAttributedString alloc] initWithString:@"SampleText"]; [mAttrStr addAttribute:YourCustomAttrbuteName value:[UIColor networkingColor] range:NSMakeRange(0, mAttrStr.length)]; //for example, you want a custom background with a corner radius [self.textView.textStorage appendAttributedString:mAttrStr]; 

En CustomLayoutManager.m

 -(void)drawGlyphsForGlyphRange:(NSRange)glyphsToShow atPoint:(CGPoint)origin { NSRange range = [self characterRangeForGlyphRange:glyphsToShow actualGlyphRange:NULL]; //enumerate custom attribute in the range [self.textStorage enumerateAttribute:YourCustomAttributeName inRange:range options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequinetworking usingBlock:^(id _Nullable value, NSRange range, BOOL * _Nonnull stop) { if (value) { UIColor *color = value; //the color set above NSRange glyphRange = [self glyphRangeForCharacterRange:range actualCharacterRange:NULL]; NSTextContainer *container = [self textContainerForGlyphAtIndex:glyphRange.location effectiveRange:NULL]; //draw background CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); CGContextTranslateCTM(context, origin.x, origin.y); [color setFill]; CGRect rect = [self boundingRectForGlyphRange:glyphRange inTextContainer:container]; //UIBezierPath with rounded UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:100]; [path fill]; CGContextRestoreGState(context); //end draw [super drawGlyphsForGlyphRange:range atPoint:origin]; } else { [super drawGlyphsForGlyphRange:range atPoint:origin]; } }]; } 

Ahora el 'SampleText' tiene un background rojo y networkingondeado.

Consulte este fragment de código simple para establecer la cadena atribuida a una vista de text.

  let attributedString = NSMutableAttributedString(string:"Test string to add attributes") attributedString.addAttributes([NSForegroundColorAttributeName:UIColor.greenColor()], range: NSMakeRange(0, attributedString.string.characters.count)) textView.attributedText = attributedString 

Para Objective-C

 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:@"Test string to add attributes"]; [attributedString addAttributes:@{NSForegroundColorAttributeName:[UIColor greenColor]} range:NSMakeRange(0, attributedString.string.length)]; textView.attributedText = attributedString; 

Espero que esto ayude.

Si desea aplicar attributes particulares para textView particular en lugar de una secuencia, entonces debería subclass UITextView y hacer initmethod personalizado o algún método que devuelva el object UITextView con el atributo especificado. Puede pasar custom attributes como parámetro en el método también si los attributes son cambiantes y no significa que no se arreglen. y si el atributo seguirá siendo el mismo implícitamente, entonces establecerá attributes en esa class de manera pnetworkingeterminada.