9
votes

UIView en double

J'ai besoin de dupliquer une vue, avec toutes ses sous-visions.

Quelqu'un sait-il comment le faire?


0 commentaires

6 Réponses :


24
votes

La voie la plus facile (mais probablement pas la plus rapide) est de l'archiver dans un objet Nsdata et de le déranger tout de suite.

NSData *tempArchive = [NSKeyedArchiver archivedDataWithRootObject:myView];
UIView *myViewDuplicate = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchive];


7 commentaires

Malheureusement, cela ne fonctionnera pas si votre vue a des sous-espions / objets qui ne peuvent pas être archivés (comme un uiimage).


Vous dites donc que cela ne fonctionnera pas pour UiImageviews?


@Iulianonofrei Avez-vous trouvé une solution pour l'utiliser pour UiImageView par exemple uIView?


@AkshaysUnderwani, non :( J'ai trouvé [cette bibliothèque] (UIView-Copy) mais je ne l'ai pas encore testé. Faites-moi savoir si vous le testez si cela fonctionne ou non.


@Lulianonofrei J'ai reçu une autre vue d'UiImage, en créant un CGIMageref d'origine UIView si celui-ci de type UIImageView, utilisez ensuite l'approche suivante et copiez CGIMageref sur Dupliquer ou votre copie de UIView. Vous pouvez avoir plus d'informations à partir de cette réponse Stackoverflow.com/a/26214969/3824808


Selon Cette réponse , il devrait également fonctionner avec uiImageView .


Cela ne fonctionne pas pour UiImageView sur iOS8. Fonctionne bien les 10 et 11.



3
votes

Pour archiver tout objet UIIMAGE les convertit simplement en image d'un type d'un type ou d'une autre (PNG par exemple) et d'archiver que Nsdata Object, puis dans le non-arrive que vous restaurez l'uImage avec imageWithData:


0 commentaires

0
votes

Voici une nouvelle méthode que vous pouvez utiliser: Utilisez la méthode UIVIEW:

- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates


0 commentaires

0
votes

On peut facilement copier un uiviView par un processus d'archivage et d'une camarivité. xxx pré>

mais cela ignore uiImageView, donc pour UiImageView le faire de cette manière, P>

UIImage *img = [UIImage imageNamed: @"myImage"];
UIImage *img2 = [UIImage imageWithCGImage:img.CGImage scale:img.scale orientation:img.imageOrientation];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:img2];
UIImage *imgCopy = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"%@, %@", imgCopy, NSStringFromCGSize(imgCopy.size)); // -> <UIImage: 0x7fa013e766f0>, {50, 53}


0 commentaires

0
votes

Swift version

Cette réponse montre comment faire la même chose à Swift que la réponse acceptée se trouve dans l'objectif-c. xxx > Ma réponse complète avec plus de notes est ici .


0 commentaires

0
votes

 Entrez la description de l'image ici

Vous pouvez faire glisser votre vue personnalisée en dehors de la vue racine de la vue ViewController. Dans la mise en œuvre de la classe d'affichage personnalisée, remplacez les méthodes enconde / décodage. Réaliser les connexions Iboutlets et Ibactions ne seront pas archivées en mémoire. xxx

myCustomview.h: xxx

échantillon de réutilisation de la vue personnalisée dans la vueController.m: < Pré> xxx


0 commentaires