2015-01-06 7 views
15

Sto costruendo una nuova app e desidero avere una "procedura guidata di benvenuto" all'inizio in cui ho uno storyboard con una serie di immagini presentate in un UIPageViewController. Ho caricato le immagini e tutto ciò va bene, tuttavia le immagini vengono ridimensionate ogni volta che vanno oltre il ViewController "precedente" o "successivo". Sto usando Swift per lo sviluppo.Problema di ridimensionamento UIImageView in UIPageViewController

Ecco un video della questione: http://youtu.be/dXcjjT-8Bk0

Ho provato tutte le diverse modalità di visualizzazione (Aspect in forma, di riempimento aspetto, ridisegnare ecc) e tutti si comportano allo stesso.

Sto utilizzando Auto-Layout + Classi di dimensioni perché desidero semplificare lo sviluppo di diverse dimensioni dello schermo. I vincoli attuali che ho che rendono l'UIImage appaiono alla giusta dimensione sono:

Align Centre X to Superview 
Top Space to Top Layout Guide 
Bottom Space to Bottom Layout Guide + Equals: 50 

Attualmente sto usando Aspect Fit che mi dà l'immagine corretta (dopo che hanno fatto il loro 'comportamento ridimensionamento'

Can. Qualcuno mi guida ulteriormente su come risolvere questo problema?

risposta

14

Dal tuo video, ho notato che il tuo UIImageView è sempre "ridimensionato" nella parte superiore, non nella parte inferiore. Questo è sicuramente a causa del tuo vincolo di autolayout che chiami " La guida al layout Top Space to Top ".Tutta la tua vista di UIImageView il controller viene trasferito tramite il controller di visualizzazione pagina a scorrimento, non sa dove si trova la guida di layout superiore, quindi il suo topLayoutGuide.length è 0. Solo dopo il completamento dell'animazione, il controller della vista ottiene un valore positivo per topLayoutGuide.length. Sì, il controller della visualizzazione di pagina dovrebbe essere un po 'più intelligente di questo, ma non lo è.
È possibile interrompere l'uso della guida di layout superiore e creare un vincolo di autolayout relativo alla parte superiore della sua superview. Oppure puoi continuare a utilizzare la guida al layout in alto, ma tenere conto quando è length è 0. È possibile farlo facendo uno sbocco per il vostro storyboard NSLayoutConstraint e prioritario viewWillLayoutSubviews() nelle vostre ViewController contenenti i UIImageView s:

@IBOutlet weak var topSpaceToTLG: NSLayoutConstraint! 
var parentTLGlength: CGFloat = 20 

override func viewWillLayoutSubviews() { 
    if self.topLayoutGuide.length == 0 { 
     // Lengthen the autolayout constraint to where we know the 
     // top layout guide will be when the transition completes 
     topSpaceToTLG.constant = parentTLGlength 
    } else { 
     topSpaceToTLG.constant = 0 
    } 
} 

Questo sarà sempre mettere la parte superiore del vostro UIImageView alla guida di layout in alto, partendo dal presupposto che la barra di stato è sempre 20 punti. Prima di disporre le sottoview, controlla se la lunghezza della guida di layout superiore è 0 oppure no e regola di conseguenza il vincolo di autolayout. Al termine dell'animazione di transizione, il layout viene nuovamente attivato e la lunghezza della guida di layout superiore corrisponderà al valore previsto, pertanto la costante di restrizione può tornare a 0. Ancora meglio del codice fisso, il valore deve passare nella lunghezza esatta del controllore della vista genitore durante l'inizializzazione, tenendo conto di eventuali modifiche alla guida di layout in alto come l'aggiunta di una barra di navigazione.

+1

Chiunque abbia questo problema? Questo non ha funzionato per me. Ho un imageView a schermo intero in background e lo fa ancora. –

+0

Questo purtroppo non tiene conto della rotazione: in orizzontale su un telefono, la lunghezza della guida del layout superiore è _propriamente_ 0. Trovare la lunghezza della guida del VC principale sembra essere l'unica soluzione, per quanto possa essere icky. –

1

Dal video penso che si possa risolvere questo impedendo a UIPageViewController di estendersi sotto le barre in alto.

In xcode è possibile eseguire questa operazione utilizzando l'ispettore di attributo per il controllore della visualizzazione di pagina deselezionando Estendi bordi sotto le barre superiori.

Ciò dovrebbe impedire che il paging nella barra di stato ritenga utile per evitare l'interruttore che si vede.

+0

L'ho provato da solo ma non ha funzionato. – jason328

1

Ho scoperto che il mio problema era che quando il controller di visualizzazione iniziava ad animare le guide di layout superiore e inferiore non aveva altezza. I margini destro e sinistro no. Quando la vista finì di animare, tutti ricevettero un'altezza o una larghezza e la mia vista si ridimensionò. Ho risolto questo problema sul mio progetto aggiungendo vincoli verticali tra i miei oggetti e la loro super vista invece che nella Guida al layout superiore/inferiore. Ho anche dovuto modificare i miei vincoli orizzontali per ignorare i margini laterali.

L'ultimo problema che ho riscontrato è che dovevo tenere conto della barra di stato. Potrebbe essere o non esserci o potrebbe essere una doppia barra, come quando stai usando Maps.