2013-01-23 12 views
7

ArkaplaniOS 6.0: UICollectionView karoların bir sayfalık yatay kaydırma görünümünü elde etmek için bir çaba içinde pagingEnabled

ben UICollectionView (ilk kez) bir uygulamaya am ile clipsToBounds saygı göstermiyor. Çerçevenin ortasındaki her kiremitin solda ve sağda kısmen görünür kardeşi fayanslarıyla gösterilmesini isterim (Safari uygulamasında sayfa seçici gibi bir şey). Dahili hücre dequeueing yararlanmak için UICollectionView kullanarak ilgileniyor ve döndürme UITableView kullanmamayı tercih ediyorum.

Sayı

ben buluyorum sorunu pagingEnabled = YES ve clipsToBounds = NO kullanırken, UICollectionView en kısa sürede çağrı tamamlanır tamamlanmaz (onlar visibleCells dizide değiliz) collectionView çerçevenin dışında hücreleri kaldırır olmasıdır. Bu temel kurulumu korurken, kız kardeşlerin önizlemelerini gösterme etkisinin nasıl elde edileceği konusunda tavsiyelerde bulunabilir mi? Yoksa buna yanlış mı yaklaşıyorum?

Ekran ekranı kaydırma scrolling ucunun end

kaydırma

başlangıç ​​ start tam doğrudur. Ama başlangıç ​​ve bitiş fotoğraflarında mavi kenarlarda yeşil görünmesini istiyorum. Ben CollectionView'ın konusunda uzman değilim

#import "AppDelegate.h" 

@interface ViewController : UICollectionViewController 
@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"ID"]; 
    [self.view setBackgroundColor:[UIColor blueColor]]; 
    // pad the collection view by 20 px 
    UIEdgeInsets padding = UIEdgeInsetsMake(20.0, 20.0, 20.0, 20.0); 
    [self.collectionView setFrame:UIEdgeInsetsInsetRect(self.view.frame, padding)]; 
    // set pagingEnabled and clipsToBounds off 
    [self.collectionView setPagingEnabled:YES]; 
    [self.collectionView setClipsToBounds:NO]; 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return 5; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ID" forIndexPath:indexPath]; 
    UILabel *label = [[UILabel alloc] initWithFrame:cell.bounds]; 
    label.textAlignment = NSTextAlignmentCenter; 
    label.text = [NSString stringWithFormat:@"%d", indexPath.row]; 
    [label setBackgroundColor:[UIColor greenColor]]; 
    [cell.contentView addSubview:label]; 
    return cell; 
} 
@end 

@implementation AppDelegate 
{ 
    ViewController *vc; 
} 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // setup the UICollectionViewFlowLayout 
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 
    layout.itemSize = CGSizeMake(280, 280); 
    layout.minimumInteritemSpacing = 0; 
    layout.minimumLineSpacing = 0; 
    layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; 
    // add a custom UICollectionViewController to the window 
    vc = [[ViewController alloc] initWithCollectionViewLayout:layout]; 
    self.window.rootViewController = vc; 
    self.window.backgroundColor = [UIColor yellowColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
@end 

cevap

9

Bu sorunun çözümü aslında oldukça basittir. Sadece, UICollectionViewCell hücrelerini, disk belleği kaydırma işlemleri bittikten sonra collectionView'ın karesi içinde gösterilmeleri için yeterli pikselle çakıştırmam gerekiyordu. Alakalı kodu

layout.itemSize = CGSizeMake(300, 300); 
layout.minimumLineSpacing = -20.0; 

oldu ve UICollectionViewFlowLayout sınıflandırma ve hücrelerin olmayan üst üste gelen boyutu geri (CGSize)collectionViewContentSize yöntem overrode.

+0

Bunun, 6 veya daha fazla hücreye sahip olana kadar çalıştığını gördük, bu noktada hücreler görünüm çerçevesinde olsalar bile kaybolacaktır. Söz konusu hücre her iki komşu hücrenin arkasında * olduğunda (bu, araştırmayı durdurduğumuz yer) gerçekleşir. –

+0

Bu çalışmayı iOS 8'de, yeni iPhone boyutlarında ve Autolayout'u destekleyemiyorum. –

0

ama muhtemelen olması cellForItemAtIndexPath bu çizgi ile yapabilirdi:

İşte (burada temel kurulum için tutsplus.com kredi) benim AppDelegate.m içinde ne var:

[cell.contentView addSubview:label]; 

Her çağrıldığında, hücreye başka bir etiket alt görünümü eklenir. Mevcut bir etiketi veya alt sınıfı UICollectionViewCell için kontrol edin.

+0

Teşekkürler! Dışarıda kırpma alanını etkilemeyecek şekilde yorumlamak, bu nedenle çekirdek sorunu çözmüyor, ancak iyi yakalama. –

2

Negatif minimumLineSpacing kullanımıyla ilgili ipucu için çok teşekkürler. Bir xib dosyasından yüklenen bir koleksiyon görünümü hücresini kullanan bir test uygulaması oluşturdum. Hücrenin saydam bir arka planı ve hücrenin içeriği için bir "iç" görünümü vardır.

Bu şekilde, özel bir akış düzeni gerekli değildir.

https://github.com/j4johnfox/CollectionViewTester

0

Ayrıca kaydırma hareketlerini toplama bakış çerçevesi dışında başlamasını sağlamak için -pointInside:withEvent: geçersiz isteyeceksiniz. Bu benim toplama görünümü alt sınıfta UIEdgeInsets özelliğini kullanarak yapın: Eğer App Store güvenliğini gerekmiyorsa

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    CGRect extendedBounds = UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets); 

    return CGRectContainsPoint(extendedBounds, point); 
} 

, sen _visibleBounds geçersiz kılabilir negatif aralık kesmek önlemek için: Eğer

- (CGRect)_visibleBounds { 
    return UIEdgeInsetsInsetRect(self.bounds, self.touchAreaInsets); 
} 

' Kod boyutu üzerinde çok fazla basılmamış ve App Store güvenliğine ihtiyaç duyduğunuzda, PSTCollectionView alt sınıfını da kullanabilirsiniz ve muhtemelen aynı etki için visibleBoundRects'u geçersiz kılabilirsiniz.

İlgili konular