2013-08-27 70 views
31

我有一個UICollectionView在我的故事板iOS應用程序。 當設備處於縱向方向時,我希望它垂直滾動,當它在Landscaper中時,我希望它水平滾動。如何更改UICollectionView中的滾動方向?

在UICollectionView我可以看到scrollEnabled成員,但我看不到設置滾動方向。我錯過了什麼嗎?

回答

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

注意過,這似乎是罰款,在您的流式佈局prepareForLayout調用這個...

@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

在viewdidload()中聲明這段代碼; – user3040186

+1

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

+0

我看到了這個問題,其中prepareLayout間歇性地不夠及時地調用或調用太遲。結果是3件事情之一:1)horizo​​ntalSizeClass尚未更改,滾動方向設置不正確2)scrollingDirection設置正確,但已爲時過晚並且不起作用,3)所有內容都正確排列並且滾動方向實際上根據需要生效。看起來也許蘋果計劃在視圖控制器中管理滾動方向而不是佈局。 – BTRUE

9

設置集合視圖的collectionViewLayoutscrollDirection

文檔是here

+2

這僅如果您使用的是'UICollectionViewFlowLayout'適用。 –

+2

謝謝@Mundi,你怎麼知道這個東西?無論如何,一些代碼爲我自己的筆記:'如果讓flowLayout = collectionViewLayout爲? UICollectionViewFlowLayout {flowLayout.scrollDirection = .Horizo​​ntal}' –

9

你應該試試這個:

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

在斯威夫特:

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

對Mundi和Dan Rosenstark的回答爲他們的答案,這裏是swift 3版本。

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

在你的故事板中做到這一點。從身份檢查員和選擇方向,並給你的方向。 enter image description here

0

斯威夫特4

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