1

私はプログラムでUICollectionViewを作成する方法を学習しています。私は、アプリケーションの別の部分でユーザーから収集された写真のグリッドを作成したい。 このサンプルコードは、これを達成するのに役立ちますか?また、私が望むイメージを放出するようにデータを設定するにはどうしたらいいですか?私のイメージファイルは下に示されているので、UICollectionViewのソースコードもあります。プログラムでUICollectionViewを作成する

UICollectionView:

class PhotosViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource { 
override func viewDidLoad() { 
    super.viewDidLoad() 
    let imageStore = ImageStore() 
} 

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 

    let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout() 
    layout.sectionInset = UIEdgeInsets(top: 20, left: 10, bottom: 10, right: 10) 
    layout.itemSize = CGSize(width: 100, height: 100) 

    let myCollectionView:UICollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout) 
    myCollectionView.dataSource = self 
    myCollectionView.delegate = self 
    myCollectionView.registerClass(RDCellCollectionViewCell.self, forCellWithReuseIdentifier: "MyCell") 
    myCollectionView.backgroundColor = UIColor.whiteColor() 
    self.view.addSubview(myCollectionView) 
} 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return images.count 
} 

var images: [UIImage] = [ 

] 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let myCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) as! RDCellCollectionViewCell 
    myCell.imageView.image = images[indexPath.item] 
    myCell.backgroundColor = UIColor.grayColor() 
    return myCell 
} 

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) 
{ 
    print("User tapped on item \(indexPath.row)") 
} 


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

}

ImageStore.Swift:

class ImageStore: NSObject { 

let cache = NSCache() 

func setImage(image: UIImage, forKey key: String) { 
    cache.setObject(image, forKey: key) 

    let imageURL = imageURLForKey(key) 

    if let data = UIImageJPEGRepresentation(image, 0.5) { 
     data.writeToURL(imageURL, atomically: true) 
    } 
} 
func imageForKey(key: String) -> UIImage? { 
    if let existingImage = cache.objectForKey(key) as? UIImage { 
     return existingImage 
    } 

    let imageURL = imageURLForKey(key) 
    guard let imageFromDisk = UIImage(contentsOfFile: imageURL.path!) else { 
     return nil 
    } 

    cache.setObject(imageFromDisk, forKey: key) 
    return imageFromDisk 
} 

func deleteImageForKey(key: String) { 
    cache.removeObjectForKey(key) 

    let imageURL = imageURLForKey(key) 
    do { 
     try NSFileManager.defaultManager().removeItemAtURL(imageURL) 
    } 
    catch let deleteError { 
     print("Error removing the image from disk: \(deleteError)") 
    } 
} 

func imageURLForKey(key: String) -> NSURL { 
    let documentsDirectories = 
    NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) 
    let documentDirectory = documentsDirectories.first! 

    return documentDirectory.URLByAppendingPathComponent(key) 
} 

}

答えて

0

あなたは正しい軌道に乗っています。 UIImageViewを含むUICollectionViewCellのサブクラスを作成する必要があります。これにより、正しいUIImageをcellForItemAtIndexPathに挿入することができます。

これは、カスタムセルをフックする方法について説明します。 Create UICollectionViewCell programmatically without nib or storyboard

項目番号が対応するように、正しい画像を取得するために、あなたが、何とか自分のイメージストアにインデックスパスをマップする必要がありますと正しい画像キー。

let myCell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCell", forIndexPath: indexPath) 
myCell.backgroundColor = UIColor.blueColor() 
let imageView = UIImageView(frame: cell.contentView.frame) 
cell.contentView.addSubview(imageView) 
imageView.image = //Here you should get right UIImage like ImageStore().imageForKey("YOUR_KEY") 
return myCell 

するか、ジョシュアカーデンが書いたように、カスタムUICollectionViewCellサブクラスを使用することができます。

+0

リンクした質問を確認しました。私はこれに新しく、まだ非常に混乱しています。私はサブクラスに何を入れるのですか?アプリケーションの目的は、ユーザーがアプリの別の部分にアップロードした写真のUICollectionViewを作成することです。 – Allie

+0

サブクラスにはUIImageViewが含まれます。あなたのサブクラスはUIImageViewをコンテンツビューのサブビューとして追加します。また、UIImageViewのサイズを指定する必要があります。次に、cellForRowAtIndexPathで、適切なUIImageをセルのUIImageViewに接続します。 –

+0

このチュートリアルはかなりうまく見えます:https://randexdev.com/2014/08/uicollectionviewcell/ –

0

タスクは、画像を追加する場合は、cellForItemAtIndexPathにこのようなものを使用する必要があります。

+0

私はそれを追加する前にイメージビューの存在を確認したいと思います。そうしないと、(セルが潜在的に再利用されるため)画像ビューの上に画像ビューを追加することができなくなります。 –

関連する問題