0

UICollectionViewにはセルがほとんどなく、回転すると行と列の数が変わります。私はこれでこれを達成することができます:向き変更時のコレクションビューのセルレイアウトを適切に管理する

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, 
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize 
{ 
    if UIDevice.currentDevice().orientation.isPortrait.boolValue{ 
     return CGSizeMake((collectionView.frame.size.width-2)/2, (collectionView.frame.size.height - 4)/3) 
    } 
    else{ 
     return CGSizeMake((collectionView.frame.size.width-4)/3, (collectionView.frame.size.height - 4)/3) 
    } 
} 

デバイスが回転するまでは、すべてうまくいきました。回転のために、私はこの

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { 
    myCollectionView!.reloadData() 
} 

などのコレクションビューを再読み込みしている最終的な結果は、thisのように見えます。(悪いGIFのため申し訳ありませんが)

細胞の所望の数が達成されます。しかし、あなたがリンクから見ることができるように、短時間の間、回転が起こったときに気付くギャップがあります。この効果は望ましくない。 UICollectionViewを何度も何度もロードし続けてレイアウトを修正するのは悪いことです。私は欲しいものを達成することができますが、適切な方法で達成することはできません。いくつかの専門家のアイデアが評価されます。ここで

答えて

0

は、あなたがUICollectionViewFlowLayoutを持っていると仮定ソリューションです:

まず、あなたのViewControllerにこれを追加します。

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ResultsCollectionViewController.orientationDidChange(_:)), name: UIDeviceOrientationDidChangeNotification, object: nil) 

はVCが閉じているときに自己を削除することを忘れないでください:

deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
} 

次に、セレクタメソッドを実装します。

func orientationDidChange(notification: NSNotification) { 
    collectionView!.collectionViewLayout.invalidateLayout() 
} 

基本的に、デバイスの向きが変更されたときに通知を送信するだけで、セレクタはレイアウトを無効にしてリフレッシュされます。

編集:ここでは

は、基本的なUICollectionViewFlowLayout設定方法です:

func setupCollectionViewLayout(minimumInteritemSpacing minimumInteritemSpacing: CGFloat, minimumLineSpacing: CGFloat) { 
    let layout = UICollectionViewFlowLayout() 
    layout.minimumInteritemSpacing = minimumInteritemSpacing 
    layout.minimumLineSpacing = minimumLineSpacing 
    collectionView?.collectionViewLayout = layout 
} 

その後のviewDidLoadに、あなたが呼び出すことができます。

// Setup a layout 
setupCollectionViewLayout(minimumInteritemSpacing: 0, minimumLineSpacing: 0) 

をごUICollectionViewDelegateFlowLayoutを使用したい場合には、以下のテンプレートを使うことができますが、それを適応させる必要があることに注意してください!

// ---------------------------------------------------------------------------------- 
// MARK: - UICollectionViewDelegateFlowLayout 
// ---------------------------------------------------------------------------------- 

extension ResultsCollectionViewController: UICollectionViewDelegateFlowLayout { 

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 

    switch UIDevice.currentDevice().userInterfaceIdiom { 
    case .Phone: 
     return CGSize(width: self.view.frame.width, height: 100.0) 
    case .Pad: 
     return CGSize(width: self.view.frame.width/2.0, height: 100.0) 
    default: 
     return CGSize(width: self.view.frame.width, height: 100.0) 
    } 


} 

}

+0

私はUICollectionViewFlowLayoutを持っていません。 UICollectionViewの 'collectionViewLayout'デリゲートメソッドを実装しました。その通知は 'didRotateFromInterfaceOrientation'と全く同じです。そしてcollectionView!.collectionViewLayout.invalidateLayout() は私のためには機能しませんでした。 UICollectionViewFlowLayoutをどのように保守したかをコードで共有することができますか? –

+0

このcollectionViewLayoutは、向きに応じて行数と列数を変更しないと確信しています。私はこれが私が探しているものではない細胞のための固定CGSizeを提供すると思う。 –

関連する問題