2010-10-03 3 views
27

Nell'app Mappe ufficiale di Apple per iPhone, c'è un piccolo pulsante di "arricciatura della pagina" nell'angolo in basso a destra. Quando lo premete, la mappa stessa si riapre per rivelare alcune opzioni. Vorrei duplicare questo effetto nella mia app.Come posso utilizzare UIModalTransitionStylePartialCurl su un UIView che NON occupa l'intero schermo?

Sto cercando di utilizzare UIModalTransitionStylePartialCurl (aggiunto in SDK 3.2). In termini di layout, la mia app assomiglia quasi all'app ufficiale di Google Maps. Posso facilmente ottenere che TUTTA la schermata torni indietro, rivelando un'altra vista al di sotto, ma non voglio questo. Voglio SOLO la vista mappa per staccare.

Per creare questo effetto, è necessario disporre di un UIViewController che eseguirà la transizione. Se imposto questa vista di UIViewController su una piccola sottoview da qualche parte sullo schermo che non occupa l'intero schermo, posso ottenere proprio quella sottoview per riprendermi. È fantastico! Tuttavia, dopo la seconda parte della transizione (quando la pagina torna al suo posto), le viste non sono mai dove sono state avviate. O la vista che si è staccata si è spostata dalla sua posizione originale o la vista che è stata rivelata si è espansa per occupare l'intero schermo.

C'è qualche errore evidente che sto facendo? Gradirei davvero qualsiasi aiuto!

Il codice che sto utilizzando è davvero semplice. E 'fondamentalmente solo:

underMapViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl; 

[curlableMapViewController presentModalViewController:underMapViewController animated:YES]; 
+0

Davvero? Nessuna delle risposte esistenti ha risolto il tuo problema? [Tosse per la tosse] Potresti voler accettare almeno 1 di loro, aiuta davvero le persone ad essere motivate ad aiutarti! –

risposta

9

Dal Documentation:

UIModalTransitionStylePartialCurl

Quando il controller della vista si presenta, un angolo della vista corrente riccioli fino a rivelare la vista modale sotto. Al momento del licenziamento, la pagina arrotolata si riapre in cima alla vista modale. A sua volta una vista modale presentata usando questa transizione non può presentare alcuna vista modale aggiuntiva.

Questo stile di transizione è supportato solo se il controllore della vista genitore presenta una visualizzazione a schermo intero e si utilizza lo stile di presentazione modale UIModalPresentationFullScreen. Il tentativo di utilizzare un fattore di forma diverso per la vista padre o uno stile di presentazione diverso attiva un'eccezione.

Sebbene, non ho alcuna eccezione utilizzando altre presentazioni di schermo intero. Stavo testando e ho lo stesso problema di te. Ho scoperto che se la vista di ParentViewController è una ImageView e imposto la modalità di contenuto su UIViewContentModeCenter, la vista non viene ridimensionata o spostata. Forse c'è una soluzione alternativa salvando la tua vista corrente come immagine, mettila in cima, fai il curl, e dopo aver chiuso la tua modal, riorganizza le cose nascoste incasinate e rimuovi la vista dell'immagine in alto. So che sembra pazzesco, ma è quello che proverò se davvero dovessi soddisfare questo requisito.

Spero che questo aiuti, Jorge.

+0

Grazie! Mi divertirò con la tecnica che hai suggerito e vedrò se riesco a trovare qualcosa che funzioni. – caecus314

0

Mi sono imbattuto in questo problema pure. Per me il fotogramma della vista genitore non è stato alterato fino a quando la vista modale non è stata chiusa. Così ho inserito il frame nella cache prima di chiuderlo, quindi l'ho ripristinato subito dopo.

CGRect frame = controllerWithModal.view.frame; 
[controllerWithModal dismissModalViewControllerAnimated:YES]; 
controllerWithModal.view.frame = frame; 
0

Anche io ho avuto questo problema, ma l'ho risolto ..(non la conosco nel modo giusto, ma funziona)

Volevo avere una visione di immagini all'interno di una vista pergamena, e quando l'utente tocca un pulsante all'interno di quella vista di scorrimento volevo arricciare la vista di scorrimento e mostrare una vista tabella in quel luogo. Così ho posto un Tableview dietro ScrollView e initialy impostarlo hidden.when l'utente tocca pulsante i faceva

[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:frontView cache:YES]; 
[UIView commitAnimations]; 

dopo che frontview rimosso dalla vista. Speranza che aiuta ..

7

Che ne dite di qualcosa di simile:

