2016-01-22 3 views
1

У меня есть UILabel в заголовке collectionView. Метка устанавливается на нулевые строки, перенос слов и правильные ограничения ведущего/конечного/верхнего пространства. Если я НЕ звоню [collectionView reloadData], ярлык правильно расширяется до текста с более чем двумя строками. Когда вызывается reloadData, метка возвращается к одной строке ... вторая строка исчезает.UICollectionView `reloadData` приводит к исчезновению строк UILabel

- (UICollectionReusableView *) collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{ 
    if (kind == UICollectionElementKindSectionHeader) { 
     header = (viewRollHeader *) [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath]; 
     header.rollTitle.text = [self.roll objectForKey:@"title"]; 
     header.rollDescription.text = [self.roll objectForKey:@"info"]; 

     [header.cancelButton addTarget:self action:@selector(exit) forControlEvents:UIControlEventTouchUpInside]; 

     return header; 
    } 
    return [UICollectionReusableView new]; 
} 


- (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{ 
    if (section == 0) { 
     CGRect labelRect = [[self.roll objectForKey:@"title"] 
         boundingRectWithSize: header.rollTitle.frame.size 
         options:NSStringDrawingUsesLineFragmentOrigin 
         attributes:@{NSFontAttributeName : [UIFont fontWithName:@"Arial-BoldMT" size:32.0f]} 
         context:nil]; 
     return CGSizeMake([[UIScreen mainScreen]bounds].size.width, (174.0f + labelRect.size.height)); 
    } 
    return CGSizeZero; 
} 
+0

сообщение код пожалуйста. – Ismail

+0

@ Ismail это делается в раскадровке. Только код reloadData – Peter

+3

как вы можете обрабатывать все для 'UICollectionView' в раскадровке ??? Где методы dataSource/delegate? – Ismail

ответ

0

collectionView:viewForSupplementaryElementOfKind:atIndexPath: используется для верхнего или нижнего колонтитула на всего CollectionView, в то время как collectionView:referenceSizeForHeaderInSection: используется для заголовка конкретного раздела в CollectionView

, чтобы убедиться, что размер заголовка остается последовательным и уважает ваши ограничения, вам нужно будет позвонить [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout setHeaderReferenceSize:CGSizeMake(width, height)] после создания потокового потока

+0

Ярлык по-прежнему возвращается в одну строку после reloadData. Это должно быть что-то с ограничениями. – Peter

+0

Любопытно - это '@" название "' или '@" info "' Вы имеете в виду основать ярлык прямо? также, что означает '174.0f'? – aduflo

+0

@adulfo «174.0f» - это исходная высота заголовка. Во-первых, я пытаюсь увеличить высоту до 'rollTitle'. Поэтому я возвращаю исходную высоту заголовка + высоту ярлыка, расширенного до' @ "title" ' – Peter

0

Использовать свойство set label set внутри метода делегата, где вы con рисуйте каждую ячейку.

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; 
//add label property here 
    return cell; 
} 

После перезагрузки он снова вызывает этот метод для настройки метки.

0

Try установки preferredMaxLayoutWidth на этикетке

self.label.preferredMaxLayoutWidth = 300;