Aller au contenu


Photo

Slider


  • Please log in to reply
65 réponses à ce sujet

#21 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 12 juin 2017 - 15:47

On pourrait la faire dans une animation je crois ?

#22 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 12 juin 2017 - 15:53

Je ne l'ai pas vérifié mais j'ai trouvé ça : http://www.inspiresm...for-ios-part-ii

#23 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 21 juin 2017 - 11:47

Euh .. franchement rollano t'abuse un peu là .. Tu n'as pas dus chercher bien longtemps ! 

 

Ta vidéo est une DEMONSTRATION de raywenderlich montrant l'utilisation d'un composant graphique iOS RGCardViewLayout qu'il a écrit lui-même.

 

Voici le GitHub avec le source complet (Objective-C)  

 

https://github.com/t...GCardViewLayout

 

C'est une viewCollection personnalisée avec un effet de transformation utilisant CATransform3D.

 

 

C'est pas très expliquer loool

 

J'arrive pas à l'utiliser

 

j'ai installer le pod qui à eu comme effet d'ajouter les deux fichiers objectif c

 

c'est quoi la suite ?



#24 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 21 juin 2017 - 12:46

Est-ce que le programme de démo fonctionne chez toi ? Il tourne parfaitement bien de mon coté.

 

Je ne sais pas comment utiliser de l’objective-C avec Swift. C’est certainement très simple, mais comme j’ai une violente allergie à l’obj-C... Joanna ou une autre âme courageuse (ou encore le livre Apple (iBook gratuit - Using Swift with Cocoa and Obective-C) te montreront la voie.

 

Je n’ai pas le temps de me pencher sur le portage des routines en Swift en ce moment, mais le problème m’intéresse. Donne-moi quelques jours et je fais ma propre version du truc en Swift, en utilisant une animation et une transformation 3D.


  • rollano aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#25 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 21 juin 2017 - 13:29

Est-ce que le programme de démo fonctionne chez toi ? Il tourne parfaitement bien de mon coté.

 

Je ne sais pas comment utiliser de l’objective-C avec Swift. C’est certainement très simple, mais comme j’ai une violente allergie à l’obj-C... Joanna ou une autre âme courageuse (ou encore le livre Apple (iBook gratuit - Using Swift with Cocoa and Obective-C) te montreront la voie.

 

Je n’ai pas le temps de me pencher sur le portage des routines en Swift en ce moment, mais le problème m’intéresse. Donne-moi quelques jours et je fais ma propre version du truc en Swift, en utilisant une animation et une transformation 3D.

 

 

Merci beaucoup :)

 

oui la demo fonctionne. et j'ai scruter tous les fichiers à la recherche d'indice ou autres....mais rien



#26 Céroce

Céroce

    Mouleur de chocolats

  • Contrôleur d'arômes
  • 5 324 messages
  • LocationSaint-Leu-d'Esserent / France

Posté 21 juin 2017 - 14:12

Je ne sais pas comment utiliser de l’objective-C avec Swift. C’est certainement très simple, mais comme j’ai une violente allergie à l’obj-C...

Oui, c'est très simple. D'ailleurs, il n'y a rien de particulier à faire. Quoique je n'ai pas bien compris le rôle du Bridging Header… j'ai l'impression qu'il n'est plus trop d'actualité.
  • rollano aime ceci
RenaudPradenc.com Je suis développeur iOS & Mac indépendant.

#27 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 21 juin 2017 - 14:15

Oui, c'est très simple. D'ailleurs, il n'y a rien de particulier à faire. Quoique je n'ai pas bien compris le rôle du Bridging Header… j'ai l'impression qu'il n'est plus trop d'actualité.

 

Quand on intègre par pod il n'ya pas de bridge.



#28 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 21 juin 2017 - 15:44

Voilà le code pour le layout traduit en Swift. Il n'était pas le meilleur code en Objective-C ; je n'ai que le traduit le mieux que possible mais, si je le faisais pour moi-même, je le ferais un peu différent.

class RGCardViewLayout : UICollectionViewFlowLayout
{
  var previousOffset: CGFloat = 0.0
  
  var mainIndexPath: IndexPath?
  
  var movingInIndexPath: IndexPath?
  
  var difference: CGFloat = 0.0
  
  override func prepare()
  {
    setupLayout()
    
    super.prepare()
  }
  
  func setupLayout()
  {
    guard let collectionView = collectionView else
    {
      return
    }
    
    let inset  = floor(collectionView.bounds.size.width * (6/64.0))
    
    itemSize = CGSize(width: collectionView.bounds.size.width - (2 * inset), height: collectionView.bounds.size.height * 3 / 4)
    
    sectionInset = UIEdgeInsetsMake(0, inset, 0, inset)
    
    scrollDirection = .horizontal
  }
  
  override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
  {
    let attributes = super.layoutAttributesForItem(at: indexPath)
    
    applyTransform(to: attributes)
    
    return attributes
  }
  
  override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool
  {
    return true
  }
  
  override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]?
  {
    let attributes = super.layoutAttributesForElements(in: rect)
    
    guard let collectionView = collectionView else
    {
      return nil
    }
    
    let cellIndices = collectionView.indexPathsForVisibleItems
    
    switch cellIndices.count
    {
      case 0:
        return attributes
      case 1:
        mainIndexPath = cellIndices.first
        movingInIndexPath = nil
      default:
        let firstIndexPath = cellIndices.first
        if firstIndexPath == mainIndexPath
        {
          movingInIndexPath = cellIndices[1]
        }
        else
        {
          movingInIndexPath = cellIndices.first
          mainIndexPath = cellIndices[1]
        }
    }
    
    difference = collectionView.contentOffset.x - previousOffset
    
    previousOffset = collectionView.contentOffset.x
    
    attributes?.forEach { applyTransform(to: $0) }
    
    return attributes
  }
  
  func applyTransform(to layoutAttributes:UICollectionViewLayoutAttributes?)
  {
    guard let layoutAttributes = layoutAttributes,
          let collectionView = collectionView,
          let mainIndexPath = mainIndexPath else
    {
      return
    }
    
    if layoutAttributes.indexPath.section == mainIndexPath.section
    {
      if let cell = collectionView.cellForItem(at: mainIndexPath)
      {
        layoutAttributes.transform3D = self.transformFromView(cell)
      }
    }
    else
    {
      guard let movingInIndexPath = movingInIndexPath else
      {
        return
      }
      
      if layoutAttributes.indexPath.section == movingInIndexPath.section
      {
        if let cell = collectionView.cellForItem(at: movingInIndexPath)
        {
          layoutAttributes.transform3D = self.transformFromView(cell)
        }
      }
    }
  }

  func baseOffsetForView(_ view: UIView) -> CGFloat
  {
    guard let collectionView = collectionView,
          let cell = view as? UICollectionViewCell,
          let indexPath = collectionView.indexPath(for: cell) else
    {
      return 0.0
    }
    
    return CGFloat(indexPath.section) * collectionView.bounds.size.width
  }
  
  func heightOffsetForView(_ view: UIView) -> CGFloat
  {
    guard let collectionView = collectionView else
    {
      return 0.0
    }
    
    let baseOffsetForCurrentView = baseOffsetForView(view)
    
    let currentOffset = collectionView.contentOffset.x
    
    let scrollViewWidth = collectionView.bounds.size.width
    
    return abs(120 * (currentOffset - baseOffsetForCurrentView) / scrollViewWidth)
  }
  
  func angleForView(_ view: UIView) -> CGFloat
  {
    guard let collectionView = collectionView else
    {
      return 0.0
    }
    
    let baseOffsetForCurrentView = baseOffsetForView(view)
    
    let currentOffset = collectionView.contentOffset.x
    
    let scrollViewWidth = collectionView.bounds.size.width
    
    return (currentOffset - baseOffsetForCurrentView) / scrollViewWidth
  }
  
  func xAxisForView(_ view: UIView) -> Bool
  {
    guard let collectionView = collectionView else
    {
      return false
    }
    
    let baseOffsetForCurrentView = baseOffsetForView(view)
    
    let currentOffset = collectionView.contentOffset.x
    
    let offset = (currentOffset - baseOffsetForCurrentView)
    
    return offset >= 0
  }
  
  
  func transformFromView(_ view: UIView) -> CATransform3D
  {
    let angle = angleForView(view)
    
    let height = heightOffsetForView(view)
    
    let xAxis = xAxisForView(view)
    
    return transformFrom(angle: angle, height:height, axis:xAxis)
  }
  
  func transformFrom(angle: CGFloat, height: CGFloat, axis: Bool) -> CATransform3D
  {
    var t = CATransform3DIdentity
    
    t.m34 = 1.0 / -500
  
    return CATransform3DRotate(t, angle, axis ? 1 : -1, 1, 0)
  }
}

  • Draken et rollano aiment ceci

