10
votes

Définir tout contenu qui approche des bords d'Uiscrollview

Comme le dit le titre, j'essaie de donner à certains uiimageviews un effet de décoloration lorsqu'ils se rapprochent de l'un des quatre bords de mon UiscrollView. Étant donné que l'utilisateur peut faire glisser les umisages, s'il les glisse vers les bords, ils commencent à s'effacer, au lieu de donner l'effet coupé comme s'il y avait des frontières à l'UiscrollView. J'ai essayé ce tutoriel:

http://www.cocoanetics.com/2011 / 08 / Ajout de dégradés-fadades-to-UitablesView /

suggéré dans une autre question de dépassement de la pile, mais elle ne peut être appliquée que sur les vitables. J'aimerais que l'image commence à se décolorer car elle obtient un centimètre loin de la frontière.


1 commentaires

Pourquoi ne fonctionnera-t-il pas dans une vision utile?


3 Réponses :


2
votes

Couple de publications sur ce numéro ici:

Changer l'alpha à l'intérieur Uiscrollview

définir alpha pour uiview est une sous-vision de UiscrollView très lente

et un exemple de code ici:

https://gist.github.com/maximkeegan/2478842


Si vous voulez aller à votre façon, achetez d'abord la partie visible de l'UISCrollView:

Obtenir le record Visible d'un contenu d'un UISCrollView < / p>

puis fonduez l'UIView:

frontière uIView avec effet de fondu ou flou


0 commentaires

19
votes

Semblable à ce qui a été fait dans le poste de cocoanétique, vous pouvez créer un cagradientlayer code> pour couvrir la vue de votre défilement. Faites-la disparaître à gauche, à droite, aux bords supérieurs et inférieurs, en utilisant la couleur d'arrière-plan de votre vue de défilement (dans mon exemple, blanc):

   CGColorRef innerColor = [UIColor colorWithWhite:1.0 alpha:0.0].CGColor;
   CGColorRef outerColor = [UIColor colorWithWhite:1.0 alpha:1.0].CGColor;

   // first, define a horizontal gradient (left/right edges)
   CAGradientLayer* hMaskLayer = [CAGradientLayer layer];
   hMaskLayer.opacity = .7;
   hMaskLayer.colors = [NSArray arrayWithObjects:(id)outerColor,
                        (id)innerColor, (id)innerColor, (id)outerColor, nil];
   hMaskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],
                           [NSNumber numberWithFloat:0.15],
                           [NSNumber numberWithFloat:0.85],
                           [NSNumber numberWithFloat:1.0], nil];
   hMaskLayer.startPoint = CGPointMake(0, 0.5);
   hMaskLayer.endPoint = CGPointMake(1.0, 0.5);
   hMaskLayer.bounds = self.scrollView.bounds;
   hMaskLayer.anchorPoint = CGPointZero;

   CAGradientLayer* vMaskLayer = [CAGradientLayer layer];
   // without specifying startPoint and endPoint, we get a vertical gradient
   vMaskLayer.opacity = hMaskLayer.opacity;
   vMaskLayer.colors = hMaskLayer.colors;
   vMaskLayer.locations = hMaskLayer.locations;
   vMaskLayer.bounds = self.scrollView.bounds;
   vMaskLayer.anchorPoint = CGPointZero;

   // you must add the masks to the root view, not the scrollView, otherwise
   //  the masks will move as the user scrolls!
   [self.view.layer addSublayer: hMaskLayer];
   [self.view.layer addSublayer: vMaskLayer];


6 commentaires

Est-ce une couverture statique pour l'ensemble de la vision de Scrollie ou du rect Visible dynamique?


C'est une couverture statique, mais elle est ajoutée à la vue root , pas la vue de défilement elle-même. Vous ne voulez pas que la couverture fait défiler réellement avec le contenu. Ou, par dynamique , demandez-vous si la couverture démarre cachée, puis apparaît dynamiquement une fois que le défilement a commencé? Non, ça ne fait pas ça. Je n'ai pas vu cela dans la description de la question et pense que cela pourrait sembler drôle de toute façon.


Par Dynamic, je veux dire que si la taille du contenu d'une vision de ScrollView est quelque chose comme 2000 d'ici 2000, le flou se produit-il sur les bords de 2000 d'ici 2000 ou se produit-il dans la zone visible de manière dynamique que la zone visible est déplacée par l'utilisateur?


Cette solution n'a rien à voir avec Taille du contenu . Cela ne se soucie pas des éléments de décomposition qui sont hors écran, seulement ce qui est visible. C'est pourquoi l'effet de fondu est appliqué aux frontières de la zone visible. Il est ajouté à la page racine , qui ne bouge pas. Par conséquent, il n'a pas à s'inquiéter de quelle partie de la vue de défilement est visible. Cela ne fait rien à la vue de défilement. Un gradient transparent, de la même couleur que l'arrière-plan, est appliqué ci-dessus la vue de défilement, pour le faire apparaître comme si le contenu s'estompe près des bords. Lisez-vous la question différemment?


Pas du tout. Vous avez un code vraiment élégant et je voulais confirmer ce que je pensais avoir fait (trop paresseux pour essayer votre code en ce moment).


Je verrai votre trop paresseux en ce moment, et vous soulever un ScreenCast YouTube . Une vidéo vaut clairement 1000 ^ 2 mots :)



3
votes

Version SWIFT de Nate Réponse, mais uniquement pour le haut et le bas:

        let innerColor = UIColor(white: 1.0, alpha: 0.0).CGColor
        let outerColor = UIColor(white: 1.0, alpha: 1.0).CGColor;

        // define a vertical gradient (up/bottom edges)
        let colors = [outerColor, innerColor,innerColor,outerColor]
        let locations = [0.0, 0.15,0.85,1.0]

        var vMaskLayer : CAGradientLayer = CAGradientLayer()// layer];
        // without specifying startPoint and endPoint, we get a vertical gradient
        vMaskLayer.opacity = 0.7
        vMaskLayer.colors = colors;
        vMaskLayer.locations = locations;
        vMaskLayer.bounds = self.scrollView.bounds;
        vMaskLayer.anchorPoint = CGPointZero;

        // you must add the mask to the root view, not the scrollView, otherwise
        //  the masks will move as the user scrolls!
        self.view.layer.addSublayer(vMaskLayer)


0 commentaires