6

mam widok UICollection pracy z samodzielnego doboru komórek, jak pokazano na WWDC 2014.UICollectionView z selfsizing komórki nie obliczaniu contentSize prawidłowo

chcę umieścić go wewnątrz UITableViewCell i wyświetlić chmurę tagów (dobre referencje, co ja chcesz osiągnąć to w aplikacji Foursquare: http://i59.tinypic.com/sxd9qf.png)

Mój problem polega na tym, że przy samodzielnym wymiarowaniu komórek rozmiar zawartości jest zwracany nieprawidłowo. przygotowałem jakiś krótki pokaz, aby pokazać problem:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.elements = [NSMutableArray array]; 
    for (int i = 0; i < 23; i++) 
    { 
     [self.elements addObject:[self randomString]]; 
    } 

    UICollectionViewFlowLayout* layout = [[UICollectionViewFlowLayout alloc] init]; 
    layout.estimatedItemSize = CGSizeMake(50, 30); 

    self.collectionView=[[UICollectionView alloc] initWithFrame:self.view.frame collectionViewLayout:layout]; 
    [self.collectionView setDataSource:self]; 
    [self.collectionView setDelegate:self]; 

    UINib *cellNib = [UINib nibWithNibName:@"CustomCell" bundle:nil]; 
    [self.collectionView registerNib:cellNib forCellWithReuseIdentifier:@"CustomCell"]; 
    [self.collectionView setBackgroundColor:[UIColor blueColor]]; 
    [self.view addSubview:self.collectionView]; 
} 

- (void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    self.collectionView.frame = CGRectMake(0, 0, self.collectionView.frame.size.width, self.collectionView.contentSize.height); 
} 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 
{ 
    return [self.elements count]; 
} 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell* cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"CustomCell" forIndexPath:indexPath]; 
    cell.customLabel.text = [self.elements objectAtIndex:[indexPath row]]; 
    return cell; 
} 

Kiedy robię to stary sposób i usunąć estimatedItemSize i używać itemSize zamiast lub metoda delegat do obliczenia wielkości - to działa prawidłowo, więc myślę, że jest za pomocą estimatedItem rozmiar, aby uzyskać rozmiar treści.

Czy istnieje sposób na to, aby działał z samokierowaniem komórek i automatycznie UICollectionView do treści?

+1

err ... Wiem, że to nie pomaga, ale nie polecam na razie używać komórki samokonwersyjnej w widokach kolekcji. Wygląda na to, że Apple wykonało niezbyt dobrą robotę, wykonując https://devforums.apple.com/search.jspa?resultTypes=MESSAGE&peopleEnabled=true&q=self-sizing. –

+0

Jaki będzie sposób na wdrożenie go tak, jak tego chcę? :) Nawet przy ręcznych obliczeniach mam problem z przewidywaniem, ile miejsca potrzebuję na UICollectionView, aby wyświetlić jego zawartość - potrzebuję przewidywania dla wysokości UITableViewCell :) –

Odpowiedz

1

skończyło się obliczania wielkości na własną rękę:

- (CGSize) sizeForCellAtIndexPath:(NSIndexPath*) indexPath isMoreButton:(BOOL) isMoreButton 
{ 
    TagCell* cell = (TagCell*) [[LayoutHelper sharedLayoutHelper] collectionCellFromNib:@"TagCell"]; 
    cell.tagLabel.text = [self.contactHashTags objectAtIndex:indexPath.row]; 
    CGSize size = [cell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 
    CGSizeMake(size.width, cell.frame.size.height); 
} 

- (CGSize) sizeForCellAtIndexPath:(NSIndexPath*) indexPath isMoreButton:(BOOL) isMoreButton 
{ 
    CGSize size = [self.dataSource sizeForCellAtIndexPath:indexPath isMoreButton:isMoreButton]; 

    //limit cell to view width 
    size.width = MIN(size.width, self.frame.size.width); 
    return size; 
} 
+1

FWIW, nawet w iOS 10 Mam ten sam problem z samokularyzacją komórek. Na następnym runloop rozmiar jest poprawny. Ręczne sortowanie to jedyne rozwiązanie. –

1

Moja obejście ... dodaj się wstawka w locie.

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) { 
    let isLastItem = indexPath.item == (collectionView.numberOfItems(inSection: indexPath.section) - 1) 
    guard isLastItem else { 
     return 
    } 

    DispatchQueue.main.async { 
     let inset = (cell.frame.maxX - collectionView.contentSize.width) + 10 // 10 is the right padding I want for my horizontal scroll 
     collectionView.contentInset = UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: inset) 
    } 
} 
Powiązane problemy