2017-02-20 4 views
1

でサイズのセルを、私はsomeObjの値にもよるが異なるアスペクト比を持つように私の細胞を希望どのようにGridViewの

class ListViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout{ 

private var collection: ACollection? 
private var collectionViewLayout:UICollectionViewFlowLayout? 


override func loadView() { 
    super.loadView() 

    collectionViewLayout = UICollectionViewFlowLayout() 
    collectionViewLayout?.itemSize.width = 128 
    collectionViewLayout?.itemSize.height = 227 
    view = UICollectionView(frame: CGRect.zero, collectionViewLayout: collectionViewLayout!) 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let someObj: SomeObj = collection!.getObject(index: indexPath.item) 
    let cell: UICollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: NSStringFromClass(UICollectionViewCell.self), for: indexPath as IndexPath) 
    let cellView: UIImageView = UIImageView(image: object.image) 

    cellView.frame = cell.bounds 
    cell.contentView.addSubview(cellView) 
    return cell 
} 

次のようになりますgridlistを持っています。それらを重ならないでどのようにセルのサイズを変更できますか?私はしようとしました

cellView.frame = CGRect(x:0,y:0,width:100,height:300) 
cellView.frame =cell.bounds 

しかし、細胞が重なっています。

+0

'UICollectionViewDelegateFlowLayout'に' collectionView(、layout:sizeForItemAt:) '関数を実装するべきだと思います。フローレイアウトを使用しているようです。 – sCha

+0

@sChaそれはいくらか動作します。私が見ているのは、サイズを変更すると古いサイズのセルを描画し、別のサイズのセルを上に描画することです。 – user2175783

答えて

1

多分、この問題についてもう少し詳しく説明します。

まず、あなたがcollectionView(_:layout:sizeForItemAt:)メソッドを実装する場合、次の項目を指定する必要はありません。

collectionViewLayout?.itemSize.width = 128 
collectionViewLayout?.itemSize.height = 227 

すべてのセルのデフォルトのサイズです。

第2に、すべてのデフォルトセルの上部に表示されるオーバーラップは、再利用されたセルに追加する可能性のあるcellViewUIImageView秒)です。問題は、デリゲートがセルを要求するたびに、現在のセルにUIImageViewを追加しようとしていることです。前に追加した画像ビューを持っていても、セル全体が再利用されている可能性があるので、UIImageViewが既に存在するかどうかを確認する必要があります。

+0

UIImageViewが既に存在するかどうかを確認するにはどうすればよいですか? – user2175783

+1

@ user2175783ビューにタグを追加し、 'viewWithTag'メソッドでそれを参照するか、カスタムセルを定義して、必要なすべてのサブビューが付属するようにすることができます。私は個人的に2番目のオプションをお勧めしますが、最初のオプションははるかに簡単な方法です。 – sCha

関連する問題