CAGradientLayer & UIView

JérémyJérémy Membre
août 2016 modifié dans Objective-C, Swift, C, C++ #1

Bonjour à  tous,


 


Je souhaiterais créé un dégradé de couleur dans une UIView se trouvant dans mon UIViewController.


Voici le code de ma vue :



import UIKit

@IBDesignable
class MyView: UIView {
func refreshInterface() {
self.form.layer.borderWidth = 1.7
gradientLayer.frame = self.layer.bounds
let colorTop: CGColor = UIColor(red: 26.0/255.0, green: 196.0/255.0, blue: 252.0/255.0, alpha: 1.0).CGColor
let colorBottom: CGColor = UIColor(red: 30.0/255.0, green: 67.0/255.0, blue: 244.0/255.0, alpha: 1.0).CGColor
gradientLayer.colors = [colorTop,colorBottom]
gradientLayer.locations = [0.0,1.0]
layer.insertSublayer(gradientLayer, atIndex: 0)
}
}

Le souci est que la couleur dégradée ne se positionne pas à  l'endroit même de ma view mais légèrement sur le côté (voir screen). Comment puis-je faire pour que le fond vienne se placé sous ma vue ? J'ai rajouté un border pour que vous puissiez voir le décalage.


Pour information :

    - j'ai fabriqué mes IHMs via Interface Builder


    - la méthode refresh est appelée depuis la méthode viewDidLoad de mon UIViewController



override func viewDidLoad() {
super.viewDidLoad()
myView.refreshInterface()
}

Je vous remercie par avance pour vos réponses !  :D


Réponses

  • Il faut simplement que tu redimensionne ton CAGradientLayer dans la méthode layoutSublayers de ta vue.


  • Pourrais-tu logguer/vérifier la frame quand tu créées le tout, et dans layoutSubView ou un truc du genre ?




  • Il faut simplement que tu redimensionne ton CAGradientLayer dans la méthode layoutSublayers de ta vue.




     


    Okay ! Donc en gros je ne bouge rien dans ma méthode refresh et dans la méthode layoutSublayers je mets un truc du genre :


     



    gradientLayer.frame = self.layer.bounds

    Mais la méthode layoutSublayers  est appelée automatiquement lorsque les dimensions de ma vue changent ? Ou c'est à  moi à  le gérer ?


     




    Pourrais-tu logguer/vérifier la frame quand tu créées le tout, et dans layoutSubView ou un truc du genre ?




     


    Oui j'ai vérifié. Le problème (à  mon avis) vient du fait qu'il se base sur les dimensions du décrites dans interface builder dont les fenêtres sont génériques...

  • La methode est appelé automatiquement. Tu n'as pas à  t'embêter plus que ça. 


  • JérémyJérémy Membre
    août 2016 modifié #6


    La methode est appelé automatiquement. Tu n'as pas à  t'embêter plus que ça. 




     


    D'accord. Le redimensionnement se verra à  l'écran par les utilisateurs ? Il verra ma view se transformer en live ?


  • ça je ne saurai te dire avec certitude il va falloir que tu teste. Sinon pour explicitement désactiver les animations tu fais comme ça :



    CATransaction.begin()
    CATransaction.setDisableActions(true)
    // Ton code
    CATransaction.commit()
  • Merci beaucoup Pyroh !


    Je vais tester ceci et je te dirai !  :)




  • Il faut simplement que tu redimensionne ton CAGradientLayer dans la méthode layoutSublayers de ta vue.




     


    J'ai utilisé la méthode layoutSubviews (qui correspond à  mon cas), et tout fonctionne pour le mieux.


     


    Merci Pyroh pour ton aide ! 

  • Y'a pas de quoi va 


Connectez-vous ou Inscrivez-vous pour répondre.