Rotazione Uiviewcontroller Edgesforextendedlayout


Quale oggetto è responsabile per dipatching le chiamate di metodo di rotazione UIViewController, i. e: shouldAutorotateToInterfaceOrientation: willRotateToInterfaceOrientation: Durata: willAnimateFirstHalfOfRotationToInterfaceOrientation: Durata: willAnimateSecondHalfOfRotationFromInterfaceOrientation: Durata: didRotateFromInterfaceOrientation: immagino che è UIApplication (ma forse il AppDelegate o UIWindow). La domanda successiva, è come fa l'oggetto sa che UIViewController di parlare come fa a sapere che UIViewController ha la sua vista come visualizzazione secondaria della finestra C'è un messaggio è possibile inviare o una proprietà è possibile impostare (di un oggetto) che imposta il UIViewController attivo per l'applicazione sembra che UIApplication sta inviando un messaggio al controller della vista attiva. Ma come fa l'istanza View Controller arrivare questi messaggi Il messaggio viene inoltrato al primo controller di vista la cui visione è stata aggiunta all'istanza UIWindow. Questo riduce a 3 scenari di base: Il ViewController la cui vista viene aggiunto direttamente al UIWindow istanza (visualizzazione singola app) il controller di navigazione in una applicazione di navigazione basato, quindi il controller di navigazione inoltra il messaggio alle viste attivi View Controller. Il controller scheda bar in una applicazione basata scheda bar, poi il controller barra delle schede inoltra il messaggio alle viste attivi View Controller (o il controller di navigazione attiva). Il problema si avrà, è se costruire un app con molteplici punti di vista, ma non si utilizza un controller di navigazione o il controller Tab Bar. Se si scambiano opinioni dentro e fuori l'istanza UIWindow manualmente, non sarà possibile ricevere questi messaggi in modo affidabile. Questo è simile a posti come questo: iPhone viewWillAppear non sparare Basta usare Mele convenzioni per molteplici punti di vista e si bene. Spero che questo consente di risparmiare un po 'di uno un'ora o due Corey, come è possibile limitarsi a un VC per schermo, quando per esempio si dispone di un app che ha bisogno di due punti di vista da tavolo sullo stesso schermo You39d bisogno di un VC per ogni visualizzazione della tabella, quindi un VC per gestire entrambi. Oppure si consideri un altro esempio: un app che ha bisogno di tab-bar come comportamento, ma per esigenze graphicalart ha bisogno di un controller barra delle schede personalizzate Avere un solo VC per schermo sembra un obiettivo fattibile per interfacce utente complesse. In questi casi, ci deve essere un modo per controllare in modo affidabile gli eventi di rotazione dell'interfaccia ndash Yetanotherjosh 22 marzo 11 a 1:53 Nelle mie prove, I39ve scoperto che quando la nidificazione di vista che hanno diversi controller di vista li controllano, a volte può essere arbitraria che vista controller riceve il messaggio shouldAutorotateToInterfaceOrientation - it39s sicuramente non sempre inviato al controller della vista che gestisce il più alto bambini della gerarchia UIWindow39s - può certamente essere inviato per visualizzare i controllori corrispondenti a bambini di quella view controller39s. ndash Yetanotherjosh 22 marzo 11 al 01:57 come fa a sapere che UIViewController ha la sua vista, come la visualizzazione secondaria della classe di finestra UIViewController mantiene una mappa statica tra i punti di vista e le loro controller di vista. Questa mappa viene interrogato in alcuni punti chiave all'interno Cocoa Touch. In particolare, UIView nextResponder interroga e restituisce il controller se trovato. Credo che UIWindow fa la stessa ricerca con la sua vista radice di sapere quale controller di trasmettere gli eventi di rotazione a. Verificherà la prossima volta Ill essere in cerca qualcosa nella smontaggio. (Ive ha trascorso qualche tempo reverse-engineering Cocoa Touch per capire come funzionano le cose lì.) Risponde 6 9 maggio alle 11:15 Questa è tutta la magia non avete mai preoccuparsi. Basta aggiungere la tua vista controllori radice alla finestra - o ottenere una barra delle schede o controller di navigazione a farlo per voi - e che riceverà questi messaggi. (Ma se si frugare con il debugger, si potrebbe venire alla stessa conclusione che ho: theres una sorta di mappatura tabella interna ogni controller di vista al controller, ei messaggi vengono inviati base su questo link.) Aggiornamento: Questo è stato magia veramente privata nel 2009, quando ho scritto questa risposta, ma le successive modifiche iOS hanno reso le API dietro di esso pubblico. Il controller della vista principale è ora accessibile tramite la proprietà UIWindow. rootViewController, e l'albero di controller di vista discendente è formato utilizzando la proprietà UIViewController. childViewControllers. controllori vista primaria sono responsabili per notificare i loro figli di cambiamenti di orientamento. (Im non sicuro come il controller della vista principale viene notificata, ma si potrebbe impostare un punto di interruzione e scoprire da soli.) Il metodo - shouldAutomaticallyForwardRotationMethods decide se UIViewController farà questo per voi. Se restituisce NO. si diventa responsabile per farlo nel vostro - willRotateToInterfaceOrientation: la durata. - willAnimateRotationToInterfaceOrientation: la durata. e - didRotateFromInterfaceOrientation: metodi. risposto 14 febbraio 09 alle 00:42 ho un problema simile. Ho un gioco di lavoro con orientamento orizzontale (sia a sinistra che a destra del paesaggio). Al fine di gestire un'applicazione multi-view io uso un UIViewController radice, vale a dire un UIViewController manichino con un UIView che non fa nulla. Ho quindi aggiungere tutti gli altri UIView ad esso come una visualizzazione secondaria. Quando si avvia l'applicazione, l'emulatore ruota rapidamente a un orientamento verticale, e mi ognuno dei miei punti di vista, con la sua proprietà cornice guardando come (0, -80.320.480). Ciò risulta nella vista essendo ritagliati da un rettangolo 160 X 320 sul lato destro. Ho notato che il shouldAutorotateToInterfaceOrientation: metodo di ciascuna sottomaschera viene chiamato solo una volta, e che accade quando viene aggiunto alla visualizzazione principale. Successivamente, quando si ruota il dispositivo, solo la vista radice prende il metodo chiamato. Non sorprende che una delle chiamate metodi willAnimate vengono inviati solo alla vista della radice, così, la definizione di uno di questi metodi in subviews è inutile. Questi metodi sono chiamati ogni volta l'orientamento è cambiato in un orientamento accettato dal shouldAutorotateToInterfaceOrientation: metodo. così ho pensato che avrei potuto chnage la mia proprietà telaio subviews da lì. Per fare questo, ho definito il seguente metodo nella mia classe RootViewController: Non capisco perché la proprietà telaio non è aggiornato, ma so che questa soluzione funziona. Spero che questo helps. Layout guida Una delle responsabilità di un contenitore View Controller è al layout suoi controller di vista Bambini. Questa guida va oltre come si può controllare. Rivela vs Peek Importo In questo modo si specifica la posizione orizzontale della vista dall'alto quando è ancorata ad un lato. E 'importante conoscere la differenza tra gli importi peek ancorate rivelare e ancorate quando supporto di più orientamenti e le dimensioni dello schermo. Se avete solo bisogno di supportare un unico orientamento su specifiche dimensioni dello schermo, quindi la questione differenza doesnt. Rivela L'importo orizzontale della vista sotto per mostrare. Peek L'importo orizzontale della vista dall'alto di mostrare. La convenzione di denominazione per le proprietà: ancoraggio (sinistra o destra) (Rivela o Peek) Importo. La combinazione di tutte le possibilità porta a queste quattro proprietà: anchorLeftPeekAmount anchorLeftRevealAmount anchorRightPeekAmount anchorRightRevealAmount fissare l'importo di rivelare da un lato calcolerà l'importo peek per quella stessa parte, e viceversa. La proprietà si imposta sarà un valore fisso che causa l'altro da calcolare. Questa è una struttura costruita in UIViewController. Heres una descrizione dal 7 UI Guida iOS Transition: La proprietà edgesForExtendedLayout utilizza il tipo UIRectEdge, che specifica ciascuno di una rettangoli quattro bordi, oltre a specificare nessuno e tutti. Utilizzare edgesForExtendedLayout per specificare quali bordi di una vista dovrebbe essere esteso, a prescindere dalla barra di traslucenza. Per impostazione predefinita, il valore di questa proprietà è UIRectEdgeAll. ECSlidingViewController utilizza questo valore per decidere su quale delle viste bordi per estendersi al contenitore. Se un bordo non è estesa poi sarà messo a guida layout. Questo è lo stesso comportamento dei contenitori controller di vista UIKit, tranne che i bordi laterali hanno significato. Lasciando UIRectEdgeTop fuori dalla maschera edgesForExtendedLayout metterà il bordo superiore alla guida di layout in alto. Lasciando UIRectEdgeBottom fuori dalla maschera edgesForExtendedLayout metterà il bordo superiore alla guida di layout fondo. Lasciando UIRectEdgeLeft fuori dalla maschera edgesForExtendedLayout metterà il bordo sinistro al punto in cui bordo i migliori viste a destra sarebbe quando ancorato a sinistra. Questo riguarda solo vista controller utilizzati come underRightViewController. Può sia occupare l'intera larghezza del contenitore altrimenti pari al valore rivelare (sia essa fissa o calcolato). Lasciando UIRectEdgeRight fuori dalla maschera edgesForExtendedLayout metterà il bordo destro al punto in cui le migliori viste bordo sinistro sarebbe se ancorato a destra. Questo riguarda solo vista controller utilizzati come underLeftViewController. Può sia occupare l'intera larghezza del contenitore altrimenti pari al valore rivelare (sia essa fissa o calcolato). Il layout per la parte superiore e sotto la vista può essere personalizzato. Questo viene fatto creando un oggetto che è conforme al protocollo ECSlidingViewControllerLayout e restituirla nella scorrevole metodo di vista controllori delegato: slidingViewController: layoutControllerForTopViewPosition: ECSlidingViewControllerLayout ha un unico metodo per implementare: Si sono tenuti a restituire un CGRect che rappresenta una cornice per la data viewController e topViewPosition. È possibile restituire CGRectInfinite di ripiego sul layout di default. Restituisce un CGRect che viene calcolato in base al largo la slidingViewController s vista telaio. Se è fissa o basata sul telaio schermi, quindi rotazione e limiti cambiamenti possono rompere il layout. Posizionare la vista dall'alto in base alla quantità ancorati alla slidingViewController s. Mantenere la semantica del topViewPosition. Ad esempio, se il topViewPosition è ECSlidingViewControllerTopViewPositionAnchoredRight. quindi posizionare la vista dall'alto da qualche parte a destra. Dal momento che il sopra sono suggerimenti. non dovete seguirli. Basta conoscere le conseguenze che si possono rompere il layout rotazione o la semantica del API ECSlidingViewController.

Comments

Popular posts from this blog

E30za Binario Options

Forex Trading Day Con Zone S R Atene

Commercio Cipro Vacanze Easy Forex