web-dev-qa-db-fra.com

iOS - UIScrollView ne fonctionne pas (il ne défile pas du tout - l'image reste fixe)

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:

  1. Ajout d'un UIScrollView via Interface Builder à ma vue.
  2. Ajout d'un UIImageView via Interface Builder à ma vue.
  3. Vérifié que UIImageView est inférieur à UIScrollView dans Interface Builder.
  4. Définissez la taille de UIScrollView avec ViewDidLoad.

Comment puis-je faire cela?

Code:

- (void)viewDidLoad
{
    [super viewDidLoad];
    scrollView.contentSize = CGSizeMake(320, 1250);
}

Captures d'écran:

ImageView:

Enter image description here

ScrollView:

Enter image description hereEnter image description here

Enter image description here

23
user1010563

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];
27
Krunal

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 ...

26
gitaarik

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):

enter image description here

10
Matthias Bauch

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 = ...).

6
Julius

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
}
6
Walter Schurter

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

6
Khayrattee

Swift 4, iOS 11

La façon la plus simple d'utiliser la mise en page automatique:

  1. Ajoutez UIScrollView et épinglez-le 0,0,0,0 à la vue d'ensemble (ou à la taille souhaitée)
  2. Ajoutez UIView dans ScrollView, épinglez-le 0,0,0,0 sur les 4 côtés et centrez-le horizontalement et verticalement.
  3. Dans l'inspecteur de taille, changez la priorité "bas" et "aligner le centre Y" à 250.
  4. Ajoutez toutes les vues dont vous avez besoin dans cette vue. N'oubliez pas pour définir la contrainte inférieure sur la vue la plus basse.
4
Đorđe Nilović

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);
}
3
werdsackjon

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é.

3
Vinay Kumar

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];
2
Alex Salom

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

1
Tomen

Vous avez oublié une ligne. Ajoutez ceci à votre fonction de chargement de vue:

[scrollView setScrollEnabled:YES];
1
Sirens

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;
1
jturolla

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.

0
iOS_Dev

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:

deselect Use Auto Layout.

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.

0
Watsche
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)];
0
codercat

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.

0
cdavidyoung