11
votes

Capture d'écran à partir d'un utableview

Je sais qu'il y a beaucoup de questions sur ce thème mais je les lis vraiment tous, mais pas trouvé une réponse.

Je veux faire une capture d'écran de la vue de table actuelle. et je le fais de cette façon: xxx

Tout fonctionne bien, mais quand je fais défiler dans la tableView et faire la capture d'écran, la moitié de l'image est noire. Je ne sais pas comment faire la capture d'écran de la réelle zone de tableView.


0 commentaires

7 Réponses :


2
votes

Étant donné que UditableViewCell est réutilisable, lors du défilement de la vue de la table, les cellules situées en dehors des ports de vue seront en cours pour la réutilisation et la retire de la vue de la table. Essayez donc de garder les cellules seulement être réutilisables sur son chemin d'index:

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  NSString *cellIdentifier = [NSString stringWithFormat:@"Cell_%d_%d", indexPath.section, indexPath.row]; 
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithReuseIdentifier:cellIdentifier] autorelease];
  }
  ...
  return cell;
}


4 commentaires

thx pour la réponse. Je ne suis pas vraiment sûr que vous voulez dire avec "le faire avec un but de capture d'écran uniquement". Maintenant, j'ai un bouton qui fait la capture d'écran. Qu'est-ce que je dois faire ce code lorsque je repousse le bouton d'écran sans consommer plus de mémoire?


Sur des voies normales, le nombre de cellules seulement une litière plus ou égale au port de vue peut contenir, ils sont réutilisables lors du défilement de la vue de la table, il peut donc fonctionner en douceur même s'il contient un montant important. Sur mon chemin, le nombre de cellules est identique au nombre de toutes les lignes de la vue de table, de sorte que si votre vue de table a un grand nombre d'éléments, il mangera beaucoup de mémoire que la voie normale. Alors soyez soin. Si vous envisagez d'abord l'utilisation de la mémoire, n'utilisez pas cette méthode, bien que cela puisse fonctionner.


J'ai exactement le même problème, et cela ne le résolvait pas pour moi. @Missaq a fait cela résoudre le problème pour vous?


Bonjour, je sais que c'est un peu obsolète, mais pour quelqu'un d'autre qui cherche cela, vous pouvez jeter un coup d'œil à cette bibliothèque: github.com/davidman/dhsmartScreenshot



25
votes

Cela vous obtiendra la région visible actuelle de la TableView.

Si vous voulez rendre la vision de la table entière, vous devez d'abord être conscient, probablement pas une bonne idée de quelque chose de plus que quelques dizaines de lignes à cause de la mémoire et de ce qui n'est pas. La taille maximale de l'image en 2048x2048 de sorte que votre vision de table ne peut être pas plus grande que celle-là. P>

UIView *viewToRender = self.tableView;
CGPoint contentOffset = self.tableView.contentOffset;

UIGraphicsBeginImageContext(viewToRender.bounds.size);

CGContextRef ctx = UIGraphicsGetCurrentContext();

//  KEY: need to translate the context down to the current visible portion of the tablview
CGContextTranslateCTM(ctx, 0, -contentOffset.y);

[viewToRender.layer renderInContext:ctx];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();


2 commentaires

Cela devrait être marqué comme la bonne réponse, au moins cela lui a fixé pour moi. CGContextTranslatectM ​​(UgraphicsgetCurrentContext (), 0, -Contentoffset.y);


Cela répond à ma question de savoir comment prendre une capture d'écran d'un UISCrollView (UitailView ou d'autre) défilé. Lorsque vous prenez une capture d'écran d'une vision de défilement qui avait été défilée, j'ai eu des barres noires la taille de mon décalage défilé. Alors merci, merci, merci.



0
votes

J'ai eu un problème similaire qui tente de reproduire le défilement du calendrier Apple lors de la modification des mois dans mon propre calendrier personnalisé construit à l'aide d'une vision utile. Après avoir appelé ScrolltorowatidExpath :, Assurez-vous que Animé: est oui pour que ScrollViewDidendscrollinganination: est appelé, dans ScrollViewDiDendscrollinganimation: J'ai appelé ReloaderData: sur la tableView avant le renduincontext :. La visualisation complète a ensuite été rendue à l'image. J'ai fini par ne pas utiliser cela à long terme, donc pas sûr de la fiabilité en tant que solution permanente, mais cela a bien fonctionné lorsque je l'ai essayé.


0 commentaires

3
votes

Le code suivant fonctionne parfaitement dans ma demande, vous pouvez utiliser ce code pour capturer une capture d'écran de la TableView ou tout autre ScrollView qui a une défilement horizontal


CGPoint offset = [_tableView contentOffset];
_tableView.contentOffset = CGPointMake(0.0, 0.0);

CGRect visibleRect = _tableView.bounds;

UIGraphicsBeginImageContextWithOptions(_tableView.contentSize, _tableView.opaque, 0.0);

[_tableView.layer renderInContext:UIGraphicsGetCurrentContext()];

while (_tipsTableView.contentSize.height>= (visibleRect.origin.y+visibleRect.size.height)) {

    visibleRect.origin.y += visibleRect.size.height;

    [_tableView scrollRectToVisible:visibleRect animated:NO];
    [_tableView.layer renderInContext:UIGraphicsGetCurrentContext()];
}

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();   

_tableView.contentOffset = offset;


0 commentaires

22
votes

Jetez un coup d'oeil à ce bibliothèque J'ai fait faire exactement cela, il a des méthodes très utiles telles que:

  1. Prenez une capture d'écran complète de votre UitailView (toutes les cellules sont rendues sur un seul uIimage)
  2. Prenez une capture d'écran pour une seule cellule donnée à son index
  3. Prenez une capture d'écran de juste les en-têtes, les pieds de page ou les rangées de votre uableview

    et plus ...

    Vous pouvez l'ajouter à votre projet via des cocoapodes ou manuellement en faisant glisser les fichiers source.

    L'utilisation est si simple: xxx

    J'espère que vous trouverez cette bibliothèque utile autant que moi.


1 commentaires

La bibliothèque la plus excitante que j'ai vue jusqu'à présent :) Merci beaucoup!



1
votes
 UITableViewCell *cell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:arrIndex inSection:0]];
 self->screenShotImage = [self imageWithView:cell isImage:YES];

0 commentaires

0
votes

Pour SWIFT 5, vous pouvez utiliser ce code

    let viewToRender = tableView;
    let contentOffset = tableView.contentOffset

    UIGraphicsBeginImageContext(viewToRender.bounds.size)

    if let ctx = UIGraphicsGetCurrentContext() {
       ctx.translateBy(x: 0, y: -contentOffset.y)

       viewToRender.layer.render(in: ctx)

       let image = UIGraphicsGetImageFromCurrentImageContext();

    }
    UIGraphicsEndImageContext();


0 commentaires