6 votes

Rendu du contenu après un zoom avant pour UIScrollView

J'ai cherché un peu partout et il semble que les gens disent qu'il est possible de rendre à nouveau les données après avoir effectué un zoom avant, maintenant que vous connaissez le facteur d'échelle de UIScrollView. J'ai également vu des articles sur la transformation de votre couche en CATiledLayer et sur la définition des levelsOfDetailBias et levelsOfDetail.

J'ai un UIScrollView, et dans celui-ci, un ResultsView qui est une sous-classe de UIView :

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        CATiledLayer *tiledLayer = (CATiledLayer *)self.layer;
        tiledLayer.levelsOfDetailBias = 3;
        tiledLayer.levelsOfDetail = 3;
        self.opaque = YES;
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

+ (Class)layerClass {
    return [CATiledLayer class];
}

Dans ma classe où j'ai le UIScrollView et le ResultsView, je le fais :

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.ResultsView;
}

Cela suffit-il pour que le texte soit rendu à nouveau (net) ? Ou dois-je implémenter quelque chose dans

 - (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
 }

Si c'est le cas, je ne sais pas comment faire. Dans ma classe avec UIScrollView et ResultsView, dans ResultsView (dans le XIB), j'ai juste quelques UILabels et UIViews (UIViews utilisés pour les en-têtes/pieds de page de la vue). Je ne sais donc pas comment les redessiner à partir de ResultsView. Bien que ResultsView ait les UILabels et les UIViews comme enfants dans le XIB, je ne suis pas sûr de la façon dont je pourrais les redessiner à partir de la classe ResultsView, ni de ce que je devrais faire de toute façon.

Ou est-ce la mauvaise approche ? Dois-je simplement redimensionner les UILabel et UIView en fonction du facteur d'échelle dans la méthode du délégué scrollViewDidEndZooming: ? TIA

20voto

afarnham Points 1750

Je pense que vous adoptez la mauvaise approche. Si votre vue consiste en UILabels et UIViews qui ne font pas de dessin personnalisé, je ne m'embêterais pas à utiliser une vue soutenue par CATiledLayer. Implémentez plutôt la méthode de délégué scrollViewDidEndZooming:withView:atScale : et faites quelque chose comme ceci :

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    scale *= [[[self.scrollView window] screen] scale];
    [view setContentScaleFactor:scale];
    for (UIView *subview in view.subviews) {
        [subview setContentScaleFactor:scale];
    }
}

4voto

DiscDev Points 8087

J'ai une petite chose à ajouter à la solution acceptée qui m'a causé quelques minutes de souffrance, au cas où quelqu'un d'autre rencontrerait la même chose.

Le fait de passer en revue toutes les sous-vues de la vue sur laquelle vous effectuez un zoom et d'appeler setContentScaleFactor ne tient pas compte du fait que les sous-vues ont elles-mêmes des sous-vues. Si vous avez une configuration plus compliquée comme celle-là, assurez-vous de passer en boucle par les sous-vues de ces vues conteneur et d'appeler

[subview setContentScaleFactor:scale];

sur chacun. J'ai créé une méthode que je peux invoquer pour appeler setContentScaleFactor sur toutes les sous-vues d'une vue donnée et appeler cela pour chaque "vue conteneur" sur l'écran.

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale 
{
    scale *= [[[self.scrollView window] screen] scale];
    [view setContentScaleFactor:scale];
    for (UIView *subview in view.subviews) 
    {
        [self setContentSizeForView:subview andScore:scale];

        //Loop through all the subviews inside the subview
        for(UIView *subSubview in subview.subviews)
        {
            [self setContentSizeForView:subSubview andScale:scale];
        }
    }
}

- (void) setContentSizeForView:(UIView*) view andScale:(float)scale
{
    [view setContentScaleFactor:scale];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X