J'ai essayé - p> Comment puis-je afficher plusieurs images dans ScrollView? p> p>
7 Réponses :
Vous allouez et continuez d'ajouter les images qui causant l'accident de la mémoire comme toutes les images prenant la mémoire de périphérique, il existe de nombreuses solutions qui construisent pour montrer les images et le mieux utilisent l'uicollectionview qui charge uniquement les images qui montrent le filtrer. Vous allez pour n'importe quel bon tutoriel qui peut vous montrer comment le faire, voici le Référence < / a> p>
désolé ce n'est pas le travail que j'ai utilisé uicollectionview, UitailView et ScrollVoir tous sont les mêmes résultats.Je ont obtenu les images du répertoire de documents
Vous pouvez essayer avec utableview. Supposons que vous ayez N nombre d'images alors -
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// 3 is numbers of images per row
if (n/3 *3 == n)
return n/3;
return n/3 +1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
}
int x=5,y=15;
UIImageView* imgView1=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 93, 110)];
imgView1.image=[UIImage imageNamed:[imgarr objectAtIndex:indexPath.row + 0]];
x+=103;
UIImageView* imgView2=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 93, 110)];
imgView2.image=[UIImage imageNamed:[imgarr objectAtIndex:indexPath.row + 1]];
x+=103;
UIImageView* imgView2=[[UIImageView alloc]initWithFrame:CGRectMake(x, y, 93, 110)];
imgView2.image=[UIImage imageNamed:[imgarr objectAtIndex:indexPath.row + 2]];
[cell.contentView addSubview:imgView1];
[cell.contentView addSubview:imgView2];
[cell.contentView addSubview:imgView3];
return cell;
}
Avez-vous essayé ce qu'est-ce que "[imgarr uteTindex: indexpath.row + 0]" est retourné. Je pense qu'il affiche des images en double.
Create custom class of collection view cell
and You can pass image name in array.
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController<UICollectionViewDataSource,UICollectionViewDelegate>
@property (weak, nonatomic) IBOutlet UICollectionView *Collection;
@end
#import "ViewController.h"
#import "CustomCell.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.Collection registerClass:[CustomCell class] forCellWithReuseIdentifier:@"cell"];
[self.Collection registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellWithReuseIdentifier:@"cell"];
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 5;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 4;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
CustomCell * cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
cell.imgview.image=[UIImage imageNamed:@"XYZ.png"];
return cell;
}
Peut-être que NScache peut vous aider. P>
1 Lorsque vous affichez une image à l'index 10.Vous pouvez cache image 5-9 et 11-16 à NSCACHE / P>
2 Lorsque ScrollView démarrez le défilement, obtenez l'image de NSCACHE dont vous avez besoin et supprimez l'objet que vous n'avez pas besoin d'afficher. P>
3 Je pense que cela peut être efficace. Apple fournit une démonstration de la manière dont ils gèrent les actifs massifs à l'aide de caches et de l'uicollectionview.Vous voyez-le. P>
Le conseil d'autres personnes ont donné pour passer à un Si vous avez un fichier image qui ne sera affiché qu'une fois et souhaite
Assurez-vous de ne pas être ajouté au cache du système, vous devriez
Créez plutôt votre image à l'aide de l'imageWithContentsOffle :. Cette volonté
Gardez votre image à usage unique hors du cache de l'image système, potentiellement
Améliorer les caractéristiques d'utilisation de la mémoire de votre application. P>
blockQuote>
La commutation sur cette méthode empêchera les crashs, si vous ne vous chargeez que dans la mémoire que vous avez besoin. UicollectionView rend ce trivial, car vous ne pouvez que charger l'image lorsque la vue Collection vous demande de remplir un objet cellulaire dans son uicollectionview code> est bon, mais il a manqué la vraie faille de votre code: la méthode Imagenamed: code> de uiImage code> conserve toutes les 70 de vos images en mémoire pour toujours. Par les docs: p>
CollectionView: CORETFORITEMATDEXPATH: code> Méthode. p>
La relevé @AutyeleeePool fait le même travail qu'auparavant, au lieu d'utiliser la classe NsAutoreleeePool. La façon dont le NsautoreleeePool a travaillé était un peu bizarre, car la création d'un effet sur l'ensemble de l'application; @AutyeleeePool crée une zone étendue et rend plus claire ce qui se trouve dans la piscine et quand il se draine (quand il est hors de portée). Il est également plus efficace selon Apple. P>
Le concept d'une piscine Autoréleuillet est simple, chaque fois qu'une instance d'objet est marquée comme AutoReleed (par exemple Nstring * Str = [[[[[[Nstring Alloc] Initwithstring: @ "Bonjour"] Autoréleuil];), il aura une conserver Compte de +1 à ce moment-là, mais à la fin de la boucle de course, la piscine est drainée et tout objet marqué Autoréleuillet a alors son retenue décompte décrémentée. C'est une façon de garder un objet autour pendant que vous vous préparez tout ce qui le conservera pour lui-même. P>
avec arc, tandis que le mot clé Autoréleuillet n'est pas utilisé par le développeur, le système sous-jacent qui gère les insertions d'arc qui vous convient. (Rappelez-vous: tout arc fait est d'insérer des appels de conserver, de libération et d'autorelease pour vous à la période appropriée). Pour cette raison, le concept d'AutoreleePool existant doit rester autour. P>
Si vous retirez la piscine Autoréleuillet, vos objets vont commencer à fuir
Pour plus de détails Vérifiez ici P >
J'ai également fait face à ce même problème que j'ai résolu à l'aide de la ligne simple.
Essayez d'utiliser ceci: CODE> P> au lieu d'utiliser ceci: code> p> [yourCell.imageview setImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"yourImage" ofType:@"png"]]];
UIIMAGE ImageWithContentsOffile:] Code> Est-ce que i> consume la mémoire - c'est juste que ce ne sera pas permanent. En outre, juste parce que vous peut i> obtenir des images de toute URL à l'aide de cette méthode ne signifie pas que vous devrait i>; Cette méthode est synchrone et ne doit donc jamais être appelée à partir du fil principal dans un tel scénario.
Oui, et c'est pourquoi le questionnaire avait un problème. Cette mémoire sera libérée. et deuxièmement, l'URL dépend de la logique du questionnaire. Son juste une option mon pote. et encore une chose. Avez-vous vaincu et commenté cela pour justifier votre bowvote?
Vous dites "ne consomme pas de mémoire", pas "ne reste pas en mémoire après sa publication." Il y a une grande différence. Quant à la chose "URL distante", ce n'est qu'une option si vous ne vous souciez pas de la qualité de votre logiciel. La documentation Apple sur des méthodes similaires ( [nsdata DatawithContentsofurl:] code>) explicitement i> dit de ne pas faire cela.
Vous ne pouvez pas simplement modifier ma réponse au lieu de la descendre ...?
Pouvez-vous s'il vous plaît expliquer pourquoi vous utilisez si (x <= 211)? Essayez-vous de montrer toutes les images à horizontale ou verticale?
ScrollView n'est pas une meilleure approche pour montrer plusieurs images. Uicollectionview est une meilleure approche pour montrer l'image parce que sa réutilisable. Dans ScrollView à chaque fois que vous affectation de mémoire, toutefois, l'application se bloque ou prendra trop de charge.
J'ai essayé à la fois UiscrolView et Uicollectionview mais que les résultats sont identiques.
Il sera préférable d'utiliser Uicollectionview au lieu de ScrollView comme dans la vue Uicollection, nous sommes en mesure de créer une cellule réutilisable.
@sohil s'il vous plaît consommez votre prime de manière meilleure, vous consommez la période de grâce maintenant
@sohil Supprimer la vue de la vue et utiliser la vue de collection
Parce que la vue de défilement maintient continuellement la vue de la mémoire et de la collection libérera la mémoire si nécessaire
Merci @kaushikMovaliya pour avoir répondu à une très vieille question. Alors, quelle est la solution? Aidez-moi, s'il vous plaît.