interface-builder - una - no se pudo incrustar la fuente en el documento pdf debido a restricciones de licencia
El uso de una fuente personalizada en un UITextField hace que se modifique ligeramente cuando se accede, ¿existe alguna solución? (10)
Tengo una fuente personalizada en un UITextField, y he notado que cuando se accede (cuando aparece el teclado), el texto se reduce en una cantidad muy pequeña, tal vez un píxel o dos o tres. (No tengo forma de medirlo, por supuesto, pero es suficiente para que lo note). Y luego, cuando se despide el teclado, vuelve a subir.
He intentado despejar el campo de edición (que oculta el problema del cambio inicial hacia abajo), pero no ha resuelto el problema. También he revisado los diversos atributos en IB, y he intentado cambiar algunos, pero el problema persiste. Obtengo los mismos resultados en el simulador y en mi iPad2.
(El campo está bien alejado del teclado, por lo que no es la vista completa que se está apartando del camino, es solo el contenido de ese campo de texto específico).
Estoy seguro de que es la fuente personalizada la que está causando el problema, no ocurre sin él.
¿Alguna idea de cómo abordar esto? Pensé que podría necesitar crear el campo de texto programáticamente, en lugar de en el IB, y sé que probablemente debería intentarlo antes de hacer la pregunta aquí, pero detesto ir a todos esos problemas si no lo hago. resolver el problema.
Cualquier consejo apreciado!
Debe establecer la propiedad de fuente antes que la propiedad de texto.
Establezca el estilo de borde de los campos de texto en cualquier valor excepto "ninguno" en IB, luego, en el conjunto viewDidLoad de su ViewController:
yourTextField.borderStyle = .none
(Basado en esta respuesta por Box Jeon)
Este es el comportamiento esperado en un UITextField estándar. Sin embargo, puede resolver esto subclasificando UITextField y ajustando los límites del texto en sí.
Swift 3
override func textRect(forBounds bounds: CGRect) -> CGRect {
return(bounds.insetBy(dx: 0, dy: 0))
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return(bounds.insetBy(dx: 0, dy: -0.5))
}
override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
return(bounds.insetBy(dx: 0, dy: 0))
}
¡Esto debería funcionar!
Funciona para todos los tamaños de fuente y no provoca desalineación con clearButton
.
Subclase UITextField
y anula estos de la siguiente manera:
- (CGRect)placeholderRectForBounds:(CGRect)bounds
{
return CGRectOffset( bounds, 0, 4 );
}
- (CGRect)editingRectForBounds:(CGRect)bounds
{
return CGRectOffset( bounds, 0, 2);
}
- (CGRect)textRectForBounds:(CGRect)bounds
{
return CGRectOffset( bounds , 0 , 4 );
}
Lamentablemente ninguna de las respuestas funcionó para mí.
La respuesta de @blackjacx funcionó pero solo a veces :(
Comencé la depuración y aquí es lo que he descubierto:
1 - El problema real parece ser con una subvista privada de UITextField de tipo UIFieldEditorContentView
A continuación, puede ver que la subvista y
de la misma no es la misma que la del UITextField
:
Después de darme cuenta, salí con la siguiente solución:
override func layoutSubviews() {
super.layoutSubviews()
fixMisplacedEditorContentView()
}
func fixMisplacedEditorContentView() {
if #available(iOS 10, *) {
for view in subviews {
if view.bounds.origin.y < 0 {
view.bounds.origin = CGPoint(x: view.bounds.origin.x, y: 0)
}
}
}
}
Necesitará subclasificar UITextField
e invalidar layoutSubviews
para agregar la capacidad de establecer manualmente en 0
la y
de cualquier subvista que esté configurada en un valor negativo. Como este problema no se produce con iOS 9, a continuación, agregué una verificación para hacer la solución solo cuando está en iOS 10.
El resultado se puede ver a continuación:
2: esta solución no funciona si el usuario elige seleccionar un subrango del texto (seleccionarTodo funciona bien)
Como la selección del texto no es una necesidad para mi aplicación, prefiero desactivarla. Para hacer eso puedes usar el siguiente código (Swift 3):
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if #available(iOS 10, *) {
if action == #selector(UIResponderStandardEditActions.select(_:)) {
return false
}
}
return super.canPerformAction(action, withSender: sender)
}
Mi solución es similar a la de un McDJ, pero con un giro ligeramente diferente. Subclase UITextField y anula solo estos:
- (CGRect)placeholderRectForBounds:(CGRect)bounds {
return CGRectOffset( [self editingRectForBounds:bounds], 0, 2 );
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
return CGRectOffset( [super editingRectForBounds:bounds], 0, -2 );
}
Con la fuente personalizada que estoy usando, 2 puntos es el ajuste vertical correcto, lo que ayuda al marcador de posición, al texto "estático" y al "editar" a permanecer en la misma línea vertical.
Por una extraña razón, realmente no entendí que resolví esto configurando automáticamente AjustaScrollViewInsets a NO (o equivalente en Interface Builder). Esto con iOS 8.1.
Tuve este problema con una fuente personalizada y la resolví cambiando la etiqueta en la otra dirección cuando se activaban los eventos del teclado. Moví el centro de la etiqueta en el botón anulando el método drawRect:
- (void)drawRect:(CGRect)rect
{
self.titleLabel.center = CGPointMake(self.titleLabel.center.x, self.titleLabel.center.y+3);
}
Yo también tuve este problema.
Para corregirlo, subclasifique UITextField
e implemente los siguientes métodos para ajustar la posición del texto cuando no esté editando y editando.
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset( bounds , 8 , 8 );
}
- (CGRect)editingRectForBounds:(CGRect)bounds {
return CGRectInset( bounds , 8 , 5 );
}
Swift 3
No te olvides de las accessory views
de la UITextField. Deberá tener en cuenta la super
de las funciones * rect (forBounds: ...) si desea una implementación que funcione. ¡Y asegúrese también de desplazar los rects solo para el buggy iOS 10
y no para 9 u 8! El siguiente código debería hacer el truco:
public class CustomTextField: UITextField {
public override func textRect(forBounds bounds: CGRect) -> CGRect {
let superValue = super.textRect(forBounds: bounds)
if #available(iOS 10, *) {
return superValue.insetBy(dx: 0, dy: 0)
}
return superValue
}
public override func editingRect(forBounds bounds: CGRect) -> CGRect {
let superValue = super.editingRect(forBounds: bounds)
if #available(iOS 10, *) {
return superValue.insetBy(dx: 0, dy: -0.5)
}
return superValue
}
public override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
let superValue = super.placeholderRect(forBounds: bounds)
if #available(iOS 10, *) {
if isEditing {
return superValue.insetBy(dx: 0, dy: 0.5)
}
return superValue.insetBy(dx: 0, dy: 0.0)
}
return superValue
}
}
EDITAR
Edité ligeramente mi código de arriba a lo siguiente y funciona mejor para mí. Lo probé en iPhone 6, 6s, 7, 7s así como en los dispositivos "más" con iOS 9.3 y 10.3.
public class CustomTextField: UITextField {
public override func textRect(forBounds bounds: CGRect) -> CGRect {
let superValue = super.textRect(forBounds: bounds)
if #available(iOS 10, *) {
return superValue.insetBy(dx: 0, dy: -0.3)
}
return superValue.insetBy(dx: 0, dy: -0.2)
}
public override func editingRect(forBounds bounds: CGRect) -> CGRect {
return self.textRect(forBounds: bounds)
}
}
Creo que también depende de la fuente que uses. Yo uso UIFont.systemFont(ofSize: 17.0, weight: UIFontWeightLight)