Witaj, czytam, że domyślnym zachowaniem programu UITableView
jest przypinanie wierszy nagłówków sekcji do góry tabeli podczas przewijania sekcji, aż do momentu, gdy następna sekcja wypchnie wiersz poprzedniej sekcji z widoku.
Mam UITableView
wewnątrz a UIViewController
i nie wydaje się, żeby tak było.
Czy to tylko nieprawidłowe zachowanie UITableViewController
?
Oto uproszczony kod oparty na tym, co mam. Pokażę UIController
interfejs i każdą metodę widoku tabeli, którą zaimplementowałem w celu utworzenia widoku tabeli. Mam pomocniczą klasę źródła danych, która pomaga mi indeksować obiekty do użytku z tabelą.
@interface MyUIViewController ()<UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, readonly) UITableView *myTableView;
@property (nonatomic, readonly) MyCustomHelperDataSource *helperDataSource;
@end
//when section data is set, get details for each section and reload table on success
- (void)setSectionData:(NSArray *)sections {
super.sectionData = sections; //this array drives the sections
//get additional data for section details
[[RestKitService sharedClient] getSectionDetailsForSection:someId
success:^(RKObjectRequestOperation *operation, RKMappingResult *details) {
NSLog(@"Got section details data");
_helperDataSource = [[MyCustomHelperDataSource alloc] initWithSections:sections andDetails:details.array];
[myTableView reloadData];
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"Failed getting section details");
}];
}
#pragma mark <UITableViewDataSource, UITableViewDelegate>
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if (!_helperDataSource) return 0;
return [_helperDataSource countSectionsWithDetails]; //number of section that have details rows, ignore any empty sections
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//get the section object for the current section int
SectionObject *section = [_helperDataSource sectionObjectForSection:section];
//return the number of details rows for the section object at this section
return [_helperDataSource countOfSectionDetails:section.sectionId];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell * cell;
NSString *CellIdentifier = @"SectionDetailCell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.textLabel.font = [UIFont systemFontOfSize:12.0f];
}
//get the detail object for this section
SectionObject *section = [_helperDataSource sectionObjectForSection:indexPath.section];
NSArray* detailsForSection = [_helperDataSource detailsForSection:section.sectionId] ;
SectionDetail *sd = (SectionDetail*)[detailsForSection objectAtIndex:indexPath.row];
cell.textLabel.text = sd.displayText;
cell.detailTextLabel.text = sd.subText;
cell.detailTextLabel.textColor = [UIColor blueTextColor];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 50.0f;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 30.0f;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section {
//get the section object for the current section
SectionObject *section = [_helperDataSource sectionObjectForSection:section];
NSString *title = @"%@ (%d)";
return [NSString stringWithFormat:title, section.name, [_helperDataSource countOfSectionDetails:section.sectionId]];
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 260, 0)];
header.autoresizingMask = UIViewAutoresizingFlexibleWidth;
header.backgroundColor = [UIColor darkBackgroundColor];
SSLabel *label = [[SSLabel alloc] initWithFrame:CGRectMake(3, 3, 260, 24)];
label.font = [UIFont boldSystemFontOfSize:10.0f];
label.verticalTextAlignment = SSLabelVerticalTextAlignmentMiddle;
label.backgroundColor = [UIColor clearColor];
label.text = [self tableView:tableView titleForHeaderInSection:section];
label.textColor = [UIColor whiteColor];
label.shadowColor = [UIColor darkGrayColor];
label.shadowOffset = CGSizeMake(1.0, 1.0);
[header addSubview:label];
return header;
}
ios
objective-c
uitableview
topwik
źródło
źródło
Odpowiedzi:
Nagłówki pozostają stałe tylko wtedy, gdy
UITableViewStyle
właściwość tabeli jest ustawiona naUITableViewStylePlain
. Jeśli masz to ustawioneUITableViewStyleGrouped
, nagłówki będą przewijały się w górę wraz z komórkami.źródło
initWithStyle:UITableViewStylePlain
, ponieważ wywołanie czegoś takiego jak tableView.style = UITableViewStylePlain nie będzie działać.Zmień styl TableView:
Zgodnie z dokumentacją Apple dla UITableView:
Mam nadzieję, że ta mała zmiana Ci pomoże ...
źródło
Plain
, a nieGrouped
Swift 3.0
Utwórz ViewController za pomocą protokołów UITableViewDelegate i UITableViewDataSource . Następnie utwórz w nim tableView, deklarując jego styl jako UITableViewStyle.grouped . To naprawi nagłówki.
źródło
Możesz również ustawić właściwość odrzuceń widoku tabeli na NIE. Dzięki temu nagłówki sekcji pozostaną niepływające / statyczne, ale utracisz również właściwość odbijania widoku tabeli.
źródło
aby nagłówek sekcji UITableView nie był lepki ani lepki:
zmień styl widoku tabeli - zgrupuj go, aby nie był lepki i spraw, aby był prosty w przypadku lepkich nagłówków sekcji - nie zapomnij: możesz to zrobić z storyboardu bez pisania kodu. (kliknij widok tabeli i zmień styl z menu po prawej stronie / komponentu)
jeśli masz dodatkowe komponenty, takie jak niestandardowe widoki itp., sprawdź marginesy widoku tabeli, aby utworzyć odpowiedni projekt. (takie jak wysokość nagłówka sekcji i wysokość komórki w ścieżce indeksu, sekcje)
źródło
źródło