2015-04-13 14 views
9

Chciałbym skorzystać z dynamicznej wysokości UITableViewCell nowa w systemie iOS 8. Potrzebuję umieścić UICollectionView w ramach UITableViewCell. Chcę upewnić się, że wszystkie komórki w widoku kolekcji są widoczne na ekranie, więc komórka tabeli powinna zwiększyć wysokość, aby pasowała do widoku kolekcji. Mam prawie to działa. Po prostu nie udało mi się uzyskać odpowiedniej wielkości komórki tabeli - jest ona zbyt długa lub zbyt krótka, a niektóre problemy z układem są widoczne, dopóki nie wejdę w interakcję z tabelą (więcej informacji poniżej).Zaktualizuj wysokość widoku kolekcji, aby pasowała do wszystkich komórek w komórce widoku tabeli, korzystając z automatycznego układu

Skonfigurowałem ograniczenia układu automatycznego dla widoku kolekcji do komórki tabeli contentView: prowadzącej, końcowej, górnej i dolnej. Następnie utworzyłem ograniczenie wysokości w widoku kolekcji, dzięki czemu mogę zaktualizować jego wartość constant w locie po obliczeniu odpowiedniej wysokości, aby zmieściła się we wszystkich komórkach w widoku kolekcji (ponieważ nie sądzę, że można to zrobić automatycznie).

Tutaj jest reszta konfiguracji.

viewDidLoad { 
    self.tableView.rowHeight = UITableViewAutomaticDimension 
    self.tableView.estimatedRowHeight = 44 
} 

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    let cellDimension = self.collectionView.frame.size.width/7 //always 7 columns 

    let flowLayout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout 
    flowLayout.itemSize = CGSizeMake(cellDimension, cellDimension) 

    self.collectionViewHeightConstraint.constant = cellDimension * 4 //always 4 rows 
} 

nie wdrożyły heightForRowAtIndexPath.

Ta konfiguracja powoduje występowanie sprzecznych ograniczeń pionowych. Próbowałem zmniejszyć priorytet ograniczeń i zmienić relację w kilku kombinacjach, ale żadna nie spowodowała pożądanego zachowania. Jeśli zmniejszę priorytet ograniczenia wysokości do 999, komórka widoku tabeli jest na początku zbyt wysoka, ale po przewinięciu w górę iw dół widoku tabeli wysokość komórki tabeli zostanie zaktualizowana do oczekiwanej wysokości. W przypadku niektórych innych kombinacji wynikiem jest zbyt krótka komórka tabeli, ale cały widok kolekcji wykrwawia się, komórka tabeli jest zbyt krótka, a widok kolekcji jest obcięty lub komórka tabeli jest zbyt wysoka, w zależności od tego, jaki priorytet i relacje, które zastosowałem wobec ograniczeń. Ponadto komórki widoku kolekcji nie są wyświetlane w odpowiednim rozmiarze, podczas gdy widok jest animowany (ale są one poprawnie dopasowane do czasu zakończenia animacji czasu) lub jeśli ponownie załaduję tabelę, komórki widoku kolekcji mają nieprawidłowy rozmiar, dopóki nie przewińę stół.

Jak mogę rozwiązać te problemy z wyglądem, aby uzyskać wysokość komórki widoku tabeli dynamicznej, która zawiera w pełni widoczny widok kolekcji z dynamicznym rozmiarem komórki na podstawie szerokości wyświetlania?

+0

Proponuję zamiast tego przesunąć ustawienie RowHeight "self.tableView.rowHeight =" z ViewDidLoad na ViewWillAppear, możesz również sprawdzić to pytanie. [link] (http://stackoverflow.com/questions/29263875/uitableviewcells-initial-load-view-display-issue) –

+0

@KevinHorgan To nie miało żadnej zauważalnej różnicy. – Joey

+0

Aby funkcja autolayout działała poprawnie w UITableViewCell, musisz dodać ograniczenia dla wszystkich układów w containerView bez braków.W przeciwnym razie autolayouts nie będzie działać poprawnie. Sprawdź poniższy link, który zawiera szczegółowe informacje o konfiguracji autolayout dla tableviewcell http: // stackoverflow .pl/questions/29231390/uitableview-strange-layout-behaviour-changes-on-scroll/29327082 # 29327082 – Ram

Odpowiedz

0

Oto jak podchodzę do tego i myślę, że można to zrobić w całości w IB.

Najpierw ustawię minimalne rozmiary komórek CV, a następnie ustawię przytulny priorytet CV, tak aby jak najściślej przylegał do jego zawartości. To powinno zagwarantować, że niezależnie od wpływów zewnętrznych, CV spróbuje uzyskać możliwie najmniejszy rozmiar, dzięki któremu wszystkie jego komórki będą widoczne.

Następnie zagrałbym tę samą grę z widokiem zawartości komórki TBV i CV, to znaczy ustawiłbym przytulny priorytet widoku zawartości komórki TBV tak, aby jak najściślej objąć CV. Ponownie, powinno to egzekwować to, że pomijając zewnętrzne wpływy, komórka TBV powinna zachować najmniejszy rozmiar, jaki musi zachować, aby wyświetlić pełne CV.

0

Zapraszamy do obejrzenia jak forkingdog rozwiązał ten sam problem dynamicznych wysokości komórek Tableview tutaj> Strona https://github.com/forkingdog/UITableView-FDTemplateLayoutCell

powinno być możliwe, aby przełączyć się z ImageView dla uicollectionview. enter image description here

W swoim tableview - zamiast używać po wyjęciu z pudełka szacowana wysokość wiersza - musisz coś podobnego

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [tableView fd_heightForCellWithIdentifier:@"FDFeedCell" configuration:^(FDFeedCell *cell) { 
     cell.entity = self.feedEntities[indexPath.row]; 
    }]; 
} 



