2017-03-20 4 views
0

Ich habe ein Array von Fotos, die ich derzeit in einer UICollectionview anzeigen. Das einzige, was ich noch hinzufügen möchte, ist eine zusätzliche statische Zelle, die dem Benutzer die Möglichkeit geben soll, die Kamera zu öffnen. Ich habe eine if-else-Anweisung verwendet, um den Index zu erkennen. Leider gibt mir die Konsole einen Indexfehler.Swift - Hinzufügen einer zusätzlichen statischen Zelle zu meiner UICollectionview

Um genau zu sein: Ich möchte diese statische Zelle in der oberen linken Ecke, gefolgt von meinem Array von Bildern. Muss ich zwei Abschnitte hinzufügen oder sollte ich eine andere benutzerdefinierte Zelle registrieren, um dies zu erreichen? Ab jetzt kann ich meine extra Zelle sehen, aber es funktioniert nicht, wenn sie angezapft wird (außerhalb des Indexes).

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

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

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: photoId, for: indexPath) as! PhotosCollectionViewCell 

    if indexPath.row == imageArray.count { 
     cell.backgroundColor = UIColor.lightGray 
     cell.addGestureRecognizer(UIGestureRecognizer(target: self, action: #selector(tappedCamera))) 
    } else { 
     cell.imageView.image = imageArray[indexPath.item] 
     cell.imageView.addGestureRecognizer(UIGestureRecognizer(target: self, action: #selector(tappedPhoto))) 
    } 

    return cell 
} 

aktualisiert Code (Lösung)

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

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

    if indexPath.row == 0 { 
     let cameraCell = collectionView.dequeueReusableCell(withReuseIdentifier: cameraId, for: indexPath) as! CameraCollectionViewCell 
     return cameraCell 
    } 

    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tappedPhoto)) 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: photoId, for: indexPath) as! PhotoCollectionViewCell 

    cell.imageView.image = imageArray[indexPath.row - 1] 
    cell.imageView.addGestureRecognizer(tapGesture) 

    return cell 
} 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    if indexPath.row == 0 { 
     print("Camera") 
    } 
} 

var startingFrame: CGRect? 
var blackBackGroundView: UIView? 
var selectedImageFromPicker: UIImage? 
var selectedImageCompressed: UIImage? 

func tappedPhoto(sender: UIGestureRecognizer) { 
    if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) { 

     let imageView = self.collectionView?.cellForItem(at: indexPath) 

     startingFrame = imageView?.superview?.convert((imageView?.frame)!, to: nil) 

     let zoomingImageView = UIImageView(frame: startingFrame!) 
     zoomingImageView.image = imageArray[indexPath.row - 1] 
     zoomingImageView.isUserInteractionEnabled = true 
     zoomingImageView.contentMode = .scaleAspectFill 
     zoomingImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleZoomOut))) 

     if let keyWindow = UIApplication.shared.keyWindow { 
      blackBackGroundView = UIView(frame: keyWindow.frame) 
      blackBackGroundView?.backgroundColor = UIColor.black 
      blackBackGroundView?.alpha = 0 

      keyWindow.addSubview(blackBackGroundView!) 
      keyWindow.addSubview(chooseLabel) 
      keyWindow.addSubview(zoomingImageView) 

      // Set selected image and compress 
      selectedImageFromPicker = imageArray[indexPath.row - 1] 
      selectedImageCompressed = selectedImageFromPicker?.resized(withPercentage: 0.1) 

      chooseLabel.rightAnchor.constraint(equalTo: keyWindow.rightAnchor, constant: -25).isActive = true 
      chooseLabel.bottomAnchor.constraint(equalTo: keyWindow.bottomAnchor, constant: -25).isActive = true 

      UIView.animate(withDuration: 0.3, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: { 

       self.blackBackGroundView?.alpha = 1 
       self.chooseLabel.alpha = 1 

       let height = self.startingFrame!.height/self.startingFrame!.width * keyWindow.frame.width 

       zoomingImageView.frame = CGRect(x: 0, y: 0, width: keyWindow.frame.width, height: height) 

       zoomingImageView.center = keyWindow.center 

       }, completion: {(completed) in 
        // Do nothing 
      }) 
     } 
    } 
} 
+0

Können Sie bitte Ihre ausgewählte Zellfunktion posten? – Siriss

+0

Überprüfen Sie die aktualisierten Ans. –

+0

Die ausgewählte Zellfunktion hinzugefügt :-) –

Antwort

2

Muss ich zwei Abschnitte hinzuzufügen haben, oder sollte ich eine andere benutzerdefinierte Zelle registrieren dies zu erreichen?

In Ihrem Fall sollte nur eine Zelle am Anfang der Sammlung gerecht genug sein, es besteht keine Notwendigkeit, es mehrteilig zu machen.

sollte Ihre Methoden wie folgt implementiert werden:

1-numberOfItemsInSection Methode: sein sollte wie:

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

2-cellForItemAt Methode: hängt von der ersten Zelle, wenn es sollte eine andere Zelle sein:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    // first row 
    if indexPath.row == 0 { 
     let cameraCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cameraCell-ID", for: indexPath) 

     // setup the cell... 

     return cameraCell 
    } 

    let defaultCell = collectionView.dequeueReusableCell(withReuseIdentifier: "defaultCell-ID", for: indexPath) 

    // setup default cell... 

    return defaultCell 
} 

Oder, wenn Sie es wollen, dass die gleiche Zelle sein, aber mit einigen Auflagen:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell-ID", for: indexPath) 

    // first row 
    if indexPath.row == 0 { 
     // setup the cell as cemera cell... 
    } else { 
     // setup the cell as default cell... 
    } 

    return cell 
} 

Eigentlich gibt es keine Notwendigkeit UITapGestureRecognizer für jede Zelle hinzuzufügen, alles, was Sie tun müssen, ist collection​View(_:​did​Select​Item​At:​) Delegatmethode zu implementieren:

Weist den Delegaten an, dass das Element am angegebenen Indexpfad ausgewählt wurde.

3-didSelectItemAt Methode:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    if indexPath.row == 0 { // camera cell 
     // handle tapping the camera cell 
    } else { // default cells 
     // handle tapping the default cell 

     // don't forget that: 
     // getting the first element in 'imageArray' should be imageArray[indexPath.row - 1] 
    } 
} 

Hope this geholfen.

+0

Danke. Es hat mir sehr geholfen. Der Grund, warum ich 'didSelectItemAt Index' nicht verwendet habe, ist, weil ich meine CollectionView in eine UIView eingebettet habe. Um das Ein- und Auszoomen zu erleichtern, habe ich einen tapGesture verwendet, um die Position des Bildes zu ermitteln und eine weitere Ansicht zu erstellen. Ich kann es immer noch nicht zur Arbeit bringen :-( –

+0

Ich habe es repariert! Ihre Erklärung hat mir geholfen, dies zu erreichen, also werde ich dies als die Antwort markieren. –

+0

Froh, dass ich helfen kann :) –

Verwandte Themen