Sto usando pan, pizzico e ruotare UIGestureRecognizers per consentire all'utente di inserire determinati elementi dell'interfaccia utente esattamente dove li desiderano. Usando il codice da qui http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more (o un codice simile da qui http://mobile.tutsplus.com/tutorials/iphone/uigesturerecognizer/) entrambi mi forniscono ciò di cui ho bisogno affinché l'utente inserisca questi elementi dell'interfaccia utente come preferiscono.Caricamento di UIView e centro dalle impostazioni fornisce una diversa posizione
Quando l'utente esce modalità "layout dell'interfaccia utente", risparmio del trasformare e centro come modo UIView:
NSString *transformString = NSStringFromCGAffineTransform(self.transform);
[[NSUserDefaults standardUserDefaults] setObject:transformString forKey:@"UItransform", suffix]];
NSString *centerString = NSStringFromCGPoint(self.center);
[[NSUserDefaults standardUserDefaults] setObject:centerString forKey:@"UIcenter"];
Quando ricarichiamo l'app, ho letto del trasformare e centro come modo UIView:
NSString *centerString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIcenter"];
if(centerString != nil)
self.center = CGPointFromString(centerString);
NSString *transformString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UItransform"];
if(transformString != nil)
self.transform = CGAffineTransformFromString(transformString);
E l'UIView finisce ruotato e ridimensionato correttamente, ma nel posto sbagliato. Inoltre, entrando di nuovo in modalità "Layout UI", non riesco sempre ad afferrare la vista con i vari gesti (come se la vista visualizzata non fosse la vista come intesa dal riconoscitore di gesti?)
Ho anche un pulsante di ripristino che imposta l'identità transform
di UIView e il suo center
in qualsiasi momento quando viene caricato dal NIB. Ma dopo aver caricato il centro UIView modificato e trasformato, anche il reset non funziona. La posizione di UIView è errata.
mio primo pensiero era che, poiché tali esempi di codice gesto alterano center
, che devono essere rotazioni avvengono centri intorno diverse (supponendo una sequenza imprevedibile di movimenti, rotazioni e bilancia). Poiché non desidero salvare l'intera sequenza di modifiche (sebbene ciò possa essere utile se si desidera disporre di alcune funzionalità di annullamento nella modalità di layout), ho modificato il gestore di UIPanGestureRecognizer per utilizzare la trasformazione per spostarlo. Una volta che ho funzionato, ho pensato che salvare la trasformazione mi avrebbe portato la posizione corrente e l'orientamento, indipendentemente dall'ordine in cui sono avvenute le cose. Ma nessuna fortuna. Ho ancora una posizione strana in questo modo.
Quindi sono in perdita. Se un UIView è stato spostato e ruotato in una nuova posizione, come posso salvare quella posizione e l'orientamento in un modo in cui posso caricarlo in seguito e riportare l'UIView dove dovrebbe essere?
Mi scuso in anticipo se non ho taggato questo diritto o non lo ho disposto correttamente o ho commesso qualche altro peccato di stackoverflow. È la prima volta che scrivo qui.
EDIT
sto cercando le due proposte finora. Penso che siano effettivamente la stessa cosa (si suggerisce di salvare la cornice e l'altra suggerisce di salvare l'origine, che penso sia il frame.origin).
Così ora il salvataggio/caricamento dal codice prefs include quanto segue.
Save:
NSString *originString = NSStringFromCGPoint(self.frame.origin);
[[NSUserDefaults standardUserDefaults] setObject:originString forKey:@"UIorigin"];
carico (prima caricare la trasformazione):
NSString *originString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIorigin"];
if(originString) {
CGPoint origin = CGPointFromString(originString);
self.frame = CGRectMake(origin.x, origin.y, self.frame.size.width, self.frame.size.height);
}
ottengo lo stesso (o simile - è difficile dire) risultato. Infatti, ho aggiunto un pulsante per ricaricare solo i prefs, e una volta ruotata la vista, quel pulsante "ricarica" sposterà ripetutamente l'UIView di qualche offset (come se il frame o la trasformazione fossero relativi a se stesso - che sono sicuro è un indizio, ma non sono sicuro di cosa stia puntando).
EDIT # 2
Questo mi rende chiedo a seconda del punto di vista di frame
. Da Apple http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW6 (sottolineatura mia):
Il valore nella proprietà centro è sempre valida, anche se sono stati aggiunti fattori di scala o di rotazione per trasformare della vista. Lo stesso non vale per il valore nella proprietà frame, che è considerato non valido se la trasformazione della vista non è uguale alla trasformazione dell'identità.
EDIT # 3
Okay, quando sto caricando le preferenze in, tutto sembra a posto. Il rect bounds
del pannello dell'interfaccia utente è {{0, 0}, {506, 254}}. Alla fine del metodo viewDidLoad di VC, tutto sembra ancora a posto. Ma nel momento in cui le cose vengono effettivamente visualizzate, bounds
è un'altra cosa. Ad esempio: {{0, 0}, {488.321, 435.981}} (che assomiglia a quanto è grande nella sua superview una volta ruotato e ridimensionato). Se resetto i limiti a ciò che dovrebbe essere, si rimette in posizione.
È abbastanza facile reimpostare i limiti su ciò che dovrebbero essere programmaticamente, ma in realtà non sono sicuro di quando farlo! Avrei pensato di farlo alla fine di viewDidLoad, ma bounds
è ancora corretto a quel punto.
EDIT # 4
ho provato catturando self.bounds a initWithCoder (come è proveniente da un NIB), e poi in layoutSubviews, reset self.bounds a quello catturato CGRect. E quello funziona.
Ma sembra orribilmente hacky e irto di pericoli. Questo non può essere davvero il modo giusto per farlo. (Può?) La risposta di skram qui sotto sembra così semplice, ma non funziona per me quando l'app si ricarica.
Grande prima domanda! Benvenuto in SO! – jrturton
Grazie, jrturton :) SO è davvero qualcos'altro. Il fatto di avere due risposte in pochi minuti (anche se non ci sono ancora riuscito) è semplicemente spettacolare! – sbkp
Presumibilmente stai usando una combinazione di trasformazioni di scala e rotazione per ruotare/zoom e semplicemente spostando il centro per la panoramica? – jrturton