2013-08-27 13 views
31

Mam UICollectionView w mojej aplikacji opartej na zestawie scenariuszy z aplikacją iOS. Gdy urządzenie znajduje się w orientacji pionowej, chciałbym, aby przewijało się w pionie, a kiedy jest w Ogrodniku, chciałbym, aby przewijało się poziomo.Jak zmienić kierunek przewijania w UICollectionView?

W widoku UICollectionView widzę element scrollEnabled, ale nie widzę możliwości ustawienia kierunku przewijania. Czy coś przeoczyłem?

Odpowiedz

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

Uwaga też, że wydaje się być w porządku, aby nazwać to w prepareForLayout w układzie przepływowym ...

@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

Aby zadeklarować ten kod w viewdidload(); – user3040186

+1

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

+0

Widzę problemy z tym, gdzie prepareLayout jest sporadycznie niewystarczająco wcześnie wywoływane lub wywoływane zbyt późno. Rezultaty są jedną z trzech rzeczy: 1) horizontalSizeClass nie zmieniła się jeszcze, a kierunek przewijania jest ustawiony nieprawidłowo 2) ScrollingDirection jest ustawiony prawidłowo, ale jest za późno i nie działa, a 3) wszystko się zgadza i kierunek przewijania faktycznie działa zgodnie z życzeniem. Wygląda na to, że Apple zamierza zmienić kierunek przewijania w kontrolerze widoku, a nie w układzie. – BTRUE

9

Ustaw scrollDirection z widoku kolekcji collectionViewLayout.

Dokumenty są następujące: here.

+2

Dotyczy to tylko wtedy, gdy używasz 'UICollectionViewFlowLayout'. –

+2

Dzięki @Mundi, skąd znasz te rzeczy? W każdym razie, niektórzy kodują to dla moich własnych notatek: 'if let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout {flowLayout.scrollDirection = .Horizontal} ' –

9

Należy spróbować tego:

- (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; 
    } 
} 

W 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

Kudos dla Mundi i Dana Rosenstarka za odpowiedź, oto szybka wersja 3.

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

Zrób to w swoim scenopisie. Od inspektora tożsamości i wybierz kierunek i podaj kierunek. enter image description here

0

Swift 4

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