#29 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 21 juin 2017 - 17:07

Voilà le code pour le layout traduit en Swift. Il n'était pas le meilleur code en Objective-C ; je n'ai que le traduit le mieux que possible mais, si je le faisais pour moi-même, je le ferais un peu différent.


Je crée un module du coup en remplacement des deux fichiers en objectif c ?

#30 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 21 juin 2017 - 17:12

Oui. En Swift on n'a qu'un fichier par type.
  • rollano aime ceci

#31 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 21 juin 2017 - 21:38

30 erreurs 

Fichier(s) joint(s)



#32 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 21 juin 2017 - 22:12

Supprimes - import Foundation

 

Ajoutes - import UIKit



#33 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 21 juin 2017 - 22:29

C'est parfait, Joanna, cela règle les erreurs

 

Maintenant peux-tu me dire comment je l'associe à mon UICollectionView ?

 

(Vraiment désoler pour mes questions de "néophite"

 

et merci pour votre patience :)



#34 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 21 juin 2017 - 22:36

Tu ne l’associe pas, tu le remplace par ..

 

UICollectionViewFlowLayout est une UICollectionView personnalisé permettant de définir la taille et l’emplacement de chacun de ces composants.


  • rollano aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#35 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 21 juin 2017 - 22:44

En InterfaceBuilder, sélectionnes le UICollectionView dans la colonne à gauche de la vue principale, cliques sur la flèche pour dérouler et sélectionnes le layout. Puis, dans l'inspecteur, remplaces le nom de la classe UICollectionViewFlowLayout avec le nom de ta classe.
  • rollano aime ceci

