2011-09-05 6 views
5

Mon UIScrollView est rempli avec un grand contenu, puis zoomée avec « setZoomScale: animation », telle qu'elle s'inscrit dans le cadre de scrollview. La vue apparaît correctement agrandie et correctement positionnée dans le scrollview. Cependant, l'utilisateur est capable de faire défiler le contenu (la couleur d'arrière-plan du défilement apparaît). Il semble qu'il peut faire défiler jusqu'à la taille du contenu d'origine (comme si le contenu n'avait pas été dézoomé). Assez étrangement, après que l'utilisateur zoome manuellement la première fois, tout fonctionne bien, et le scrollview est de nouveau contraint à la taille du contenu.défile trop loin UIScrollView après zoom initial

J'ai cherché sur le web, et passé par la documentation et des exemples d'Apple, mais ne pouvait pas trouver quelqu'un ayant le même problème. Les exemples Apple semblent montrer la même chose que moi.

Mon contenu est une vue personnalisée qui est dérivé de UIView, et dont CALayer est remplacé par un CATiledLayer (comme dans les exemples d'Apple). Le dessin que je fais moi-même dans drawLayer: inContext :.

Voici un extrait de code MyScrollViewController:

- (void)loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    double zoomScale = 0.5; // hardcoded for testing 
    [scrollView setZoomScale:zoomScale animated:NO]; 
NSLog(@"zoomscale=%g contentview=%@ contentsize=%@", zoomScale, NSStringFromCGSize(theContentView.bounds.size), NSStringFromCGSize(scrollView.contentSize)); 

    [scrollView release]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return theContentView; 
} 

La déclaration NSLog montre une contentSize et zoomscale ...

correctement réglé Espérant il y a quelque chose d'évident que je manque ...

+0

Quelqu'un avait-il une solution pour cela? J'ai le même problème, juste l'inverse. Mon Scrollview est trop petit pour afficher l'image contenue (je ne peux pas faire défiler vers le bas de l'image) Mais après le zoom une fois que tout va bien. Je – Maverick1st

+1

a fini par régler la zoomScale sur la prochaine runloop (au lieu de directement à partir loadview), qui a travaillé: "[auto performSelector @selector (initialZoom) withObject: néant afterDelay: 0];". Mais j'ai aussi réécrit beaucoup d'autres choses, donc je ne suis pas sûr que ce soit la seule chose nécessaire. – fishinear

+0

J'ai finalement eu la même idée et ça fonctionne parfaitement. Un bonus que vous obtenez, lors du réglage du zoomscale dans viewDidAppear est, que l'utilisateur voit un zoom animé et connaît ainsi, l'image qu'il voit est zoomable :) – Maverick1st

Répondre

3

Je fini par régler la zoomScale sur la prochaine runloop (au lieu de directement à partir loadview), qui a travaillé:

- (void) loadView { 
    CGRect frame = [UIScreen mainScreen].applicationFrame; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:frame]; 
    scrollView.maximumZoomScale=1.0; 
    scrollView.delegate = self; 

    ... setup theContentView ... 

    scrollView.contentSize = theContentView.bounds.size; 
    scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20); 
    [scrollView addSubview:theContentView]; 
    self.view = scrollView; 

    // set the zoom level on the next runloop invocation 
    [self performSelector:@selector(initialZoom) withObject:nil afterDelay:0]; 

    [scrollView release]; 
} 

- (void) initialZoom { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:NO]; 
} 

Une autre possibilité, suggérée par Maverick1st, est de mettre la zoomscale de viewDidAppear, plutôt que loadview . Cette approche a l'avantage supplémentaire de montrer une animation du zoom, indiquant à l'utilisateur que la vue commence dans un état zoomé.

- (void) viewDidAppear { 
    double zoomScale = 0.5; // hardcoded for testing 
    UIScrollView *scrollView = (UIScrollView *) self.view; 
    [scrollView setZoomScale:zoomScale animated:YES]; 
} 
1

Je suis nouveau à ce sujet, mais vous pouvez essayer de découper les sous-vues. J'ai créé une vue de défilement avec le constructeur d'interface, et là dans l'inspecteur d'attributs était une sous-vue de clip de case à cocher, donc je pense que vous devriez faire quelque chose comme cela, seulement par programmation. J'espère que cela pourra aider.

Questions connexes