setContentOffset für eine ScrollView in einer collectionViewCell

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • setContentOffset für eine ScrollView in einer collectionViewCell

    Hallo,

    ich möchte das bei einem tap innerhalb einer ScrollView die ich in einer collectionViewCell erzeuge, sich der Content bzw. die xPostion der ScrollView an die Stelle schiebt an die auch getippt wurde. Da ich so etwas bisher noch nicht gemacht habe, habe ich einfach wild drauf los probiert, jedoch leider nicht mit dem gewünschten Ergebnis.

    Mein Plan war es über einen tabGestureRecognizer, die xPosition über setContentOffset zu verschieben. Die ScrollView erfässt diese Taps auch jedoch bekomme ich immer wieder eine Fehlermeldung das die ScrollView nil wäre.

    Hat jemand von euch schon mal ähnliches probiert und weiß wie man so etwas handhaben kann ?

    Ich hoffe es wird klar was ich probiere :)
    PS: Gutes Beispiel wäre der Discover Bereich von Instagram in dem man ganz oben die Kategorien auswählen kann

    Hier der Code

    Quellcode

    1. func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    2. let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Header", for: indexPath as IndexPath) as! TestCollectionReusableView
    3. let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(recognizer:)))
    4. tapGestureRecognizer.numberOfTapsRequired = 1
    5. headerView.scrollView.addGestureRecognizer(tapGestureRecognizer)
    6. for (pic, title) in zip(0..<images.count, categories) {
    7. let imageView = UIImageView()
    8. imageView.image = images[pic]
    9. imageView.contentMode = .scaleAspectFill
    10. let xPosition = 110 * CGFloat(pic)
    11. imageView.layer.cornerRadius = 10
    12. imageView.layer.masksToBounds = true
    13. imageView.frame = CGRect(x: xPosition, y: CGFloat(0), width: 100, height: headerView.scrollView.frame.size.height)
    14. //Code zu Erstellung der Maske
    15. let questionLabel = UILabel(frame: CGRect(x: 0, y: 25, width: 100 , height: headerView.scrollView.frame.size.height/2))
    16. questionLabel.text = title
    17. questionLabel.textAlignment = .center
    18. questionLabel.textColor = .white
    19. questionLabel.font = UIFont.boldSystemFont(ofSize: 15.0)
    20. questionLabel.layer.shadowColor = UIColor.black.cgColor
    21. questionLabel.layer.shadowRadius = 3.0
    22. questionLabel.layer.shadowOpacity = 1.0
    23. questionLabel.layer.shadowOffset = CGSize(width: 4, height: 4)
    24. questionLabel.layer.masksToBounds = false
    25. imageView.addSubview(questionLabel)
    26. headerView.scrollView.contentSize.width = 127 * CGFloat(pic)
    27. headerView.scrollView.addSubview(imageView)
    28. }
    29. return headerView
    30. }
    31. @objc func scrollViewTapped(recognizer: UITapGestureRecognizer) {
    32. print("läuft")
    33. }
    Alles anzeigen


    Der Code zur func scrollViewTapped sah vorher wie folgt aus, jedoch hatte ich damit wenig Erfolg da immer die Meldung kam "found nil while unwrapping an optional value":

    Quellcode

    1. @objc func scrollViewTapped(recognizer: UITapGestureRecognizer) {
    2. print("läuft")
    3. let element = TestCollectionReusableView()
    4. element.scrollView.setContentOffset(CGPoint(x: 100, y: 0), animated: true)
    5. }
  • Okay ich war wohl etwas voreilig und habe gedacht dass das was ich vorhabe etwas einfacher sein würde aber irgendwie brauch ich einen neuen Denkanstoß.

    Wie ihr seht lade ich eine Reihe an Bildern in meine ScrollView. Das funktioniert auch alles soweit, doch ich weiß gerade leider nicht wie ich meiner scrollViewTapped Funktion sagen kann welches Bild angeklickt wurde damit sich die ScrollView an eben diese xPosition schiebt...

    Hat jemand einen tipp für mich was ich dafür beachten muss ?

    So sieht mein Code aktuell aus:

    Quellcode

    1. var headerView = TestCollectionReusableView()
    2. var imageView = UIImageView()
    3. func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
    4. headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "Header", for: indexPath as IndexPath) as! TestCollectionReusableView
    5. let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(recognizer:)))
    6. tapGestureRecognizer.numberOfTapsRequired = 1
    7. headerView.scrollView.addGestureRecognizer(tapGestureRecognizer)
    8. for (pic, title) in zip(0..<images.count, categories) {
    9. imageView = UIImageView()
    10. imageView.image = images[pic]
    11. imageView.contentMode = .scaleAspectFill
    12. let xPosition = 110 * CGFloat(pic)
    13. imageView.layer.cornerRadius = 10
    14. imageView.layer.masksToBounds = true
    15. imageView.frame = CGRect(x: xPosition, y: CGFloat(0), width: 100, height: headerView.scrollView.frame.size.height)
    16. headerView.scrollView.contentSize.width = 127 * CGFloat(pic)
    17. headerView.scrollView.addSubview(imageView)
    18. }
    19. return headerView
    20. }
    21. @objc func scrollViewTapped(recognizer: UITapGestureRecognizer) {
    22. print("läuft")
    23. headerView.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
    24. }
    Alles anzeigen
  • Also quasi so, oder hättest du noch eine bessere Idee ?:


    Quellcode

    1. @objc func scrollViewTapped(recognizer: UITapGestureRecognizer) {
    2. var touchPoint = recognizer.location(in: headerView.scrollView)
    3. switch touchPoint.x {
    4. case(0..<110):
    5. headerView.scrollView.setContentOffset(CGPoint(x: 0, y: 0), animated: true)
    6. case(110..<220):
    7. headerView.scrollView.setContentOffset(CGPoint(x: 110, y: 0), animated: true)
    8. case(220..<330):
    9. headerView.scrollView.setContentOffset(CGPoint(x: 220, y: 0), animated: true)
    10. case(330..<440):
    11. headerView.scrollView.setContentOffset(CGPoint(x: 330, y: 0), animated: true)
    12. case(440..<550):
    13. headerView.scrollView.setContentOffset(CGPoint(x: 408, y: 0), animated: true)
    14. case(550..<660):
    15. headerView.scrollView.setContentOffset(CGPoint(x: 408, y: 0), animated: true)
    16. default:
    17. print("nichts passiert")
    18. }
    19. }
    Alles anzeigen
  • Na ja, man könnte die gewünschte Position ja auch berechnen. ;)

    Quellcode

    1. @objc func scrollViewTapped(recognizer: UITapGestureRecognizer) {
    2. var touchPoint = recognizer.location(in: recognizer.view)
    3. let int pic = touchPoint.x / 110;
    4. recognizer.view.setContentOffset(CGPoint(x: pic * 110, y: 0), animated: true)
    5. }
    Swift Syntax musst Du ggf. noch anpassen. :P