2015-05-01 8 views
7

UICollectionView'ın ek görünümünde (başlık) içinde, 3 satıra kırpmak istediğim çok satırlı bir etiketim var. UICollectionView'ın ek görünümünü (çok satırlı UILabel's içeren) dinamik olarak yeniden boyutlandırma

enter image description here

kullanıcı başlığı (tamamlayıcı) görünümünde herhangi bir yerinde musluklar

, ben 0 hatları nedenle tüm metin görüntüler için UILabel geçiş ve buna göre (tercihen animasyonlu) CollectionView'ın ek görünümün yüksekliğini büyümek istiyorum. Etiket kesik iken, değeri 149 olan ben layoutSubviews sonunda height oturum açtığınızda

// MyHeaderReusableView.m 

// my gesture recognizer's action 
- (IBAction)onHeaderTap:(UITapGestureRecognizer *)sender 
{ 
    self.listIntro.numberOfLines = 0; 

    // force -layoutSubviews to run again 
    [self setNeedsLayout]; 
    [self layoutIfNeeded]; 
} 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.listTitle.preferredMaxLayoutWidth = self.listTitle.frame.size.width; 
    self.listIntro.preferredMaxLayoutWidth = self.listIntro.frame.size.width; 
    [self layoutIfNeeded]; 

    CGFloat height = [self systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 

    self.frame = ({ 
     CGRect headerFrame = self.frame; 
     headerFrame.size.height = height; 
     headerFrame; 
    }); 

    NSLog(@"height: %@", @(height)); 
} 

:

enter image description here

İşte şimdiye kadar benim kod: Burada başlığına hafifçe vurun sonra neler olur? ve numberOfLines, 3 olarak ayarlanır. Üstbilgi'ye tıkladıktan sonra, numberOfLines değerini 0'a getirdikten sonra bir düzen geçişini zorlayarak yüksekliği 163.5 olarak kaydedilir. Harika!

Tek sorun, tüm üstbilginin Büyütülmemesi ve hücrelerin aşağı itilmemesidir.

Koleksiyonumun ek görünümünün (tercihen animasyonlu) yüksekliğini dinamik olarak nasıl değiştirebilirim?

UICollectionViewFlowLayout ürününün headerReferenceSize ve collectionView:layout:referenceSizeForHeaderInSection: farkındayım, ancak bu durumda bunları nasıl kullandığımı tam olarak bilmiyorum.

cevap

4

Çalıştığım bir şey var, ama itiraf edeceğim, kludgy hissediyor. Bu standart CollectionView (ve ilişkili elemanlar) API + standart düzen/ekran geçersiz kılma içine çengel ile yapılabileceğini hissediyorum, ama ben sadece işe yaramadı.

Başlığımı yeniden boyutlandıran tek şey, koleksiyon görünümünün akış düzeninin headerReferenceSize numaralı ayarını oluşturuyordu. Maalesef, koleksiyon görünümüme veya UICollectionReusableView örneğimdeki akış düzenine erişemiyorum, bu yüzden doğru yüksekliği geri almak için bir temsilci yöntemi oluşturmam gerekiyordu.

İşte şimdi sahip budur:

// in MyHeaderReusableView.m 
// 
// my UITapGestureRecognizer's action 
- (IBAction)onHeaderTap:(UITapGestureRecognizer *)sender 
{ 
    self.listIntro.numberOfLines = 0; 
} 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.listTitle.preferredMaxLayoutWidth = self.listTitle.frame.size.width; 
    self.listIntro.preferredMaxLayoutWidth = self.listIntro.frame.size.width; 

    CGFloat height = [self systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; 

    self.frame = ({ 
     CGRect headerFrame = self.frame; 
     headerFrame.size.height = height; 
     headerFrame; 
    }); 

    if (self.resizeDelegate) { 
     [self.resizeDelegate wanderlistDetailHeaderDidResize:self.frame.size]; 
    } 
} 

// in my viewController subclass which owns the UICollectionView: 
- (void)wanderlistDetailHeaderDidResize:(CGSize)newSize 
{ 
    UICollectionViewFlowLayout *flowLayout = (UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout; 

    // this is the key line 
    flowLayout.headerReferenceSize = newSize; 

    // this doesn't look beautiful but it's the best i can do for now. I would love for just the bottom of the frame to animate down, but instead, all the contents in the header (the top labels) have a crossfade effect applied.  
    [UIView animateWithDuration:0.3 animations:^{ 
     [self.collectionView layoutIfNeeded]; 
    }]; 
} 

Ben aradığım çözüm, ancak bir çalışma çözümü yine de dediğim gibi.

+0

sayesinde adamın peşinden ben heyet gerek kalmadan Çözümü uygulamak başardı 1 yıl sonra Swift 3'te zamanımı bu yaklaşımla kurtardın. Tamamen değil ama bu üste başka şeyler ekledim :) +1 – tobeiosdev

0

Sizden aynı sorunu araştırdım, bu yüzden merak ettim: Kod örneğinde bahsettiğiniz crossfade efekti olmadan bir çözüm aldınız mı? Benim yaklaşımım hemen hemen aynıydı, ben de aynı sorunu yaşıyorum. Bir başka yorum olsa: tarafından (ve dolayısıyla, UICollectionViewLayout) UICollectionView başvurabilir Benim yaptığım "MyHeaderReusableView.m" oldu:

//from MyHeaderReusableView.m 
if ([self.superview isKindOfClass:UICollectionView.class]) { 

    //get collectionView reference 
    UICollectionView * collectionView = (UICollectionView*)self.superview; 

    //layout 
    UICollectionViewFlowLayout * layout = (UICollectionViewFlowLayout *)collectionView.collectionViewLayout; 
    //... perform the header size change 

} 
İlgili konular