2014-07-14 18 views
6

Tam ekran görüntülenecek şekilde UICollectionViewCell nasıl yakınlaştırabilirsiniz? Bir cep dokunulduğunda ben yapıyorum UICollectionViewFlowLayout genişletilmiş ve benim görünümü kumandam var:UICollectionView tam ekran yakınlaştırma üzerinde UICollectionViewCell

CGPoint pointInCollectionView = [gesture locationInView:self.collectionView]; 
NSIndexPath *selectedIndexPath = [self.collectionView indexPathForItemAtPoint:pointInCollectionView]; 
UICollectionViewCell *selectedCell = [self.collectionView cellForItemAtIndexPath:selectedIndexPath]; 

NSLog(@"Selected cell %@", selectedIndexPath); 

buradan nereye Gerçekten emin değilim. Yakınlaştırılmış hücreyi göstermek UICollectionView mu? Veya hücrenin içeriğini (bir görüntü) tam ekranda görüntüleyen yeni bir görüntü denetleyicisi oluşturmalı mıyım?

+0

Resmi başka bir şekilde görüntülemek için başka bir denetleyiciye başvurmanız gerekiyor –

+0

Yeni bir denetleyici oluşturmak ve buna basmak/modlamak ya da yeni bir görünüm oluşturmak ve geçerli koleksiyon görünümü üzerinde göstermek çok daha kolay olacaktır. . Hücrenizi genişletmek, gereksiz bir baş ağrısına benziyor. – Stonz2

+1

@ Stonz2 Genişleyen etkiyi çok isterim. IOS'taki Facebook uygulaması bunu albümlerde yapar. –

cevap

10

here numaralı çözümü aldım ve bunun yerine koleksiyon görünümü ile çalışmak için biraz değiştirdim. Orijinal görüntüyü biraz gizlemek için şeffaf bir gri arkaplan ekledim (görüntünün çerçevenin tamamını almadığı varsayılarak).

@implementation CollectionViewController 
{ 
    UIImageView *fullScreenImageView; 
    UIImageView *originalImageView; 
} 

... 

// in whatever method you're using to detect the cell selection 

CGPoint pointInCollectionView = [gesture locationInView:self.collectionView]; 
NSIndexPath *selectedIndexPath = [self.collectionView indexPathForItemAtPoint:pointInCollectionView]; 
UICollectionViewCell *selectedCell = [self.collectionView cellForItemAtIndexPath:selectedIndexPath]; 

originalImageView = [selectedCell imageView]; // or whatever cell element holds your image that you want to zoom 

fullScreenImageView = [[UIImageView alloc] init]; 
[fullScreenImageView setContentMode:UIViewContentModeScaleAspectFit]; 

fullScreenImageView.image = [originalImageView image]; 
// *********************************************************************************** 
// You can either use this to zoom in from the center of your cell 
CGRect tempPoint = CGRectMake(originalImageView.center.x, originalImageView.center.y, 0, 0); 
// OR, if you want to zoom from the tapped point... 
CGRect tempPoint = CGRectMake(pointInCollectionView.x, pointInCollectionView.y, 0, 0); 
// *********************************************************************************** 
CGRect startingPoint = [self.view convertRect:tempPoint fromView:[self.collectionView cellForItemAtIndexPath:selectedIndexPath]]; 
[fullScreenImageView setFrame:startingPoint]; 
[fullScreenImageView setBackgroundColor:[[UIColor lightGrayColor] colorWithAlphaComponent:0.9f]]; 

[self.view addSubview:fullScreenImageView]; 

[UIView animateWithDuration:0.4 
       animations:^{ 
        [fullScreenImageView setFrame:CGRectMake(0, 
                0, 
                self.view.bounds.size.width, 
                self.view.bounds.size.height)]; 
       }]; 

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(fullScreenImageViewTapped:)]; 
singleTap.numberOfTapsRequired = 1; 
singleTap.numberOfTouchesRequired = 1; 
[fullScreenImageView addGestureRecognizer:singleTap]; 
[fullScreenImageView setUserInteractionEnabled:YES]; 

... 

- (void)fullScreenImageViewTapped:(UIGestureRecognizer *)gestureRecognizer { 

    CGRect point=[self.view convertRect:originalImageView.bounds fromView:originalImageView]; 

    gestureRecognizer.view.backgroundColor=[UIColor clearColor]; 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         [(UIImageView *)gestureRecognizer.view setFrame:point]; 
        }]; 
    [self performSelector:@selector(animationDone:) withObject:[gestureRecognizer view] afterDelay:0.4]; 

} 

-(void)animationDone:(UIView *)view 
{ 
    [fullScreenImageView removeFromSuperview]; 
    fullScreenImageView = nil; 
} 
+0

Harika. Aradığım şey bu. ÇALIŞIYOR bir cazibe gibi. Teşekkürler. – Alex

1

Sadece madde boyutu daha büyük olduğu (zaten var benzer) Başka bir düzen kullanmak ve sonra CollectionView'ın üzerinde setCollectionViewLayout:animated:completion: yapabilirsiniz.

Yeni bir denetleyiciye ihtiyacınız yok. Veri kaynağınız aynı kalıyor. Aynı hücre Sınıfını bile kullanabilirsiniz, sadece daha büyük bir hücre içeriği boyutu için ne zaman düzen yapacağını bilmediğinden emin olun.

ben [collectionView reloadData] (vb titrek ve ofset kaydırma sıfırlanmasını yol açabilirdi) olarak adlandırılan gibi görünüyor asla yani içerik hiçbir yüklenmesi olarak orada, Facebook Belgesi'nde böyle yapar eminim. Bu en doğru olası çözüm olarak görünüyor.

CGPoint pointInCollectionView = [gesture locationInView:self.collectionView]; 
NSIndexPath *selectedIndexPath = [self.collectionView indexPathForItemAtPoint:pointInCollectionView]; 
UICollectionViewCell *selectedCell = [self.collectionView cellForItemAtIndexPath:selectedIndexPath]; 

NSLog(@"Selected cell %@", selectedIndexPath); 

__weak typeof(self) weakSelf = self; 

[self.collectionView setCollectionViewLayout:newLayout animated:YES completion:^{ 

    [weakSelf.collectionView scrollToItemAtIndexPath:selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO]; 

}]; 
+0

Kağıt bunu yapmıyor - hareketleri "etkileşimli". Kullanıcının hareketi animasyonu kontrol eder. Anlayabildiğim kadarıyla, hiç kimse henüz açık kaynaklı bir fikre sahip olmadı, ama Pop/AsyncDisplayKit ile teorik olarak mümkün olmamalı. – chug2k

+1

@ chug2k, "setTransitionProgress: time:" yöntemini kullanarak https://github.com/wtmoose/TLLayoutTransitioning ile kesinlikle mümkündür. Daha önce sözü edilen OSP'yi kullanarak geçmişte benzer bir şey uyguladık. – dezinezync

1

Sorununu için uygundur MWPhotoBrowser kullanabilirsiniz. Yakınlaştırmak için Dokunma işlevine sahip Grid'i destekler.

(id <MWPhoto>)photoBrowser:(MWPhotoBrowser *)photoBrowser thumbPhotoAtIndex:(NSUInteger)index; 

: Eğer EnableGrid EVET olarak ayarlandığında özelliği sağlamak ve aşağıdaki temsilci yöntemi uygulamak gerekir, düzgün küçük resimlerin ızgarayı göstermek amacıyla here

Izgara

mal alabilirsiniz Fotoğraf tarayıcısı, startOnGrid özelliğini etkinleştirerek ızgarada da başlayabilir.