如何从项目中的文件夹中将图像添加到collectionview?

时间:2016-12-16 10:26:47

标签: ios swift image uicollectionview load

我想询问是否有办法将图像添加到资源组中文件夹的单元格中。

我有很多类别..对于每个类别:“Barvy”,“Budovy”里面有.jpg图像。

enter image description here

我需要一个带有这些组名称的集合视图,点击单元格后我需要在文件夹中显示所有图像,例如..我的应用程序加载,我可以看到4个单元格,每个都有标题:Barvy,Budovy,Bytove_doplnky, Casove_pasmo ..点击单元格后,它将从文件夹中加载图像

3 个答案:

答案 0 :(得分:1)

您的图像在捆绑文件中,因此您可以直接使用图像名称[UIImage imagedNamed : @"<name.png>"]来使用图像。您有包含多个图像的文件夹,以便显示这些图像:

为所有四个文件夹创建包含此图像名称的数组,如NSArray *arrBravy = @[@"Bravy_cool.png", @"Bravy_angry.png" ... ];。并在collectionView

cell.imgView.image = arrImages[indexPath.row];

arrImages  = arrBravy or arrBudovy... etc , as per the condition user clicked on which option.

但正如你所说,你有许多文件夹,所以你不能管理多个数组,所以为了解决这个问题,你制作一个json文件并将其添加到你的包中。现在对此json文件应用序列化,您将获得所有文件的列表名称。

json文件的建议模式:

 {
      {
               "folderName": "Bravy",
            "imgList": [ "Bravy_cool", "Bravy_angry", "Bravy_OK"]

      },
      {
             "folderName": "Budovy",
            "imgList": [ "Budovy_kiss", "Budovy_sleep", "Budovy_cry"]

      }
    } 

我刚给你两个文件夹名称的例子,你可以将它扩展到你的使用。保持json是解决此类问题的最佳方法。

如何与JSON交易

获取json数据:

NSArray *arrJson = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e];

为图像分配Json

//userSelectedString is string which notifes user selected which folder

for(int i= 0; i< arrJson.count: i++){
  if(arrJson[i][@"folderName"] == @"userSelectedString"){
    arrImages = arrJson[i][@"imgList"];
  }
}

在collectionview ItemFor Row中

cell.imgView.image = arrImage[indexPath.row];

如果您有XML,那就没关系!你可以像json数据一样处理xml,但有点不同。

  1. 如果您想要获取XML文件,请参阅本教程:https://www.raywenderlich.com/725/xml-tutorial-for-ios-how-to-read-and-write-xml-documents-with-gdataxml

  2. 如果您想将XML转换为Json,请使用此在线转换器并下载您的文件:http://www.utilities-online.info/xmltojson/#.WFTDfuZ97IU

  3. 如何在UICOLLECTIONVIEW中显示图像

    首先写下这个

    @interface myViewController : UIViewController {
    
        //BOOL isFolderSelected;
        NSMutableArray *arrMutImages;
    }
    
    ViewDidLoad

    中的

    arrMutImages = [NSMutableArray New];
        [arrMutImages addObject:[self getFolderNames]];
    

    制作新方法

    - (NSMutableArray *) getFolderNames{
        NSMutableArray *arrMutfetchImage = [NSMutableArray New];
        for(int i=0 ; i < arrJson.count ; i++){
           [arrMutfetchImage addObject:arrayJson[i][@"folderName"]]
        }
    
        return arrMutfetchImage;
    }
    
    numberOfItemsInSection

    中的

    return arrMutImages.count;
    
    cellforrowatindexpath

    中的

    imageView.image = [UIImage imageNamed: arrMutImages[indexPath.row]];
    
    didSelectItemAtIndexPath

    中的

    [arrMutImages removeAllObjects];
    [arrMutImages addObject:arrayJson[indexPath.row][@"ImgList"]];
    [collectionView reloadData];
    

    如果有任何按钮从图像列表切换到文件夹,则在按钮操作中写下代码

    [arrMutImages removeAllObjects];
    [arrMutImages addObject:[self getFolderNames]];
    [collectionView reloadData];
    

答案 1 :(得分:0)

首先按升序重命名所有组的图像以及像'Barvy_0.jpg'这样的组名等等。

然后声明一个空白字符串,如:

var image_name:String = ""

然后在按钮点击时将image_name设置为组名称,例如在Barvy按钮上单击:

image_name = "Barvy"

在collectionview中:

cell.imageview.image = UIImage(named:"\(image_name)\(indexPath.row).png")!

答案 2 :(得分:0)

这就是我解决显示前两组图像的方法

我写了一个json文件并将他添加到我的项目中

{
    "Barvy": [ "Bila.jpg", "Cerna.jpg", "Cervena.jpg",
               "Fialova.jpg", "Hneda.jpg", "Modra.jpg",
               "Oranzova.jpg", "Zelena.jpg", "Zluta.jpg"],

    "Budovy": [ "Budova.jpg", "Cirkus.jpg", "Domov.jpg",
                "Dum.jpg", "Kostel.jpg", "Nemocnice.jpg",
                "Obchod.jpg", "Restaurace.jpg", "Skola.jpg"]
}

然后

    var arrImages = [String]()
    let dataUrl = Bundle.main.url(forResource: "test", withExtension: "json")


    override func viewDidLoad() {
    super.viewDidLoad()

    collectionView.dataSource = self
    collectionView.delegate = self

    let jsonData = try! Data(contentsOf: dataUrl!)

    do {

        if let arrJson = try JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers)
        as? Dictionary<String, AnyObject> {

            if let barvy = arrJson["Barvy"] as? [String] {
                arrImages = barvy
            }

            if let budovy = arrJson["Budovy"] as? [String] {
                arrImages += budovy
            }

        }
    } catch {
        print(error)
    }

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TestCell", for: indexPath) as? Cell {
        cell.imgView.image = UIImage(named: "\(arrImages[indexPath.row])")
        return cell
    }
    return UICollectionViewCell()
}

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

最后,前两组的图像显示在collectionView中.. 当我弄清楚如何首先只显示类别名称和点击显示图像时,我会更新答案。