#36 Draken

Draken

    Mouleur de chocolats

  • Artisan chocolatier
  • PipPipPipPipPipPipPipPip
  • 8 800 messages
  • LocationParis

Posté 22 juin 2017 - 07:33

Je n’avais pas pensé à résoudre le problème en transposant le code ligne à ligne de l’objet-C vers Swift.


  • rollano aime ceci

Garçon, servez-moi un Covfefe avec du lait de soja, sans OGM ..

Et faites régler la climatisation, il fait bien chaud, ici !

 

 

Éternel Novice !  :baby:

Tueur de poneys !  :(

 

Faire simple .. c'est compliqué !

Faire compliqué .. c'est simple !

 

Un MOOC (cours en ligne - dont je ne suis pas l'auteur) gratuit sur la programmation en Obj-C et en Swift 3, démarrant le 14 Mars 2017 :

https://www.edx.org/...onnex-progios1x

 

Des dizaines d'heures de tutoriels vidéo en français (je ne suis pas l'auteur) pour apprendre à développer en Obj-C et Swift : http://pagesperso-sy...don/5I452-2014/

 

 


#37 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 22 juin 2017 - 08:12

Et voici comment changer la classe du layout :

 

Fichier joint  Rollano.png   58,09 Ko   0 téléchargement(s)


  • rollano aime ceci

#38 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 997 messages
  • LocationPlestin-les-Grèves (22)

Posté 22 juin 2017 - 08:31

Petites corrections dans le code ; il faut copier les attributes avant de les transformer :

  override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes?
  {
    let attributes = super.layoutAttributesForItem(at: indexPath)?.copy() as! UICollectionViewLayoutAttributes
    
    applyTransform(to: attributes)
    
    return attributes
  }
  
  override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]?
  {
    guard let attributes = super.layoutAttributesForElements(in: rect)?.map({ return $0.copy() as! UICollectionViewLayoutAttributes}),
          let collectionView = collectionView else
    {
      return nil
    }
    
    let cellIndices = collectionView.indexPathsForVisibleItems
    
    switch cellIndices.count
    {
      case 0:
        return attributes
      case 1:
        mainIndexPath = cellIndices.first
        movingInIndexPath = nil
      default:
        let firstIndexPath = cellIndices.first
        if firstIndexPath == mainIndexPath
        {
          movingInIndexPath = cellIndices[1]
        }
        else
        {
          movingInIndexPath = cellIndices.first
          mainIndexPath = cellIndices[1]
        }
    }
    
    difference = collectionView.contentOffset.x - previousOffset
    
    previousOffset = collectionView.contentOffset.x
    
    attributes.forEach { applyTransform(to: $0) }
    
    return attributes
  }

  • rollano aime ceci

#39 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 22 juin 2017 - 12:19

En InterfaceBuilder, sélectionnes le UICollectionView dans la colonne à gauche de la vue principale, cliques sur la flèche pour dérouler et sélectionnes le layout. Puis, dans l'inspecteur, remplaces le nom de la classe UICollectionViewFlowLayout avec le nom de ta classe.

 

C'est magnifique ça fonctionne hyper bien



#40 rollano

rollano

    Ecabosseur en fèves

  • Membre
  • PipPipPipPip
  • 225 messages

Posté 22 juin 2017 - 12:19

Merci beaucoup tout le monde pour l'aide apportée






0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)