uiappfonts ttf otf font custom ios cocoa-touch fonts uitextview

ios - ttf - El estilo UITextView se restablece después de configurar la propiedad del texto



uiappfonts (13)

Tengo UITextView *_masterText y después del método de llamada setText se restablece la fuente de la propiedad. Está sucediendo después de que cambie sdk 7. _masterText es IBOutlet , global y las propiedades se establecen en el guión gráfico. ¿Soy solo yo o esto es un error general de SDK?

@interface myViewController : UIViewController { IBOutlet UITextView *_masterText; } @implementation myViewController -(void)viewWillAppear:(BOOL)animated { [_masterText setText:@"New text"]; }


Aquí hay una solución de subclase rápida que suelo usar para este problema.

class WorkaroundTextView: UITextView { override var text: String! { get { return super.text } set { let originalSelectableValue = self.selectable self.selectable = true super.text = newValue self.selectable = originalSelectableValue } } }


En iOS 8.3, la solución de establecer "seleccionable" en SÍ antes de setText, y NO después, no me lo arregló.

Descubrí que necesitaba establecer "seleccionable" en SÍ en el guión gráfico, también, antes de que esto funcione.


Este problema resurgió en Xcode 8. Así es como lo solucioné:

Cambió la extensión a:

extension UITextView{ func setTextAvoidXcodeIssue(newText : String, selectable: Bool){ isSelectable = true text = newText isSelectable = selectable } }

y marcó la opción Seleccionable en el Interface Builder.

No es muy elegante tener ese parámetro ''seleccionable'' pero servirá.


Esto funcionó para mí:

let font = textView.font textView.attributedText = attributedString textView.font = font


Estoy teniendo este problema. Una solución fácil de usar de respuesta de @Ken Steele. Extiendo el UITextView y agrego una propiedad calculada.

extension UITextView { // For older Swift version output should be NSString! public var safeText:String! { set { let selectable = self.selectable; self.selectable = true; self.text = newValue; self.selectable = selectable; } get { return self.text; } } }

Espero eso ayude.


Han pasado 3 años y la falla aún existe en la última versión estable de Xcode (7.3). Claramente Apple no lo solucionará en el corto plazo, dejando a los desarrolladores con dos opciones: dejar seleccionables y establecer UserInteractionEnabled en false o Method swizzling.

Si tiene un botón en su textView, el primero no será suficiente.

Solución sin cambio de código en swift:

import UIKit extension UITextView { @nonobjc var text: String! { get { return performSelector(Selector("text")).takeUnretainedValue() as? String ?? "" } set { let originalSelectableValue = selectable selectable = true performSelector(Selector("setText:"), withObject: newValue) selectable = originalSelectableValue } } }

C objetivo:

#import <objc/runtime.h> #import <UIKit/UIKit.h> @implementation UITextView (SetTextFix) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; SEL originalSelector = @selector(setText:); SEL swizzledSelector = @selector(xxx_setText:); Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } }); } - (void)xxx_setText:(NSString *)text { BOOL originalSelectableValue = self.selectable; self.selectable = YES; [self xxx_setText:text]; self.selectable = originalSelectableValue; } @end


Me ayudó este problema y la respuesta anterior, pero agregué un contenedor a mi código ViewController de la siguiente manera y simplemente pasé la instancia uiview y el texto para cambiar y la función de envoltura activa o desactiva el valor seleccionable, cambia texto y luego lo apaga nuevamente. Útil cuando necesitas que uitextview esté desactivado en todo momento por defecto.

/* We set the text views Selectable value to YES temporarily, change text and turn it off again. This is a known bug that if the selectable value = NO the view loses its formatting. */ -(void)changeTextOfUiTextViewAndKeepFormatting:(UITextView*)viewToUpdate withText:(NSString*)textValue { if(![viewToUpdate isSelectable]){ [viewToUpdate setSelectable:YES]; [viewToUpdate setText:textValue]; [viewToUpdate setSelectable:NO]; }else{ [viewToUpdate setText:textValue]; [viewToUpdate setSelectable:NO]; } }


Me encontré con el mismo problema (en Xcode 6.1) y, aunque la respuesta de John Cogan funcionó para mí, descubrí que ampliar la clase UITextView con una categoría era una mejor solución para mi proyecto en particular.

interfaz

@interface UITextView (XcodeSetTextFormattingBugWorkaround) - (void)setSafeText:(NSString *)textValue; @end

implementación

@implementation UITextView (XcodeSetTextFormattingBugWorkaround) - (void)setSafeText:(NSString *)textValue { BOOL selectable = [self isSelectable]; [self setSelectable:YES]; [self setText:textValue]; [self setSelectable:selectable]; } @end


Para mí, con texto atribuido, solo necesitaba establecer la fuente en el diccionario de atributos en lugar de establecerla en su propio campo.


Sentado con esto durante horas, encontré el error. Si la propiedad "Seleccionable" = NO restablecerá la fuente y el color de la fuente cuando se use setText.

Entonces, active Activable y el error desaparezca.


Si desea que su vista de texto sea de "solo lectura" puede marcar Editable y seleccionable y desmarcar interacción de usuario habilitada, con esto el UITextView se comportaba como yo quería


Usando la solución de problemas discutida en este número, esta extensión a UITextView proporciona una función setTextInCurrentStyle() . Basado en la solución de Alessandro Ranaldi pero no requiere que el valor actual sea seleccionable para pasar a la función.

extension UITextView{ func setTextInCurrentStyle(_ newText: String) { let selectablePreviously = self.isSelectable isSelectable = true text = newText isSelectable = selectablePreviously } }


EDITAR:

Configurar la fuente para UITextView en iOS 7 me funciona si primero configura el texto y luego configura la fuente:

@property (nonatomic, weak) IBOutlet UITextView *masterText; @implementation myViewController -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; _myTextView.text = @"My Text"; _myTextView.font = [UIFont fontWithName:@"Helvetica.ttf" size:16]; // Set Font }

En un archivo XIB, si agrega texto en su UITextView y cambia la fuente o el color, funcionará.