Cómo hacer una colección simple vista con Swift

Estoy tratando de aprender a usar UICollectionView. El documentación es un poco difícil de entender y los tutoriales que he encontrado estaban en Objective C o largo proyectos complicados.

Cuando yo estaba aprendiendo a usar UITableView, Nos ❤ Swift Cómo hacer un sencillo formato tableview con iOS 8 y Swift tenido una muy básicos de instalación y explicación de hacerme ir. No hay nada como esto para UICollectionView?

La respuesta de abajo es mi intento de aprender a hacerlo.

InformationsquelleAutor Suragch | 2015-07-30

5 Kommentare

  1. 480

    Este proyecto ha sido probado con Xcode 10 y Swift 4.2.

    Crear un nuevo proyecto

    Puede ser sólo un punto de Vista Único de la Aplicación.

    Agregue el código

    Crear un nuevo Cocoa Touch Clase de archivo (File > Nuevo > Archivo… > iOS > Cocoa Touch Clase). Nombre MyCollectionViewCell. Esta clase contendrá los puntos de venta los puntos de vista que puede agregar a su celda en el guión gráfico.

    import UIKit
    class MyCollectionViewCell: UICollectionViewCell {
    
        @IBOutlet weak var myLabel: UILabel!
    }

    Vamos a conectar esta salida más tarde.

    Abrir ViewController.swift y asegúrese de que tiene el siguiente contenido:

    import UIKit
    class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    
        let reuseIdentifier = "cell" //also enter this string as the cell identifier in the storyboard
        var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47", "48"]
    
    
        //MARK: - UICollectionViewDataSource protocol
    
        //tell the collection view how many cells to make
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return self.items.count
        }
    
        //make a cell for each cell index path
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
            //get a reference to our storyboard cell
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell
    
            //Use the outlet in our custom class to get a reference to the UILabel in the cell
            cell.myLabel.text = self.items[indexPath.item]
            cell.backgroundColor = UIColor.cyan //make cell more visible in our example project
    
            return cell
        }
    
        //MARK: - UICollectionViewDelegate protocol
    
        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            //handle tap events
            print("You selected cell #\(indexPath.item)!")
        }
    }

    Notas

    • UICollectionViewDataSource y UICollectionViewDelegate son los protocolos que la vista de colección de la siguiente manera. Usted puede también agregar el UICollectionViewFlowLayout protocolo para cambiar el tamaño de los puntos de vista mediante programación, pero no es necesario.
    • Sólo estamos poniendo cadenas simples en nuestra red, pero sin duda puedes hacer imágenes más tarde.

    Instalación del guión gráfico

    Arrastre una Vista de Colección a la Vista Controlador en su guión. Usted puede agregar restricciones a hacer es llenar la de los padres ver si te gusta.

    Cómo hacer una colección simple vista con Swift

    Asegúrese de que sus valores predeterminados en el Atributo Inspector también

    • Elementos: 1
    • Diseño: Flujo De

    La pequeña caja en la parte superior izquierda de la Vista de Colección es una Colección de Células. Vamos a utilizar como nuestro prototipo de celda. Arrastrar una Etiqueta en la célula y el centro de la misma. Usted puede cambiar el tamaño de los bordes de la celda y agregar restricciones para el centro de la Etiqueta, si te gusta.

    Cómo hacer una colección simple vista con Swift

    Escribir «celda» (sin comillas) en el cuadro Identificador de los Atributos del Inspector de la Vista de Colección de la Célula. Tenga en cuenta que este es el mismo valor que let reuseIdentifier = "cell" en ViewController.swift.

    Cómo hacer una colección simple vista con Swift

    Y en la Identidad del Inspector de la celda, establecer el nombre de la clase a MyCollectionViewCell, nuestra clase personalizada que hemos hecho.

    Cómo hacer una colección simple vista con Swift

    Conectar las salidas

    • Gancho de la Etiqueta de la colección de células para myLabel en el MyCollectionViewCell clase. (Usted puede Control de arrastre.)
    • Gancho de la Vista de Colección delegate y dataSource a la Vista del Controlador. (Haga clic en Vista de Colección en el Esquema del Documento. A continuación, haga clic y arrastre el plus de flecha hasta la Vista Controlador.)

    Cómo hacer una colección simple vista con Swift

    Terminado

    Aquí es lo que parece después de la adición de restricciones a centro de la Etiqueta de la celda y la fijación de la Vista de Colección a las paredes de los padres.

    Cómo hacer una colección simple vista con Swift

    La Realización De Mejoras

    El ejemplo anterior funciona, pero es bastante feo. Aquí están algunas cosas que usted puede jugar con:

    Color de fondo

    En el Interface Builder, vaya a su Vista de Colección > Atributos del Inspector de > Ver > Fondo.

    Espaciado de celda

    Cambiar el espaciado mínimo entre las células a un valor más pequeño hace que se vea mejor. En el Interface Builder, vaya a su Vista de Colección > Tamaño de Inspector > Min Espaciado y hacer que los valores más pequeños. «Para las células» es la distancia horizontal y «líneas» es la distancia vertical.

    La forma de la célula

    Si quieres esquinas redondeadas, una frontera, y similares, se puede jugar con el celular layer. Aquí está el código de ejemplo. Pondría directamente después de cell.backgroundColor = UIColor.cyan en el código anterior.

    cell.layer.borderColor = UIColor.black.cgColor
    cell.layer.borderWidth = 1
    cell.layer.cornerRadius = 8

    Ver esta respuesta para otras cosas que usted puede hacer con la capa de la sombra, por ejemplo).

    Cambiar el color cuando se toca

    Hace que para una mejor experiencia de usuario cuando las células responder visualmente a los grifos. Una forma de lograr esto es para cambiar el color de fondo, mientras que la celda está siendo tocado. Para ello, agregue las siguientes dos métodos para su ViewController clase:

    //change background color when user touches cell
    func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        cell?.backgroundColor = UIColor.red
    }
    
    //change background color back when user releases touch
    func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        cell?.backgroundColor = UIColor.cyan
    }

    Aquí está el look actualizado:

    Cómo hacer una colección simple vista con Swift

    Más estudio

    UITableView versión de este P&Un

    • im que consigue celular.myLabel como nula y se estrellan. alguna idea de por qué? Estoy usando un diseño personalizado
    • Si usted no conectar la toma de control de arrastre de la etiqueta en el guión gráfico para la @IBOutlet para myLabel en el código, usted conseguiría un accidente como este.
    • si usted está utilizando el interface builder y la referencia de la celda utilizando una toma de corriente, no se registra la costumbre clase de células en el controlador. consulte este
    • usted dice: «el Gancho de la Etiqueta de la colección de células para myLabel en el MyCollectionViewCell clase» ¿cómo puedo añadir que como un gancho para otra clase? Estoy trabajando en el ViewController y no puedo ver donde para arrastrar la conexión
    • No utilice el Controlador de Vista. Seleccione el MyCollectionViewCell código de la clase. Control de arrastre de la etiqueta en el Interface builder para la myLabel toma de corriente en el código.
    • si UICollectionViewCell de salida es nula, entonces usted tiene que quitar self.collectionView.registerClass(MyCollectionViewCell.self, forCellWithReuseIdentifier: "Cell"). Si usted todavía tiene el problema de comprobar si reuseIdentifier es la misma en dequeueReusableCellWithReuseIdentifier y en el storyboard
    • Deseo que la documentación de Apple era tan fácil de leer como esta explicación
    • Recuerde que el valor predeterminado backgroundColor de UICollectionView es de color negro.
    • el color de fondo predeterminado para mí solía ser negro cuando yo estaba haciendo este proyecto en Xcode 7, pero más recientemente cuando he vuelto a probar el proyecto en Xcode 8, el defecto era de color blanco. De todos modos, cualquiera que sea el valor predeterminado es para usted, puede ser cambiado en el Interface Builder o en el código.
    • Es posible construir una estática de recolección de vista totalmente en el Guión gráfico, similar a cómo puede crear una vista de tabla con contenido estático? Con contenido estático de la vista de tabla puede evitar por completo el uso de cellForRowAtIndexPath:, me preguntaba que es posible salir sin la aplicación de cellForItemAtIndexPath: para mi colección.
    • Nunca he hecho esto, y una encuesta de otras preguntas parece indicar que no es posible (ver aquí y aquí).
    • muchas gracias por esto! Pregunta: tengo una función dinámica de la creación de la matriz de datos… ¿cómo puedo llamar reloadData() para el uicollectionview desde mi función de datos?
    • No he estado trabajando con esto por un tiempo, así que no recuerdo muy bien. Mano yo diría que cargar los datos en un subproceso en segundo plano y cuando finaliza luego de la actualización de la interfaz de usuario con reloadData(). Lo que no funciona, trate de pedir una nueva pregunta.
    • Gracias @Suragch > stackoverflow.com/questions/44261236/…
    • Las células se repita si añadimos más de celdas visibles. E. g., si puedo añadir 1000 en la serie y tratar de carga en la vista de colección. Mientras que el desplazamiento de la vista de colección, las células se van a repetir. Sé que es debido a reutilizables identificador, si queremos mantener la dinámica de la reutilización de identificador, entonces tenemos que registrar todos los reutilización de los identificadores en viewDidLoad y también tenemos que separar cliente de células XIB de guión gráfico. Que parecen poco extraño y siento que no es un estándar. ¿Tenemos alguna alternativa a esa solución?
    • Quieres decir que has hecho el items matriz de ir de 1 a 1000 ( ["1", "2", ... "999", "1000"] ), pero se repitió en la primera pantalla de números (1~70 o así)? Voy a hacer una nota para volver a probar esta, pero si quieres una más rápida respuesta usted puede hacer una nueva pregunta sobre el Desbordamiento de la Pila.
    • Gracias por comprobar hacia fuera. Sí, las células serán repetidos si de celdas personalizado de recogida de vista incrustada en el guión gráfico. Hemos sido capaces de hacerlo funcionar correctamente si la costumbre de células separadas de guión como nuevo UICollectionViewCell xib y registro dinámico de la reutilización de los identificadores en viewDidLoad, pero que parece extraño en el registro de todos los identificadores.
    • Gracias por este. Es un gran tutorial. Funciona a la perfección, pero estoy un poco confundido sobre cómo funciona? La misma función «func collectionView» existe 3 veces. ¿Cómo se sabe que la función a ejecutar?
    • Lo siento, me estaba mirando más y creo que voy a conseguir ahora. Cuando, por ejemplo, vincular la colección de vistas de origen de datos en el archivo, a continuación, se ve allí y espera encontrar al menos obligatorio a los métodos (que se dice que aparte de los parámetros)?
    • eso es correcto. Esos son los obligatorios métodos para el origen de datos y el delegado de protocolos. Les dice, aparte de los parámetros.
    • Finalmente llegué a probarlo. Hice la matriz ["1", "2", ... "99", "100"] para que se desplaza fuera de la pantalla. Todo parecía funcionar bien. Las células no repetir para mí. Yo no cambie nada sobre el proyecto, además de la matriz de datos.
    • por favor me ayude… yo realmente no entiendo cómo, pero en el primer intento, que fue capaz de ctrl y arrastre la etiqueta porque tenía la clase en la sección «Automáticas» de la «Assitant Editor», pero ahora sólo tengo la clase viewcontroller estoy teniendo un burnout
    • No olvide adjuntar su origen de datos y delegado (disculpas si esto ya ha sido mencionado) – esta fue la última cosa que yo no había hecho…
    • Swift 5: cell no estaba funcionando como un identificador. Funcionó después de darle un identificador diferente.
    • No tengo celular por debajo de mi collectionview en el guión gráfico, y de ninguna manera para agregar uno. Alguien sabe cómo?

  2. 3

    Los delegados y de los Orígenes de datos de UICollectionView

    //MARK: UICollectionViewDataSource
    
    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1     //return number of sections in collection view
    }
    
    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10    //return number of rows in section
    }
    
    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("collectionCell", forIndexPath: indexPath)
        configureCell(cell, forItemAtIndexPath: indexPath)
        return cell      //return your cell
    }
    
    func configureCell(cell: UICollectionViewCell, forItemAtIndexPath: NSIndexPath) {
        cell.backgroundColor = UIColor.blackColor()
    
    
        //Customise your cell
    
    }
    
    override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
        let view =  collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "collectionCell", forIndexPath: indexPath) as UICollectionReusableView
        return view
    }
    
    //MARK: UICollectionViewDelegate
    override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
          //When user selects the cell
    }
    
    override func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
         //When user deselects the cell
    }
  3. 3

    Para swift 4.2

    //MARK: UICollectionViewDataSource
    
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1     //return number of sections in collection view
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10    //return number of rows in section
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath as IndexPath)
        configureCell(cell: cell, forItemAtIndexPath: indexPath)
        return cell      //return your cell
    }
    
    func configureCell(cell: UICollectionViewCell, forItemAtIndexPath: NSIndexPath) {
        cell.backgroundColor = UIColor.black
    
    
        //Customise your cell
    
    }
    
    func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
        let view =  collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "collectionCell", for: indexPath as IndexPath) as UICollectionReusableView
        return view
    }
    
    //MARK: UICollectionViewDelegate
    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
        //When user selects the cell
    }
    
    func collectionView(collectionView: UICollectionView, didDeselectItemAtIndexPath indexPath: NSIndexPath) {
        //When user deselects the cell
    }
  4. 1

    UICollectionView la aplicación es bastante interesante.
    Usted puede utilizar el código fuente y ver un tutorial de vídeo utilizando los siguientes enlaces :

    https://github.com/Ady901/Demo02CollectionView.git

    https://www.youtube.com/watch?v=5SrgvZF67Yw

    extension ViewController : UICollectionViewDataSource {
    
        func numberOfSections(in collectionView: UICollectionView) -> Int {
            return 2
        }
    
        func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
            return nameArr.count
        }
    
        func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "DummyCollectionCell", for: indexPath) as! DummyCollectionCell
            cell.titleLabel.text = nameArr[indexPath.row]
            cell.userImageView.backgroundColor = .blue
            return cell
        }
    
    }
    
    extension ViewController : UICollectionViewDelegate {
    
        func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
            let alert = UIAlertController(title: "Hi", message: "\(nameArr[indexPath.row])", preferredStyle: .alert)
            let action = UIAlertAction(title: "OK", style: .default, handler: nil)
            alert.addAction(action)
            self.present(alert, animated: true, completion: nil)
        }
    
    }
  5. 0

    UICollectionView es la misma que la UITableView pero nos da la funcionalidad adicional de la simple creación de una vista de cuadrícula, que es un poco problemático en UITableView. Va a ser un post muy largo menciono un enlace desde donde obtendrá todo en simples pasos.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...