iphone - sviluppare - xcoding tutorial




Il testo in UITextField si sposta dopo la modifica(centro durante la modifica) (8)

Ho uno strano problema. Ho un UITextField in cui l'utente dovrebbe scrivere la quantità di qualcosa, quindi il campo si chiama "amountField". Tutto sembra a posto, quando l'utente inizia a modificare il campo di testo il testo si trova nel centro verticale e orizzontale - è grandioso.

Tuttavia, quando l'utente termina la modifica, il testo si sposta leggermente. Ho provato molte cose, niente ha aiutato ...

Aggiungo gli screenshot qui sotto, così puoi vedere qual è il problema.

Questo è quello che sembra durante la modifica del campo - va bene.

Ed è così che appare quando si fa il montaggio: questo è il problema !

Per favore, se qualcuno sa cosa potrebbe causare questo sarei molto grato! :)

Ecco alcuni dei miei codici relativi all'Impostazione.

amountField.keyboardType = UIKeyboardTypeNumberPad;
amountField.returnKeyType = UIReturnKeyDone;
amountField.delegate = self;

[amountField setFont:[UIFont fontWithName:@"Nuptial Script LT Std" size:30]];   
amountField.borderStyle = UITextBorderStyleNone;
UIImage *amountBg = [UIImage imageNamed:@"skin2_ipad_amountField.png"];
[amountField setBackground:amountBg];

amountField.rightView = nil;
//amountField.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:0.2];

amountField.textAlignment = UITextAlignmentCenter;
amountField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
amountField.adjustsFontSizeToFitWidth = YES;
amountLabel.textColor = UIColorFromARGB(0x313030); //Using my own macro

amountField.frame = CGRectMake(300, 480, 136, 32);
amountField.center = CGPointMake(605, 439);

PS: Quelle curve bianche ci sono perché ho impostato lo sfondo in bianco con 0.2 alfa, va bene.


Questo bug mi è successo quando ho impostato il testo e sono diventato il primo risponditore in viewDidLoad o viewWillAppear . Quando ho spostato il codice viewDidAppear per viewDidAppear il bug è andato via.


Questo perché il BaselineOffset per il campo di testo è stato modificato. In UITextFieldDidEndEditing creazione di un testo attribuito con NSBaselineOffset: 0 e l'utilizzo di tale testo attributedText risolverà il problema.

-(IBAction)txtFieldDidEndEditing:(UITextField *)sender {
     NSDictionary *style = @{
                            NSBaselineOffsetAttributeName: @(0)
                            };
    self.txtField.attributedText = [[NSAttributedString alloc] initWithString:self.txtField.text attributes:style];
}

Non ero in grado di cambiare il file del font, quindi quando ho risolto questo ho salvato il frame di UITextField originale in una proprietà e applicato il seguente codice:

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
    textField.frame = self.usernameFrame;
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
    textField.frame = CGRectOffset(self.usernameFrame, 0, 1);
}

È un po 'hacky, ma ha fatto il lavoro.


Così...

Dopo molte ore di provare molte cose, ho trovato il problema. Nel mio caso il problema è il carattere. Non so davvero perché, ma l'autore del font ha reso il font strano (leader ecc.), Ha uno spazio vuoto sul fondo. Non so perché, ma quando si modifica il testo tutte le proprietà del testo vengono ignorate, ma dopo aver terminato la modifica, vengono applicate.

Quindi, se hai un problema simile, prova a cambiare il font in Arial o qualcosa di simile.

Per una spiegazione completa, consultare i seguenti link: link 1 e link 2 . La soluzione consigliata in questi collegamenti può evitare molti mal di testa e può anche essere applicata per risolvere problemi come il testo che si sposta verso l'alto quando si inizia a modificare un UITextField (usando il carattere di sistema o altri tipi di carattere particolari).


C'è un problema su iOS 8.1 e sotto, non so se lo aggiusteranno più tardi, ma a quel tempo non esiste una soluzione unica che corregge tutti i casi, perché l'errore e le soluzioni sono di tipo di carattere, dipendente dalla dimensione.

Una di queste soluzioni o una combinazione di queste soluzioni di seguito può risolvere il tuo problema:

  • Modifica della dimensione del carattere.

  • Modifica del tipo di carattere.

  • Modifica della dimensione di UITextField.

  • Decompilare il font in questione, modificare le caratteristiche del font e ricompilarlo (per ulteriori spiegazioni si prega di consultare i seguenti link: link 1 e link 2 ).

Altrimenti questa altra soluzione autosufficiente di seguito può risolvere il tuo problema:

Versione rapida

import UIKit

class CustomTextField: UITextField {

    ...

    override func textRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func editingRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

    override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
        // Possible values.
        return CGRectInset(bounds, CGFloat(35.0), CGFloat(0.0))
    }

}

Questa soluzione è stata testata con leftView e funziona come un fascino.

NOTA: questo approccio è "dipendente dai caratteri", i valori utilizzati per CGRectInset possono variare per ogni carattere e dimensione.


Ho avuto un problema simile che è iniziato a verificarsi su iOS 9 . Fondamentalmente ho un UITextField in una cella di visualizzazione della collezione. A volte, quando l'utente termina la digitazione e la modifica, il testo "rimbalza" su e poi giù nuovamente nella sua posizione corretta. Glitch molto strano e fastidioso. Semplicemente facendo questo tweak risolto il problema su iOS 9 e si è dimostrato sicuro su iOS 7 e 8:

 - (void)textFieldDidEndEditing:(UITextField *)textField
 {
    [textField layoutIfNeeded]; //Fixes iOS 9 text bounce glitch
    //...other stuff
}

Controlla la tastiera per cambiare la visualizzazione della posizione del pop-up se c'è una riga di codice self.view.layoutIfNeeded() Cancellalo.Buona fortuna!


Disabilitare ClipsToBounds per TextField lo ha risolto per me.





uitextfield