2015-02-23 15 views
7

Dinamik UICollectionViewCell'in ile oynuyordum ve bir UICollectionViewCell numaralı telefonda cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) numaralı telefonun hatalı bir genişlik döndürdüğünü fark ettim. Şu anda bunu ele alan tek geçici çözüm, hücrenin genişliğini zorlamak için bir genişlik kısıtlaması açıkça eklemektir. Aşağıdaki kod, bir Hücre alt sınıfta kullanılır:UICollectionViewCell systemLayoutSizeFittingSize, yanlış genişlik döndürüyor

func calculatePreferredHeightForFrame(frame: CGRect) -> CGFloat { 
    var newFrame = frame 
    self.frame = newFrame 
    let widthConstraint = NSLayoutConstraint(item: contentView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: CGRectGetWidth(frame)) 
    contentView.addConstraint(widthConstraint) 
    self.setNeedsUpdateConstraints() 
    self.updateConstraintsIfNeeded() 
    self.setNeedsLayout() 
    self.layoutIfNeeded() 
    let desiredHeight: CGFloat = self.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize).height 
    newFrame.size.height = CGFloat(ceilf(Float(desiredHeight))) 
    contentView.removeConstraint(widthConstraint) 
    return CGRectGetHeight(newFrame) 
} 

Ben iOS 8 ve dinamik UICollectionViewFlowLayout ile UICollectionViewCell en contentView farklı kısıtlamaları kolları ama orada ben burada özlüyorum şey olduğunu biliyoruz? SystemLayoutSizeFittingSize'in bir hücrede belirli bir genişlik kullanmasını sağlamak için ne yapması gerekir?

Ayrıca bu yazıya rastladım (Specifying one Dimension of Cells in UICollectionView using Auto Layout) ve bunun aslında sorumu geçersiz kılabileceğine inanıyorum. Belki de UICollectionViewFlowLayout, yalnızca tek bir dinamik boyuta sahip hücreler için tasarlanmamıştır, ancak bu, hücrenin neden sıra dışı bir genişlik sağladığını açıklamamaktadır.

+0

Tam olarak aynı sorun var, benim hücre genişliğim her zaman 320 (xib görünüm boyutu) olarak döndürülür. Gerçekten bu konuda çalışamıyorum ... –

+3

Bu hücrede çok çizgili UILabel var mı? Eğer öyleyse muhtemelen tercih ettiğiniz maksimum düzen genişliğine sahip olursunuz. –

+0

@ hris.to soruyu tekrar okursanız, bunun etiketlerle değil, tüm hücreyi –

cevap

5

Aynı sorunu yaşadım. Anahtar, systemLayoutSize alırken öncelikler kullanıyor.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (!self.prototypeCell) { 
     self.prototypeCell = [TrainingMenuCell new]; 
     self.prototypeCell.contentView.translatesAutoresizingMaskIntoConstraints = NO; 
    } 

    [self configureCell:self.prototypeCell forIndexPath:indexPath]; 
    [self.prototypeCell setNeedsLayout]; 
    [self.prototypeCell layoutIfNeeded]; 

    CGFloat width = CGRectGetWidth(collectionView.frame) - 12; 
    CGSize fittingSize = UILayoutFittingCompressedSize; 
    fittingSize.width = width; 

    CGSize size = [self.prototypeCell.contentView systemLayoutSizeFittingSize:fittingSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityDefaultLow]; 
    return size; 
} 
+0

'u yazmadan çıkarma bölümünün benim için çalışmadığını desteklemiyor. Ben soldaki ve sağda 10'luk bir iç kısma sahip olduğumdan, koleksiyon görünüm genişliğinden 20 çıkarıyorum. Ama ben hala 300 değil 300 ile biter. – Nil

+0

@Nil 'fittingSize' ve' size' değişkenini kontrol ettiniz mi? Öncelikler cevabımdan kopyalandı mı? –

+0

Nevermind. aslında self.prototypeCell.contentView yerine self.prototypeCell kullanıyordum. Bu yüzden kırıldı. – Nil