Tamam, geç olduğunu biliyorum ama yapmak zorundaydım. Şimdi çalışan bir çözüm arayarak 10 saat geçirdim, ancak tam bir cevap bulamadım. Bazı ipuçları buldum ama yeni başlayanlar için anlamak zor. Bu yüzden benim 2 sent koymak ve cevabı tamamlamak zorunda kaldı.
Cevapların birkaçında önerildiği gibi, uygulayabildiğim tek çalışma çözümü, tablo görünümüne normal hücreler ekleyip bunları Bölüm Başlıkları olarak ele almaktır, ancak bunu elde etmenin en iyi yolu, bu hücreleri her bölümün 0 satırı. Bu şekilde, bu özel kayan reklam başlıklarını kolayca halledebiliriz.
Yani, adımlar.
UITableView, UITableViewStylePlain stiliyle uygulanır.
-(void) loadView
{
[super loadView];
UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
tblView.delegate=self;
tblView.dataSource=self;
tblView.tag=2;
tblView.backgroundColor=[UIColor clearColor];
tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
Her zamanki gibi titleForHeaderInSection uygulayın (bu değeri kendi mantığınızı kullanarak alabilirsiniz, ancak standart delegeleri kullanmayı tercih ediyorum).
- (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *headerTitle = [sectionArray objectAtIndex:section];
return headerTitle;
}
Her zamanki gibi numarayı değiştirin
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
int sectionCount = [sectionArray count];
return sectionCount;
}
NumberOfRowsInSection öğesini her zamanki gibi uygulayın.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int rowCount = [[cellArray objectAtIndex:section] count];
return rowCount +1; //+1 for the extra row which we will fake for the Section Header
}
HeightForHeaderInSection için 0.0f döndür.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.0f;
}
ViewForHeaderInSection uygulamayın. Nil döndürmek yerine yöntemi tamamen kaldırın.
HeightForRowAtIndexPath içinde. (İndexpath.row == 0) olup olmadığını kontrol edin ve bölüm üstbilgisi için istenen hücre yüksekliğini döndürün, aksi takdirde hücrenin yüksekliğini döndürün.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row == 0)
{
return 80; //Height for the section header
}
else
{
return 70; //Height for the normal cell
}
}
Şimdi cellForRowAtIndexPath'de (indexpath.row == 0) olup olmadığını kontrol edin ve hücreyi bölüm başlığının olmasını istediğiniz gibi uygulayın ve seçim stilini none olarak ayarlayın. ELSE, normal hücrenin olmasını istediğiniz gibi hücreyi uygular.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
}
cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
return cell;
}
else
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
}
cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
return cell;
}
}
Şimdi willSelectRowAtIndexPath'i uygulayın ve indexpath.row == 0 ise nil döndürün.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
return nil;
}
return indexPath;
}
Ve son olarak didSelectRowAtIndexPath'de (indexpath.row! = 0) olup olmadığını kontrol edin ve devam edin.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != 0)
{
int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
//Do what ever you want the selection to perform
}
}
Bununla işiniz bitti. Artık mükemmel bir şekilde kayan, kayan bölüm başlığınız var.