9

Ecco un video che ciò accada:Perché quando cambio l'immagine di UIImageView mentre esegui il panning della cella, l'intera vista viene resettata per un secondo?

http://cl.ly/3V0D3U1m3w0E

In sostanza, se cambio la proprietà immagine del UIImageView (X) mentre sto panning che porta tutti i controlli nella visualizzazione di nuovo al loro originale , posizione non aperta. (Sono tutti inseriti in un UIView in modo da poter "spostare la cella", mentre i UIImageViews sono al di fuori della vista e indipendente.)

Se non cambiare l'immagine:

http://cl.ly/3T1N1G33320G

Per la registrazione, cambio l'immagine quando l'utente esegue una panoramica di una certa quantità, credo di 80 punti.

Ecco il codice:

// Only allow the cell to be moved 100 pixels left or right 
if (xPos <= 100 && xPos >= -100) { 
    // Move our cell to the xPos we defined 
    CGRect slidingViewFrame = self.slidingView.frame; 
    slidingViewFrame.origin = CGPointMake(xPos - 100, 0); 
    self.slidingView.frame = slidingViewFrame; 

    if (xPos >= 80) { 
     if (_removeIconIsActive == NO) { 
      // Change remove icon to a red, active state and animate the change 
      self.removeIconImageView.image = [UIImage imageNamed:@"remove-icon-active.png"]; 

      _removeIconIsActive = YES; 
     } 

     CGRect removeIconFrame = self.removeIconImageView.frame; 
     removeIconFrame.origin = CGPointMake(40, 35); 
     self.removeIconImageView.frame = removeIconFrame; 
    } 
} 

I punti di vista sono istituiti nello storyboard, ma il movimento e la manipolazione è tutto fatto in codice.

Ecco il layout storyboard:

enter image description here

Ed ecco il metodo integrale che gestisce il panning delle cellule: https://gist.github.com/anonymous/c51c7cb2997c89094f08

+0

Ti suggerisco di incollare altro codice. – sunkehappy

+0

Ho aggiunto il layout dello storyboard e tutto il codice della cella panoramica, non so che altro fornire. –

+0

Suggerisco di inserire il tuo codice non confidenziale in un nuovo progetto e di inserirlo in GitHub. Attraverso il codice incollato non riesco a trovare il problema e penso che il codice non sia completo. – sunkehappy

risposta

6

Se si utilizza Auto Layout non si dovrebbe essere modificando la proprietà cornice a tutti . Il frame è il risultato dell'applicazione dei vincoli di layout, non una proprietà "write".

Suppongo che si disponga di un vincolo che imposta la posizione x delle proprie viste. Creare un IBOutlet per quel vincolo e invece di modificare il frame, modificare la proprietà constant del vincolo. Quindi chiama il numero layoutIfNeeded della vista.

Senza vedere di più sui tuoi punti di vista, i vincoli e le prese, non posso dare il codice finale, ma si finirà con qualcosa di simile:

self.leftConstraint.constant = xPos - 100.f; 
[self.slidingView setNeedsUpdateConstraints]; 
[self.slidingView layoutIfNeeded]; 

La mia interpretazione di ciò che sta accadendo è che l'impostazione l'immagine cambia la dimensione intrinseca della vista dell'immagine, che fa ricalcolare i vincoli stessi, riportando tutto alla posizione iniziale. Non appena fai scorrere un altro pixel, riprendi a giocare e la proprietà frame vince ancora.

Spero che aiuti.

+0

Altro che avere il layout automatico controllato nello storyboard, in realtà non lo sto usando * ovunque. Questo si applica ancora? –

+0

Ecco il progetto ridotto alla sola capacità di aggiungere testo (che ti darà le cellule con cui interagire) tramite il +. È quindi possibile far scorrere le celle e vedere il problema. Scorrendo a destra mostra il problema con il cambiamento. Scorrendo a sinistra mostra che la mancanza di un problema. http://cl.ly/2g3X3O083i3l –

+0

La tua cella ovviamente mostra dei vincoli nel suo xib, quindi anche se non stai usando, stanno agendo. Ho scaricato il tuo progetto, disattivato il layout automatico per lo storyboard (prima "scheda" del pannello di destra) e ho verificato il gesto della diapositiva. Non ho potuto vedere il flash che mostri nel tuo video. Ovviamente tutta la tua interfaccia utente è rotta, perché l'hai progettata con Auto Layout in Interface Builder. Quindi, puoi utilizzare il layout automatico per spostare le cose o dovrai rielaborare l'interfaccia utente completa. – yonosoytu