[UIView beginAnimations:@"PartialPageCurlEffect" context:nil]; 
    [UIView setAnimationDuration:0.3]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:myOldSubViewController.view cache:YES]; 

    [myOldSubViewController.view addSubview:myNewViewController.view]; 

    [UIView commitAnimations]; 

Nota: per alcuni punti di vista, se il punto di vista sono complessi e fuori centro ci potrebbe essere artefatti. La modifica di cache:YES a cache:NO potrebbe risolvere il problema con.

+1

Questo è un effetto simile ma non quello che l'OP voleva. Questo codice fa sì che la "vecchia" visione "si strappi" completamente, piuttosto che "staccare" un po 'per rivelare qualcosa sotto (come Maps). –

+0

Rileggendolo riesco a capire cosa intendesse. Forse si può abortire l'animazione a metà strada in qualche modo per lasciarla parzialmente rivelata? – Marius

5

ho avuto un leggero singhiozzo confondere

.modalTransitionStyle 

e

.modalPresentationStyle 

La prima si va sul bersaglio viewController, per esempio, quello che si desidera sotto. Il secondo va su PARENT viewController, ad es. quello che in realtà viene distorto dal ricciolo. L'OP ha capito bene, ma ho sbagliato, ed è stato un frustrante 10 minuti prima che me ne rendessi conto. Gettandolo su questo post nel caso in cui dia a qualcun altro lo schiaffo della testa di cui avevo bisogno.

7

Come sottolinea cprcrack, questo non risponde alla domanda originale. Tuttavia, sono informazioni utili, quindi con questo in mente lascerò qui.

Questo è in realtà molto più semplice di quanto si possa immaginare.

Chiameremo i controller di vista MapViewController e SettingsViewController. Il tuo problema è che vuoi staccare la parte parte (e solo una parte) di MapViewController per mostrare SettingsViewController.

Ecco come si fa:

  • utilizzare una visualizzazione full size per entrambi i punti di vista.
  • Inserire solo contenuto su inferiore vista a metà di SettingsViewController.
  • Utilizzare UIModalTransitionStylePartialCurl per passare tra di loro, come già lo siete.

iOS rileverà che hai fatto questo peeling automaticamente e solo MapViewController 'vista s abbastanza indietro alla metà inferiore della SettingsViewController' vista s, che è dove tutti i tuoi contenuti è.

Se si mette il contenuto nella metà superiore della vista di SettingsViewController, iOS lo rileverà e riaprirà invece la vista MapViewController s.

Riepilogo: posiziona il contenuto solo nella metà inferiore della nuova visualizzazione. iOS lo capirà.

(non credo che questo è documentato da nessuna parte, mi spiace.)

+0

Sebbene la tua risposta possa essere utile, ciò che stai descrivendo è solo il comportamento normale di "UIModalTransitionStylePartialCurl". Il problema @ caecus318 deve essere dovuto a tenere una barra nella parte inferiore della vista senza animazione e tornare allo stato originale. – cprcrack

+0

Aha, la domanda non ha mai avuto senso fino a quando non l'hai spiegata. Ho modificato la mia risposta. (È utile, quindi non voglio cancellarlo.) –

0

Credo che l'applicazione Mappe di Apple utilizza le transizioni irregolari: mapCurl e mapUncurl. Non sono sicuro che ci sia un modo per fare esattamente ciò che vuole caecus314 (che è anche l'effetto che ho cercato di duplicare).

UIModalTransitionStylePartialCurl sarà rannicchiarsi tutta la parte inferiore del primo punto di vista, tra cui la barra degli strumenti, che è a differenza di Apple Maps app, che arriccia solo fino la mappa e lascia la barra degli strumenti in atto.

Per quanto posso dire, non c'è modo di accartocciare la mappa.

+0

Ovviamente c'è un modo, infatti l'utente che ha posto la domanda ti sta dicendo la procedura per realizzarlo. Hai letto la domanda, almeno? La parte in cui si dice: "Posso ottenere questa sottoview per riprendermi. È grandioso!" È davvero fastidioso dover gestire risposte non reali da parte di persone che non hanno nemmeno letto attentamente le domande. Mi dispiace ma dovevo dirlo. – cprcrack

0

l'override del metodo viewWillDisappear del vostro underMapViewController con qualcosa di simile:

- (void)viewWillDisappear:(BOOL)animated 
{ 
    curlableMapViewController.view.frame = CGRectMake(0.f, 0.f, 320.f, 416.f); 

    [super viewWillDisappear:animated]; 
} 

che corregge la dimensione della vista del curlableMapViewController al formato sapere si specifica, che si potrebbe risparmiare in precedenza nel metodo viewWillAppear, per esempio.