6

Sto costruendo una tipica app Xcode 6 per iOS.Xcode XIB: come implementare ScrollView o PageControl per scorrere sotto-viste?

Il mio obiettivo è:

  • Uno schermo che ha una sotto-area che può essere strisciato per modificare il contenuto.

  • Ad esempio, la schermata iniziale ha un'immagine del logo, un'area centrale che desidero essere trascinabile e un pulsante in basso.

  • Quando l'utente fa scorrere (o tocca) l'area centrale, l'area mostra le informazioni successive (o precedenti), che è una tipica didascalia UIImage e UILabel.

  • Il resto dello schermo rimane lo stesso, vale a dire non vi è alcuna modifica di navigazione.

Il codice è here. Utilizza i consigli del post StackOverflow here.

La mia domanda: come posso implementare meglio il codice riportato sotto, mentre utilizzo ancora un XIB?

mio attuale implementazione funziona, e usa questo approccio ...

Un tipico Swift Demo.swift file che è un UIViewController che ha:

  • la pagina indice, min e max
  • outlets per PageControl, UIImageView e UILabel
  • azioni per il cambio di controllo della pagina e lo scorrimento dell'immagine o toccare

Un tipico file di Demo.xib che ha:

  • un UIViewController tipica per l'intero schermo
  • un UIImageView e UILabel per l'immagine mutevole e didascalia
  • un PageControl per indicare quale pagina esercitazione l'utente è la visualizzazione

Sto cercando modi migliori per realizzare questo; Ho letto molti tutorial su Xcode e finora nessuno sembra definitivo per Xcode 6, XIBs e Swift.

Qui ci sono alcune implementazioni che ho ricercato che sembrano promettenti ...

c'è un modo per implementare una zona visualizzazione secondaria nella XIB?

  • Ad esempio, Xocde può mostrare XIB con un'area rettangolare destinata al contenuto modificabile?

Esiste un modo idiomatico di scrivere il codice per i contenuti modificabili?

  • Ad esempio, utilizzando un ScrollView, forse che contiene un UIPageViewController?

C'è un modo per rendere un oggetto PageIBontrol XIB abbastanza grande da coprire l'intero UIImageView e UILabel, così posso saltare rendendo UIImageView a rispondere ai gesti.

  • Nella mia Xcode, il PageControl sembra avere un'altezza non modificabile che è sempre 37.

La generosità sarà per la consulenza di esperti.

risposta

2

Per rendere UIPageViewController, è possibile implementare il protocollo UIPageViewControllerDataSource e fornire un controller di visualizzazione per i metodi pageViewController(pageViewController:viewControllerBeforeViewController) -> UIViewController? e ...viewControllerAfterViewController).

Fornisce un controller di visualizzazione personalizzato per ogni pagina che presenta un'immagine e un'etichetta e le assume come proprietà in modo da poterle fornire da PageViewController.

mio trucco per creare un metodo che crea una nuova istanza View Controller in questi metodi:

// MARK:- UIPageViewControllerDataSource 

extension MyPageViewController: UIPageViewControllerDataSource { 

    func viewControllerWithIndex(var index: Int) -> UIViewController! { 
    let viewController = storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as! MyViewController // This VC has to be in the storyboard, otherwise just use MyVC() 

    // Adjust the index to be cyclical, not required 
    if let count = data?.endIndex { 
     if count == 1 && index != 0 { return nil } 
     if index < 0 { index += count } 
     index %= count 
    } 

    viewController.view.tag = index 
    viewController.record = data?[index] 

    return viewController 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
    let index = viewController.view?.tag ?? 0 
    return viewControllerWithIndex(index + 1) 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    let index = viewController.view?.tag ?? 0 
    return viewControllerWithIndex(index - 1) 
    } 

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return countAndSetupPageControl() 
    } 

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return viewController?.view.tag ?? 0 
    } 
} 

Ora per la "sottozona" è necessario implementare un ChildViewController. Se stai usando gli storyboard puoi semplicemente trascinare un Container View e inserire PageViewController nel controller di visualizzazione incorporato, altrimenti devi aggiungere lo PageViewController.view come sottoview e impostare il valore frame al centro.

È possibile trovare maggiori informazioni nella apple documentation ma fondamentalmente è necessario chiamare questi metodi:

addChildViewController(pageViewController) 
view.addSubView(pageViewController.view) 
pageViewController.view.frame = ... // This is your "sub-area" 
pageViewController.didMoveToParentViewController(self) 
+1

Grazie! Mi piace soprattutto il modo in cui istanziate il controller della vista in base alle vostre esigenze. – joelparkerhenderson

1

Se si aggiunge un vincolo di altezza a PageControl, è possibile impostare l'altezza su ciò che si desidera.

Non vedo alcun problema con l'implementazione corrente. Cambiarlo per usare PageViewController sarebbe molto più utile.

Se fossi in te vorrei aggiungere un'animazione in funzione pageUpdate modo che l'immagine sarebbe fade in o scivolare in ...

E avrebbe senso solo per utilizzare una PageViewController se si vuole essere in grado di scorrere fino a la pagina successiva (come nel contenuto che si muove nello stesso tempo in cui il dito si muove sullo schermo). Ed è possibile utilizzare un PageViewController o un CollectionView con il paging abilitato.

Problemi correlati