#import "UITableView+FDTemplateLayoutCell.h" 
#import <objc/runtime.h> 

@implementation UITableView (FDTemplateLayoutCell) 

- (id)fd_templateCellForReuseIdentifier:(NSString *)identifier; 
{ 
    NSAssert(identifier.length > 0, @"Expects a valid identifier - %@", identifier); 

    NSMutableDictionary *templateCellsByIdentifiers = objc_getAssociatedObject(self, _cmd); 
    if (!templateCellsByIdentifiers) { 
     templateCellsByIdentifiers = @{}.mutableCopy; 
     objc_setAssociatedObject(self, _cmd, templateCellsByIdentifiers, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    } 

    UITableViewCell *templateCell = templateCellsByIdentifiers[identifier]; 
    if (!templateCell) { 
     templateCell = [self dequeueReusableCellWithIdentifier:identifier]; 
     templateCellsByIdentifiers[identifier] = templateCell; 
    } 

    return templateCell; 
} 

- (CGFloat)fd_heightForCellWithIdentifier:(NSString *)identifier configuration:(void (^)(id))configuration 
{ 
    // Fetch a cached template cell for `identifier`. 
    UITableViewCell *cell = [self fd_templateCellForReuseIdentifier:identifier]; 

    // Reset to initial height as first created, otherwise the cell's height wouldn't retract if it 
    // had larger height before it gets reused. 
    cell.contentView.bounds = CGRectMake(0, 0, CGRectGetWidth(self.frame), self.rowHeight); 

    // Manually calls to ensure consistent behavior with actual cells (that are displayed on screen). 
    [cell prepareForReuse]; 

    // Customize and provide content for our template cell. 
    if (configuration) { 
     configuration(cell); 
    } 

    // Add a hard width constraint to make dynamic content views (like labels) expand vertically instead 
    // of growing horizontally, in a flow-layout manner. 
    NSLayoutConstraint *tempWidthConstraint = 
    [NSLayoutConstraint constraintWithItem:cell.contentView 
           attribute:NSLayoutAttributeWidth 
           relatedBy:NSLayoutRelationEqual 
            toItem:nil 
           attribute:NSLayoutAttributeNotAnAttribute 
           multiplier:1.0 
            constant:CGRectGetWidth(self.frame)]; 
    [cell.contentView addConstraint:tempWidthConstraint]; 

    // Auto layout does its math 
    CGSize fittingSize = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; 

    [cell.contentView removeConstraint:tempWidthConstraint]; 

    // Add 1px extra space for separator line if needed, simulating default UITableViewCell. 
    if (self.separatorStyle != UITableViewCellSeparatorStyleNone) { 
     fittingSize.height += 1.0/[UIScreen mainScreen].scale; 
    } 

    return fittingSize.height; 
} 

@end 
1

Z tego, co można zrozumieć od ciebie kodu w tworzeniu komórek CollectionView i rozmiar, wydaje mi się, że chcesz mieć kwadratowe komórki kolekcji i mieć 4 rzędy 7 komórek i wszystkie w pełni widoczne.

Po dodaniu wiązań do kolekcji collection, która znajduje się w komórce do wszystkich 4 marginesów (góra, dół, lewo i prawo), a następnie dodaniu ograniczenia współczynnika proporcji 7: 4 do kolekcji view, widok tabeli powinien być w stanie automatycznie obliczyć wysokość komórki w odpowiednim rozmiarze.

+0

Powoduje to sprzeczne ograniczenia. Potrzebuję również elementów, aby dostosować się do wypełnienia całej dostępnej przestrzeni - nie powinno być żadnych odstępów między komórkami. – Joey

+0

Musisz ustawić wysokość tableView komórki, aby pozbyć się sprzecznych ograniczeń. Kiedy go uruchomisz, tableView zmieni rozmiar komórki w prawo, ale w IB musisz to zrobić. Nie powinno być ciężko obliczyć przy użyciu współczynnika 7: 4. Aby pozycje wypełniły całe dostępne miejsce, musisz ustawić itemSize dla kolekcji view. Ale uwaga, masz jedną kolekcję w każdej komórce, więc musisz ustawić ją w jednej z funkcji źródła danych tableView. – pteofil

+0

To mnie jednak zastanawia, że ​​to, co próbujesz osiągnąć dzięki kolekcjiViewView osadzonym w komórkach widoku tabeli, może być znacznie łatwiejsze dzięki JEDEN kolekcji collectionView i tym, co zamierzasz umieścić w każdej komórce tableView umieszczonej w sekcjach w CollectionView. – pteofil