2010-09-18 4 views
7

Prima pubblicazione su overflow dello stack.UIView e AutoresizingMask ignorato

Ho passato ore a perlustrare molte ricerche su Google e, a questo punto, ho praticamente memorizzato i documenti di riferimento di classe UIView e UIViewController. A prescindere da ciò che faccio, la mia app ignora i miei sforzi per ridimensionare le mie visualizzazioni sulla modifica dell'orientamento (o altre modifiche alla dimensione del fotogramma).

Non sono presenti nib o xibs; Sto costruendo tutte le mie viste e viewcontrollers a livello di codice, e loro (i viewcontrollers) sono tutte sottoclassi di una delle tre sottoclassi UIViewController personalizzate che ho creato. Queste classi eccellenti hanno le seguenti linee nel loro loadview: metodo ...

[self setView:[[[UIView alloc] initWithFrame:[self viewFrame]] autorelease]]; 
[[self view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; 
[[self view] setAutoresizesSubviews:TRUE]; 

In tutti i metodi setter appropriati (ovunque io aggiungo una visualizzazione secondaria, in altre parole) sto ripetendo le fasi di applicare l'autoresizingMask. Sembra che non importa quello che faccio, il risultato è sempre lo stesso: faccio clic su build, fai clic su debug, attendi che l'app si avvii, ruoti il ​​dispositivo e presto! La vista ruota ma non viene ridimensionata affatto.

Cosa mi manca qui? Probabilmente è qualcosa di ovvio che non sto vedendo. Qualsiasi aiuto è veramente apprezzato, grazie in anticipo.

risposta

33

Beh, certo, è stata colpa mia.

Lezione numero uno:non state facendo voi stessi un favore stare svegli tutta la notte cercando di risolvere il codice rotto. Riposati! Bevi più acqua! Probabilmente peggiorerai le cose solo se continuerai a cercare di costringere il tuo cervello a eseguire una complessa strategia algoritmica e una logica oltre la sua ora di andare a dormire.

Si è verificato un UIView canaglia verso la parte inferiore della gerarchia di visualizzazione che non ha impostato la proprietà di autoresize. Pensavo di aver guardato attraverso tutto, ma ho scoperto che ne avevo perso uno. (Solo una piccola visuale e un'intera giornata di riprese!)

Posso dire per chiunque arrivi più tardi con una simile frustrazione, che Autoresizing funziona davvero come documentato. Se pensi che "qualcosa non viene chiamato", probabilmente stai cercando nel posto sbagliato. Inoltre, le costanti enum UIViewAutoresizingMask non vengono utilizzate esattamente come in Interface Builder. In IB, si "bloccano" i margini, mentre nel loro impostazione a livello di codice, i margini bloccati sono assunti per impostazione predefinita e li si "sbloccano" impostandolo come "Flessibile". Ad esempio, impostare solo i bit FlexibleWidth e FlexibleHeight equivale a abilitare tutte le opzioni di autoresizing in IB. Lanciare una qualsiasi maschera di margine (ad esempio UIViewAutoresizingFlexibleLeftMargin) "deseleziona" l'opzione di autoresizing del margine corrispondente in IB. (Ho visto molti altri messaggi fluttuare in giro dove questo sembrava essere uno dei maggiori punti di confusione per alcune persone.)

Durante la mia ricerca, tuttavia, ho notato che non sembra esserci alcun tipo di evento, messaggio, notifica o altro quando un UIView viene ridimensionato, automaticamente o meno. Anche se non è necessario ridimensionare le sotto-viste, sarebbe bello sapere quando accade nella situazione in cui si vorrebbe far scorrere scrollView o tableView in caso cambiasse la dimensione del frame. So che si può fare facilmente questo quando si apre la tastiera, perché c'è un sistema di notifica in giro così come i metodi TextFielddelegate. Così forse un argomento per un altro post ...

In ogni caso, vi ringrazio tutti coloro che partecipano a StackOverflow!

+2

Overriding -setFrame: è un modo abbastanza affidabile per vedere che una vista è stata ridimensionata. – aksommerville

+0

Oh sì, certo! Io uso questa tecnica tutto il tempo in cui il conteggio dei ritardi del debugging, ma spesso trascuro di farlo in altre situazioni come questa. (Divertente quanto evasivo può essere ovvio.) Per chiarire il tuo commento per gli altri, questo si riferisce alla sovrascrittura -setFrame per sputare qualche NSLog che ti dice il nome della vista e alcuni valori di frame. (Non dimenticarti di chiamare l'implementazione di super se provi a farlo.) – quickthyme

+0

A parte questo, non userei quel metodo per nient'altro. Vorrei anche fare in modo di disabilitare l'override prima di rilasciare il codice come produzione. – quickthyme