Je souhaite afficher une image (largeur: 320 pixels, hauteur: 1250 pixels) dans une vue d'image.
Lorsque je compile l'application, je n'ai aucun défilement. La vue reste fixe.
Ce que j'ai fait:
UIScrollView
via Interface Builder à ma vue.UIImageView
via Interface Builder à ma vue.UIImageView
est inférieur à UIScrollView
dans Interface Builder.UIScrollView
avec ViewDidLoad
.Comment puis-je faire cela?
Code:
- (void)viewDidLoad
{
[super viewDidLoad];
scrollView.contentSize = CGSizeMake(320, 1250);
}
Captures d'écran:
ImageView
:
ScrollView
:
Je viens de faire la même tâche .. Essayez celui-ci .....
scrollView.delegate = self;
scrollView.scrollEnabled = YES;
int scrollWidth = 120;
scrollView.contentSize = CGSizeMake(scrollWidth,80);
int xOffset = 0;
imageView.image = [UIImage imageNamed:[imagesName objectAtIndex:0]];
for(int index=0; index < [imagesName count]; index++)
{
UIImageView *img = [[UIImageView alloc] init];
img.bounds = CGRectMake(10, 10, 50, 50);
img.frame = CGRectMake(5+xOffset, 0, 50, 50);
NSLog(@"image: %@",[imagesName objectAtIndex:index]);
img.image = [UIImage imageNamed:[imagesName objectAtIndex:index]];
[images insertObject:img atIndex:index];
scrollView.contentSize = CGSizeMake(scrollWidth+xOffset,110);
[scrollView addSubview:[images objectAtIndex:index]];
xOffset += 70;
}
Réglez également celui-ci ....
imagesName = [[NSArray alloc]initWithObjects:@"image1.jpg",@"image2.jpg",@"image3.jpg",@"image4.jpg",@"image5.jpg",@"image6.png",@"image7.png",@"image9.png",nil];
images = [[NSMutableArray alloc]init];
Donc, pour moi, le problème était que la définition de la taille du contenu ne fonctionnait pas dans viewDidLoad()
. J'ai tout essayé et je ne comprenais pas pourquoi cela ne voulait pas fonctionner, puis j'ai essayé les mêmes choses dans viewDidAppear()
et cela a fonctionné comme par magie ...
D'après votre dernière capture d'écran et vos commentaires, il semble que votre scrollView soit trop grand. La vue de défilement doit être complètement visible à l'écran. Par exemple, un UIScrollView plein écran sur iPhone aurait une taille de 320 x 460.
Si la vue de défilement est de la même taille que son contenu, vous ne pouvez pas faire défiler.
Le rectangle verdâtre indique la taille de votre scrollview, le rose la taille de votre contenu (votre image):
J'ai trouvé que j'avais un problème similaire mais aucun des codes ci-dessus ne fonctionnait. Le problème était dû à la mise en page automatique. J'ai trouvé que si je désactivais la mise en page automatique en allant dans le storyboard en cliquant sur Utilitaires -> Inspecteur de fichiers et décoché Use Autolayout
le défilement a fonctionné (j'ai également défini scroll.contentSize = ...
).
Depuis Xcode 5, cela ne fonctionne plus comme avant. Le défilement à la fin d'un champ de texte défilant pose également des problèmes. Il existe également des différences entre le faire sur iPhone ou iPad. Sur iPhone, cela a fonctionné sans retardateur.
Cela a fonctionné pour moi:
- (void)viewDidLoad
{
[super viewDidLoad];
NSTimer *timerforScrollView;
timerforScrollView =[NSTimer scheduledTimerWithTimeInterval:0.1
target:self selector:@selector(forScrollView)userInfo:nil repeats:NO];
}
- (void) forScrollView {
[scrollviewPad setScrollEnabled:YES];
[scrollviewPad setContentSize:CGSizeMake(768, 1015)]; // must be greater then the size in Storyboard
}
Je suis tombé sur ce même problème sur iOS6 et la solution était d'ajuster par programme le ContentSize. Je vais donc simplement citer Raja (ci-dessus) pour montrer ceci:
CGSize scrollViewContentSize = CGSizeMake(320, 400);
[self.scrollView setContentSize:scrollViewContentSize];
REMARQUE: je n'avais pas ce problème sur iOS5 .. il semble que iOS6 ait décidé de faire beaucoup de farces tout comme la saga rotation/orientation
Swift 4, iOS 11
La façon la plus simple d'utiliser la mise en page automatique:
N'oubliez pas d'ajouter le catégorie protocole à l'interface, comme celui-ci
@interface MyViewController : <UIScrollViewDelegate>
Si vous ne le faites pas, vous ne pourrez pas définir le délégué de la vue de défilement sur self
(c'est à dire. [MyScrollView setDelegate:self];
)
Si vous faites cela, cela devrait fonctionner.
Mon code est:
-(void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[contentScrollView setDelegate:self];
[contentScrollView setScrollEnabled:YES];
contentScrollView.contentSize = CGSizeMake(310, 500);
contentScrollView.frame = CGRectMake(5, 188, 310, 193);
}
Parfois, la case à cocher AutoLayout est cochée dans le xib. Cela crée également ce problème dans xcode 5. Ce qui rend le défilement UIScrollView désactivé.
Avez-vous affecté le délégué de vue du défilement? Souvenez-vous toujours de ceux-ci:
[self.scrollView setDelegate:self];
[self.scrollView setScrollEnabled:YES];
La vue de l'image doit être une sous-vue (donc à l'intérieur ET en dessous) de la vue de défilement. D'après votre description, il semble qu'ils soient parallèles
Vous avez oublié une ligne. Ajoutez ceci à votre fonction de chargement de vue:
[scrollView setScrollEnabled:YES];
Vous pouvez essayer de désactiver la mise en page automatique. Dans XCode 5, j'ai testé toutes les réponses ci-dessus et je n'ai pu le faire défiler qu'en désactivant la mise en page automatique et en activant tous les masques de redimensionnement automatique sous l'inspecteur de taille. Le code suivant a également été utilisé:
self.scrollView.contentSize = CGSizeMake(320, 900);
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.frame = self.view.frame;
Ajoutez simplement du code
scrollView.contentSize = CGSizeMake(WIDTH,HEIGHT);
à la méthode - ((void) viewDidLayoutSubviews. Pour plus d'informations, consultez le cours n ° 8 de Stanford CS193p pour comprendre le cycle de vie du contrôleur de vue.
J'ai eu le même problème et recherchais la réponse dans ce fil. J'ai essayé tout ça, mais rien ne fonctionne. Ensuite, j'ai trouvé ceci:
.
Il vous suffit de désélectionner "Utiliser la mise en page automatique" dans l'inspecteur de fichiers de votre ViewController
. Ta-Da, ça marche immédiatement pour moi. Prendre plaisir.
CGRect scrollViewFrame = CGRectMake(0, 0, 320, 400);
self.scrollView = [[UIScrollView alloc] initWithFrame:scrollViewFrame];
[self.view addSubview:self.scrollView];
CGSize scrollViewContentSize = CGSizeMake(320, 400);
[self.scrollView setContentSize:scrollViewContentSize];
scrollView.delegate = self;
[self.scrollView setBackgroundColor:[UIColor blackColor]];
[scrollView setCanCancelContentTouches:NO];
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
scrollView.clipsToBounds = YES;
scrollView.scrollEnabled = YES;
scrollView.pagingEnabled = YES;
NSUInteger nimages = 0;
CGFloat cx = 0;
for (; ; nimages++) {
NSString *imageName = [NSString stringWithFormat:@"image%d.jpg", (nimages + 1)];
UIImage *image = [UIImage imageNamed:imageName];
if (image == nil) {
break;
}
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
CGRect rect = imageView.frame;
rect.size.height = image.size.height;
rect.size.width = image.size.width;
rect.Origin.x = ((scrollView.frame.size.width - image.size.width) / 2) + cx;
rect.Origin.y = ((scrollView.frame.size.height - image.size.height) / 2);
imageView.frame = rect;
[scrollView addSubview:imageView];
[imageView release];
cx += scrollView.frame.size.width;
}
[scrollView setContentSize:CGSizeMake(cx, [scrollView bounds].size.height)];
En supposant que scrollView est une sous-vue de la vue et la remplit entièrement, vous pouvez utiliser ce qui suit dans viewDidLoad:
[scrollView setContentSize: CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)];
J'avais un UIScrollView qui ne défilait pas et cela lui permettait de défiler.