Récupérer une partie d'un View

Bonjour,


 


Je possède une UIView plus grande que mon écran. J'aimerai en récupérer une partie, un rect x,y, height, width) pour la mettre dans une autre UIVIew.


 


Je galère avec la doc et les systèmes de coordonnées.


 


Si vous avez une idée je suis preneur ?


Merci d'avance.


Mots clés:

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    UIScrollView ?
  • DrakenDraken Membre
    février 2017 modifié #3


    func decoupage(_ image:UIImage, rect:CGRect) -> UIImage? {
    if let cgimage = image.cgImage {
    if let cgimage2 = cgimage.cropping(to: rect) {
    return UIImage(cgImage: cgimage2)
    }
    }
    return nil
    }



    a






  • func decoupage(_ image:UIImage, rect:CGRect) -> UIImage? {
    ...



    Merci Draken mais c'est pour une UIView, pas une UIImage.

  • CéroceCéroce Membre, Modérateur
    Draken part du principe que tu fais une capture de la première vue en utilisant UIGraphicsGetImageFromCurrentImageContext().

    Cependant, nous manquons de contexte, et peut-être que la meilleure solution est de dessiner une deuxième fois dans une autre instance de ta vue, ou utiliser une UIScrollView, comme proposé par Joanna.
    Il faut nous en dire plus.


  • Draken part du principe que tu fais une capture de la première vue en utilisant UIGraphicsGetImageFromCurrentImageContext().




    a


    Yes sir !

  • Perso,

    Je mettrais la vue qui t'intéresse dans une autre vue avec maskToBounds = YES.

    Il faut que règle bien le origin du frame de ta vie, c'est ça qui déterminera là  où commence ta vue.
  • DrakenDraken Membre
    février 2017 modifié #8


    Merci Draken mais c'est pour une UIView, pas une UIImage.




    a


    Et comme ça ?


    a



    extension UIImage {
    func decoupage(rect:CGRect) -> UIImage? {
    if let cgimage = self.cgImage {
    if let cgimage2 = cgimage.cropping(to: rect) {
    return UIImage(cgImage: cgimage2)
    }
    }
    return nil
    }
    }

    extension UIView {

    func snapshot() -> UIImage? {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size)
    drawHierarchy(in: self.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
    }

    func snapshot(rect:CGRect) -> UIImage? {
    if let image = self.snapshot() {
    return image.decoupage(rect: rect)
    }
    return nil
    }
    }


    a


    exemple de mise en oeuvre :


    a



    let viewTest = UIView (...
    let rectDecoupage = CGRect(...

    if let image = viewTest.snapshot(rect: rectDecoupage) {
    ....
    }



  • Sympa Draken ton petit bout de code. Ca peut être très utile lorsque tu peux faire des animations sympa sur tes UIView sans trop te casser la tête.


     


    Tu as la possibilité de configurer la définition de l'image en sortie ?


  • CéroceCéroce Membre, Modérateur
    février 2017 modifié #10

    Tu as la possibilité de configurer la définition de l'image en sortie ?

    C'est une capture du contexte graphique, donc du rendu de la vue à  l'écran.

    Si tu veux vraiment du contrôle, dessine plutôt dans un CGBitmapContext "offscreen", là  on peut faire à  peu près ce qu'on veut, il me semble que la limite est de 32768 x 32768 pixels, peut-être plus sur les nouveaux modèles.


  • Sympa Draken ton petit bout de code. Ca peut être très utile lorsque tu peux faire des animations sympa sur tes UIView sans trop te casser la tête.


     




    En stockant toutes les étapes de l'animation dans une seule image, comme ça ?



  • En stockant toutes les étapes de l'animation dans une seule image, comme ça ?




     


    Non non non. Exemple tu as une UIView qui affiche des datas. Si je supprime les données, que je souhaite créer une animation de va vue qui va dans la poubelle (échelle, distorsion de la view), je pense que ce sera plus simple en prenant la vue "en photo" et en travaillant sur le cliché.

  • DrakenDraken Membre
    février 2017 modifié #13

    Ah oui, d'accord tu parlais de la copie d'écran dans une UIImage.


    Quand on parle animations j'ai toujours tendance à  penser "Jeu Vidéo".

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