2016-04-27 50 views
16

UICollectionView(flowlayout)を使用して簡単なレイアウトを作成しました。 各セルの幅は、self.view.frame.widthSwift:デバイスの回転後にUICollectionViewレイアウトをリフレッシュする方法

を使用して設定しますが、デバイスを回転するとセルは更新されません。

enter image description here

私は、姿勢変更時に呼び出される関数、発見した:私は、メインのコードがあるUICollectionViewレイアウト

を更新する方法を見つけることができません

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

けどをここに:

class ViewController: UIViewController , UICollectionViewDelegate , UICollectionViewDataSource , UICollectionViewDelegateFlowLayout{ 

    @IBOutlet weak var myCollection: UICollectionView! 

    var numOfItemsInSecOne: Int! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     numOfItemsInSecOne = 8 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

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

     //print("orientation Changed") 
    } 

    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
     return 1 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return numOfItemsInSecOne 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellO", forIndexPath: indexPath) 

     return cell 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{ 
    let itemSize = CGSize(width: self.view.frame.width, height: 100) 
    return itemSize 
    }} 

答えて

13

この機能を追加します。

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    myCollection.collectionViewLayout.invalidateLayout() 
} 

方向を変更すると、この関数が呼び出されます。

+0

おかげでしょうか?どのようにreloadDataを呼び出すと思いますか? –

+2

UICollectionViewControllerにはすでに 'collectionView'プロパティがあります。それらを 'collectionView.reloadData()'に編集するだけです。それが動作します。 – Khuong

+2

ビューを再読み込みする必要があるので、単にレイアウトの更新をトリガーすることはできません。 – Rivera

1

あなたはより良いオプションは、それが細胞のレクリエーションを強制しないので、パフォーマンスがわずかに良くなるのでinvalidateLayout()の代わりreloadData()を呼び出すことです

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
    if isLandscape { 
     return CGSizeMake(yourLandscapeWidth, yourLandscapeHeight) 
    } 
    else { 
     return CGSizeMake(yourNonLandscapeWidth, yourNonLandscapeHeight) 
    } 
} 
27

を使用してUICollectionViewレイアウトを更新することができます。

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    myCollection.collectionViewLayout.invalidateLayout() 
} 
+0

これは正しい方法です。これは受け入れられた答えでなければなりません。 – thesummersign

+0

これは正しい方法です..リロードデータではありません。 –

+3

私のために圧倒されました。 viewDidLayoutSubviews関数でprintステートメントを実行すると、無限ループが認識されます。 – nyxee

3

また、この方法で無効にすることもできます。

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    [self.collectionView.collectionViewLayout invalidateLayout]; 
} 
0

UICollectionViewLayouttraitCollectionDidChange方法は、同様に使用される可能性があります更新する:

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { 
    super.traitCollectionDidChange(previousTraitCollection) 

    guard let previousTraitCollection = previousTraitCollections else { 
     return 
    } 
    collectionView?.collectionViewLayout.invalidateLayout() 
} 
0

viewWillLayoutSubviewsは()私のために動作しませんでした。 viewDidLayoutSubviews()もどちらもしませんでした。両方とも、アプリを印刷コマンドを使ってチェックした無限ループに入りました。

作業を行う方法の一つは、私は私のcollectionviewのないオブジェクトを持っていない、と私はUICollectionViewControllerを持っている場合、どのようなkhuong291 @

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
// Reload here 
} 
関連する問題