Podczas używania "Dynamicznych prototypów" do określania zawartości UITableView
w scenorysie istnieje właściwość "Wysokość wiersza", którą można ustawić jako Niestandardową.Pobrać niestandardową wysokość komórki prototypu z storyboardu?
Podczas tworzenia komórek wysokość tej niestandardowej wiersza nie jest brana pod uwagę. Ma to sens, ponieważ od jakiej prototypowej komórki używam decyduje mój kod aplikacji w momencie, kiedy komórka ma zostać utworzona. Aby utworzyć instancję wszystkich komórek podczas obliczania układu, wprowadziłbym karę wykonania, więc rozumiem, dlaczego nie można tego zrobić.
Pytanie, czy mogę w jakiś sposób pobrać wysokość z identyfikatorem ponownego użycia komórki, np.
[myTableView heightForCellWithReuseIdentifier:@"MyCellPrototype"];
coś w tym stylu? Czy muszę powtórzyć jawne wysokości rzędów w kodzie aplikacji, z następującymi obciążeniami konserwacyjnymi?
rozwiązany za pomocą @TimothyMoose:
Wysokości są przechowywane w komórkach siebie, co oznacza, że jedynym sposobem na uzyskanie wyżyny jest instancję prototypy. Jednym ze sposobów jest wstępne usunięcie tych komórek poza normalną metodą odwołań do komórek. Tu jest mój mały POC, który działa:
#import "ViewController.h"
@interface ViewController() {
NSDictionary* heights;
}
@end
@implementation ViewController
- (NSString*) _reusableIdentifierForIndexPath:(NSIndexPath *)indexPath
{
return [NSString stringWithFormat:@"C%d", indexPath.row];
}
- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!heights) {
NSMutableDictionary* hts = [NSMutableDictionary dictionary];
for(NSString* reusableIdentifier in [NSArray arrayWithObjects:@"C0", @"C1", @"C2", nil]) {
CGFloat height = [[tableView dequeueReusableCellWithIdentifier:reusableIdentifier] bounds].size.height;
hts[reusableIdentifier] = [NSNumber numberWithFloat:height];
}
heights = [hts copy];
}
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
return [heights[prototype] floatValue];
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 3;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString* prototype = [self _reusableIdentifierForIndexPath:indexPath];
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:prototype];
return cell;
}
@end
Używałem tej metody przez jakiś czas, a następnie na nowym scenopisie, otrzymywałem w większości komórek wymiary o zerowej wysokości (i szerokości). Nawet niezerowe były nieoczekiwanymi wartościami. Wyłączenie klas wielkości przywróciło tę funkcję. Rozczarowanie, ponieważ ta "poprawka" wyłączyła ważną funkcję w scenorysie. Jednak działało to na moją bezpośrednią potrzebę. –
Znalazłem bardziej kompletne rozwiązanie dla [rozwiązania tego problemu z włączonymi klasami wielkości] (http://stackoverflow.com/questions/27735341/offscreen-uitableviewcells-for-size-calculations-not-respecting-size-class). –