Aggiornamento di UILabel Il text ripristina lo storyboard?

Mi sono imbattuto in uno strano scenario, che non riesco a capire da solo.

Ho iniziato un piccolo scenario di test, con un'applicazione iOS Single View quasi vuota e uno storyboard. Gli story board contengono un'etichetta e un singolo UIView, 10×10, solo per presentare il problema. Naturalmente hanno gli IBOutlet appropriati assegnati e connessi:

@property (nonatomic, weak) IBOutlet UILabel *label; @property (nonatomic, weak) IBOutlet UIView *dot; 

Nel metodo viewDidLoad (vuoto) avvio un timer e lo aggiungo al ciclo di esecuzione in questo modo:

 - (void)viewDidLoad { [super viewDidLoad]; NSTimer * timer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(doSomething) userInfo:nil repeats:YES]; [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; } 

Nel metodo doSomething (vuoto) faccio quanto segue:

 -(void)doSomething { // Lets move the dot to the right a bit further _dot.center = CGPointMake(_dot.center.x+1, _dot.center.y); // About every ten steps, update the label with the current // X position, to better show the problem CGFloat moduleResult = (float)((int)_dot.center.x % (int)10.0); if(moduleResult <= 0) _label.text = [NSString stringWithFormat:@"%f", _dot.center.x+1]; } 

Quindi, in pratica, cambio il centro della piccola vista a punti 10×10 each volta di 1, e each 10 volte aggiorno l'etichetta per mostrare la posizione X corrente. Del resto non import nemless con cosa aggiorno il text dell'etichetta, è solo importnte che cambi. E cambio solo il text each 10 volte per mostrare meglio il problema qui.

Se eseguo quel codice, il punto si sposta esattamente come previsto a destra, ma quando aggiorno il text dell'etichetta, la vista a punti viene ripristinata e torna alla sua posizione originale. Quindi aggiornare il text dell'etichetta ripristina le mie altre visualizzazioni sullo Storyboard, il che mi confonde totalmente.

Qualcuno può riprodurlo o addirittura spiegarlo?

Grazie a tutti, in anticipo 🙂

alex

Solutions Collecting From Web of "Aggiornamento di UILabel Il text ripristina lo storyboard?"

Sono stato in grado di riprodurre il comportmento descritto, ecco perché sta accadendo:

  1. Per impostazione predefinita, la posizione degli elementi è determinata dai vincoli AutoLayout generati automaticamente
  2. Quando si modifica la posizione del dot si aggiorna solo il frame corrente, non i vincoli sottostanti
  3. La modifica del text di UILabel può eventualmente modificare la dimensione del contenuto di UILabel , pertanto è necessario ricalcolare il frame. Qui l'integer layout viene ricalcolato in base ai vincoli, quindi anche il frame di reset del dot .

Per la risoluzione, suggerirei di specificare correttamente i vincoli AutoLayout e aggiornarli invece della posizione direttamente.

E 'stato praticamente tutto, i vincoli di AutoLayout hanno spinto la vista sempre al suo posto originale, il che credo abbia senso, è quello che dovrebbe fare il AutoLayout.

Quindi, dal momento che volevo che il mio litte 10×10 dot-view si muovesse sullo schermo (per motivi di praticità, ho cambiato il mio codice. Tento di spiegarlo, la mancanza di reputazione mi impedisce al momento di pubblicare le immagini appropriate.

Ho creato due vincoli di AutoLayout personalizzati, dicendogli di mantenere la vista sempre a 120 px dalla parte sinistra della superview e 100 px dalla parte superiore della superview. Ho anche specificato il vincolo per una width e altezza fissa di each 10. Dal momento che per un vincolo valido è necessaria la combinazione di x e y, nonché altezza e width (alless per quanto ho capito).

  - | | Constraint *n* from top | |------| Constraint | view | *n* from left | _dot | |--------------- |------| 

Quindi ho creato due IBOutlet per i due vincoli:

 @property (weak, nonatomic) IBOutlet NSLayoutConstraint *c1X; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *c1Y; 

Ho cambiato il mio metodo doSomething (vuoto) con questo:

 -(void)doSomething { // Lets move the dot to the right a bit // further by changing its Constraint _c1X.constant++; // About every ten steps, update the labe with the current // X position, to better show the problem CGFloat moduleResult = (float)((int)_dot.center.x % 10); if(moduleResult <= 0) _label.text = [NSString stringWithFormat:@"%f - %f - %f", _c1X.constant, _dot.center.x, _dot.center.y]; } 

Funziona, la modifica del vincolo invece della vista attuale ora sposta la vista sullo schermo. Se questa è la migliore pratica, non lo so. Se non l'avessi provato per scopi pratici, seguendo un vecchio tutorial, non lo farei in primo luogo.

Nella speranza questo potrebbe aiutare un giorno. Eventuali commenti o miglioramenti sono i benvenuti 🙂

alex