2013-08-27 17 views
31

Ho un UICollectionView nello storyboard basato su iOS. Quando il dispositivo è in orientamento verticale, mi piacerebbe farlo scorrere verticalmente, e quando è in Landscaper mi piacerebbe che scorresse orizzontalmente.Come posso modificare la direzione di scorrimento in UICollectionView?

In UICollectionView è possibile vedere lo scrollEnabled membro, ma non vedo alcun modo per impostare la direzione di scorrimento. Ho perso qualcosa?

risposta

51
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init]; 
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; 

Nota anche che sembra essere fine a chiamare questo in prepareForLayout nel layout flusso ...

@interface LayoutHorizontalThings : UICollectionViewFlowLayout 
@end 

@implementation LayoutHorizontalBooks 
-(void)prepareLayout 
    { 
    [super prepareLayout]; 

    self.scrollDirection = UICollectionViewScrollDirectionHorizontal; 

    self.minimumInteritemSpacing = 0; 
    self.minimumLineSpacing = 0; 
    self.itemSize = CGSizeMake(110,130); 
    self.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0); 
    } 
+0

Per dichiarare questo codice in viewdidload(); – user3040186

+1

http://adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial/ – user3040186

+0

Sto riscontrando problemi con questo, in cui PreplyLayout viene intermittentemente non chiamato abbastanza presto o chiamato troppo tardi. I risultati sono una delle 3 cose: 1) orizzontaleSizeClass non è ancora cambiato e la direzione di scorrimento è impostata in modo errato 2) scrollingDirection è impostato correttamente ma è troppo tardi e non ha effetto e 3) tutto si allinea correttamente e la direzione di scorrimento effettivamente ha effetto come desiderato. Sembra che Apple intenda che la direzione dello scorrimento sia gestita nel controller della vista anziché nel layout. – BTRUE

9

Impostare scrollDirection della vista raccolta collectionViewLayout.

Docs sono here.

+2

Questo vale solo se si sta utilizzando un 'UICollectionViewFlowLayout'. –

+2

Grazie a @Mundi, come sai questa roba? Ad ogni modo, alcuni codice questo per le mie note: 'se lasciare flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {flowLayout.scrollDirection = .Horizontal} ' –

9

Si dovrebbe provare questo:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{ 

    UICollectionViewFlowLayout *layout = (UICollectionViewFlowLayout *)[self.collectionView collectionViewLayout]; 

    if ((toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) || (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft)){ 
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 
    } 
    else{ 
    layout.scrollDirection = UICollectionViewScrollDirectionVertical; 
    } 
} 

In Swift:

override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) { 

    var layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout 

    if ((toInterfaceOrientation == UIInterfaceOrientation.LandscapeLeft) || (toInterfaceOrientation == UIInterfaceOrientation.LandscapeRight)){ 

     layout.scrollDirection = UICollectionViewScrollDirection.Vertical 
    } 
    else{ 
     layout.scrollDirection = UICollectionViewScrollDirection.Horizontal 
    } 

} 
1

Complimenti a Mundi e Dan Rosenstark per la loro risposta, ecco la versione 3 rapida.

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { 
    flowLayout.scrollDirection = .horizontal 
} 
0

Fatelo nello storyboard. Dall'ispettore dell'identità e seleziona la direzione e dai la tua direzione. enter image description here

0

Swift 4

if let layout = collectionViewObj.collectionViewLayout as? UICollectionViewFlowLayout { 
     layout.scrollDirection = .vertical // .horizontal 
    } 
Problemi correlati