9
votes

zoom uicollectionview totale

J'ai une application iPad où j'utilise un uicollectionview et chaque uicollectionviewcell contient juste un seul uIimage. Actuellement, j'affiche par 9 uiimages (3 lignes * 3 colonnes) par page, j'ai plusieurs pages.

J'aimerais utiliser Pinch geste pour zoomer sur l'ensemble de l'uicollectionview pour augmenter / diminuer le nombre de lignes / colonnes affichées. par page et le meilleur serait d'avoir une belle animation de zoom pendant le geste de la pincée!

Actuellement, j'ai ajouté un geste de pincement sur mon uicollectionview. J'attrape l'événement de la pincement de la pincée pour calculer le nombre de lignes / colonnes à l'aide du facteur d'échelle, si elle a changé, je mettez la mise à jour de l'uicollectionvie complète à l'aide de: xxx ÇA fonctionne mais je Vous n'avez pas d'animation lisse pendant la transition.

aucune idée? UicollectionView hérités de UiscrollView, est-il possible de réutiliser la fonctionnalité Uiscrollview pinch Pinch pour atteindre mon objectif?


0 commentaires

3 Réponses :


1
votes

Désolé pour ma question de 2 cents, j'ai trouvé la solution, très simple.

dans mon Pinchgesture code> Callback Je viens de faire ce qui suit: P>

void (^animateChangeWidth)() = ^() {
    _theFlowLayout.itemSize = cellSize;
};

[UIView transitionWithView:self.theCollectionView 
                  duration:0.1f 
                   options:UIViewAnimationOptionCurveLinear 
                animations:animateChangeWidth 
                completion:nil];


2 commentaires

Ce n'est pas la bonne façon de gérer la mise à l'échelle, vous forcez fondamentalement un redessinement de l'ensemble de la collectionView, lorsque cette fonctionnalité est déjà prise en charge par Invalidation de la mise en page [CollectionView.CollectionvievidAlayout] . J'ai laissé une réponse avec une explication et un exemple plus minutieux.


S'il vous plaît, pouvez-vous ajouter plus de détails à ce sujet?



30
votes

Je suppose que vous utilisez l'uicollectionViewelegategategategateGategateFLOWLAYOUT, non? Ensuite, assurez-vous de réagir en conséquence aux méthodes déléguées et lorsque le geste de pincement se produit, invalider simplement la mise en page.

Par exemple, si je veux régler la taille de chaque élément, en pinçant: P>

@interface ViewController () <UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@property (nonatomic,assign) CGFloat scale;
@property (nonatomic,weak)   IBOutlet UICollectionView *collectionView;

@end

@implementation ViewController
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scale = 1.0;

    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];

    UIPinchGestureRecognizer *gesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(didReceivePinchGesture:)];
    [self.collectionView addGestureRecognizer:gesture];

}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return CGSizeMake(50*self.scale, 50*self.scale);
}

- (void)didReceivePinchGesture:(UIPinchGestureRecognizer*)gesture
{
    static CGFloat scaleStart;

    if (gesture.state == UIGestureRecognizerStateBegan)
    {
        scaleStart = self.scale;
    }
    else if (gesture.state == UIGestureRecognizerStateChanged)
    {
        self.scale = scaleStart * gesture.scale;
        [self.collectionView.collectionViewLayout invalidateLayout];
    }
}


5 commentaires

+1 merci! Vérifié votre démo et sa vraiment utile. Pouvez-vous guider comment nous pouvons montrer ces transitions avec une belle animation ... Je suis un débutant à Uicollectionview.


Une bonne réponse, curieuse si vous avez une idée de ce qu'il faut faire si la mise en page est plus «réparée» et que vous souhaitez zoomer in / out et panoramique (ne pas déplacer les éléments). Pensez à une carte par exemple avec des éléments sur la carte étant uicollectioncells et des carreaux potentiellement réutilisables ou similaires.


@Mobilevet pour ma thèse J'ai écrit une uicollectionviewlayout personnalisée qui crée quelque chose comme une carte, et c'est tout à fait possible. Si vous faites la taille du contenu que la mise en page de la vue de la collection rapporte plus d'une facteur d'échelle, vous pouvez également avoir un zoom et votre panoramique.


Que cela fait par inadvertance le contenu beaucoup plus grand que cela n'a besoin d'être, non? : /


@fatuhoku bien, oui. Quelle est votre préoccupation?



0
votes

pour xamarin.ios développeurs j'ai trouvé cette solution: ajoutez un élément UiscrollView à la vue principale et ajoutez l'uicollectionview comme élément de l'Uiscrollview. Ensuite, créez un délégué de zoom pour l'Uiscrollview.

MainScrollView = new UIScrollView(new CGRect(View.Frame.X, View.Frame.Y, size.Width, size.Height));

        
        _cellReuseId = GenCellReuseId();

        _contentScroll = new UICollectionView(new CGRect(View.Frame.X, View.Frame.Y, size.Width, size.Height), new InfiniteScrollCollectionLayout(size.Width, size.Height));
        
        _contentScroll.AllowsSelection = true;
        _contentScroll.ReloadData();


        _contentScroll.Center = MainScrollView.Center;
        _contentScroll.Frame = new CGRect(_contentScroll.Frame.X, _contentScroll.Frame.Y - 32, _contentScroll.Frame.Width, _contentScroll.Frame.Height);
        MainScrollView.ContentSize = _contentScroll.ContentSize;
        MainScrollView.AddSubview(_contentScroll);
        MainScrollView.MaximumZoomScale = 4f;
        MainScrollView.MinimumZoomScale = 1f;
        MainScrollView.BouncesZoom = true;
        MainScrollView.ViewForZoomingInScrollView += (UIScrollView sv) =>
        {
            if (_contentScroll.Frame.Height < sv.Frame.Height && _contentScroll.Frame.Width < sv.Frame.Width)
            {
                _contentScroll.Center = MainScrollView.Center;
                _contentScroll.Frame = new CGRect(_contentScroll.Frame.X, _contentScroll.Frame.Y - 64, _contentScroll.Frame.Width, _contentScroll.Frame.Height);
                _contentScroll.BouncesZoom = true;
                _contentScroll.AlwaysBounceHorizontal = false;
            }
            return _contentScroll;
};


0 commentaires