2014-11-20 14 views
5

Mam niestandardową komórkę widoku tabeli zdefiniowaną w pliku scenorysu.Kiedy układ jest kompletny dla niestandardowego UITableViewCell?

enter image description here

Ta komórka zawiera przewijania widoku z kilku stron treści i wskaźnik strony. Przewiń widoki, widok treści i samą komórkę, wszystkie zdefiniowane przy użyciu automatycznego układu. Widoki strony1/2/3 są powiązane, aby miały taką samą szerokość jak widok przewijania, a powiązanie kontenera ma 3-krotną szerokość jako widok przewijania. W ten sposób nie mam pewności, że zawartość jest dokładnie taka, aby wyświetlać trzy strony informacji niezależnie od rozmiaru ekranu.

Mam kod w niestandardowej klasie komórki, aby zaktualizować wskaźnik strony, gdy przewijał się widok przewijania - to działa poprawnie.

ja również narażone metodę w klasie komórek aby określić stronę z zewnątrz, w tym seter robię coś takiego:

- (void)setPage:(NSInteger)page animated:(BOOL)animated 
{ 
    CGFloat pageWidth = self.scrollView.frame.size.width; 
    self.pageControl.currentPage = page; 
    [self.scrollView setContentOffset:CGPointMake(page*pageWidth, 0) animated:animated]; 
} 

Problem mam skierowane jest dość często przewijać widok ramkę i rozmiar treści nie jest poprawnie zdefiniowany, gdy wywołuję ten program ustawiający, więc wskaźnik strony zostanie ustawiony, ale widok przewijania nie zmieni przesunięcia zawartości.

Gdzie mogę złapać moment, w którym auto-layout mojej komórki jest kompletny i mogę zagwarantować, że setContentOffset zadziała? Próbuję zadzwonić pod numer setPage z cellForIndexPath - to oczywiście nie działa, wtedy próbowałem wywołać go z willDisplayCell - sama historia - sama komórka jest już poprawnie ułożona, ale widok przewijania nadal ma 600px (z storyboardu) i kończy się niepowodzeniem.

+0

Czy próbujesz wyświetlić zawartość podzieloną na strony? –

+0

Tak. To jest dokładnie to, co próbuję zrobić – sha

Odpowiedz

1

Wygląda na to, że jesteś ustawiony na niestandardową implementację, więc oto, co może zadziałać.

Wywołanie metody -setPage:animated: przed wyświetleniem widoku tabeli, ustawienie jej subviews, co daje komórce szansę na zrobienie tego samego, lub uruchomienie automatycznego układu nie będzie działać, dopóki nie utrzymasz stanu w komórce (prawdopodobnie tylko strona numer) i reagują na jeden lub więcej z następujących możliwości:

  1. Czekając aż sposobie swoimi pożarów UITableViewController -viewDidLayoutSubviews a następnie zadzwonić -cellForRowAtIndexPath: dostać komórkę. Komórka powinna wtedy mieć poprawną ramkę.

  2. Przesłoń -didMoveToSuperview w niestandardowej UITableViewCell. Do czasu, jak się to nazywa, ramka również powinna być ważna.

Po jednym z tych punktów można sprawdzić stan własnej komórki (która powinna zawierać numer strony, który ma być wyświetlany) i przewinąć do odpowiedniego punktu. Prawdopodobnie ma sens refactorowanie twojej metody, aby ustawić stan (właściwość liczby całkowitej w komórce) i mieć oddzielną metodę prywatną, którą -setPage:animated: i jedną z dwóch nadpisań powyżej można wywołać, aby obliczyć przesunięcie i wykonać przewijanie.


Proponowana alternatywa:

Można to ciągnąć się przez osadzanie UICollectionView w komórki contentView. Twój UIViewController, który aktualnie implementuje UITableViewDataSource, może również zaimplementować UICollectionViewDataSource i udostępnić widok kolekcji swoim komórkom.

Zakładając, że twoje komórki UITableView są szerokością i wysokością ekranu, możesz skonfigurować osadzony widok kolekcji, aby zasadniczo paginować w poziomie (ponieważ UICollectionView jest podklasą UIScrollView).

Podczas konfigurowania widok kolekcja używać UICollectionViewFlowLayout jako obiekt układu i skonfigurować go tak:

// Ensure the collection view scrolls horizontally. 
let flowLayout = UICollectionViewFlowLayout(); 
flowLayout.scrollDirection = .Horizontal; 

let collectionView = UICollectionView(frame:tableCellFrame, layout:flowLayout); 

// These are actually UIScrollView properties. 
collectionView.pagingEnabled = true; 
collectionView.bounces = false; 

Następnie umieścić każdą stronę zawartości w zwyczaju UICollectionViewCell i widok kolekcja paginate je dla Ciebie . To daje dodatkową korzyść w postaci darmowego przewijanego interfejsu API z paginacją.

+0

Czy sugerujesz umieszczenie UIPageController wewnątrz komórki? – sha

+0

Nie, całkowicie zapisz UITableView. –

+0

To nie jest opcja. Muszę sobie z tym poradzić w komórce – sha

12

skończyło się w następujący sposób:

w podklasie zwyczaj komórek dodaje realizację

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    [self.contentView layoutSubviews]; 

    // set proper content offset 
    [self.scrollView setContentOffset:CGPointMake(self.frame.size.width*self.pageControl.currentPage, 0) animated:NO]; 
} 

layoutSubview beze mnie bezpośrednio dzwoniąc layoutSubview na contentView przewijania widoku nie mają odpowiedniej oprawy nawet po [super layoutSubview] było skończone.

Nie musiałem przechowywać bieżącego numeru strony w wewnętrznej zmiennej, ponieważ pageControl już ją posiada i jest ona ustawiona podczas konfigurowania oryginalnych informacji o komórce.

Co było interesujące - oryginalnie dodałem w tej metodzie [self.scrollView layoutSubview] i działało dobrze w iOS8, ale nie zrobiło nic dobrego w iOS7. Musiałem podnieść poziom o jeden poziom do contentView, aby upewnić się, że działa zarówno w trybie 7, jak i 8.

Powiązane problemy