İOS UITableView HeaderView ekleme (bölüm üstbilgisi değil)


167

Örneğin kişiler uygulamasında olduğu gibi bir tablo başlığı (bölüm başlıkları değil) eklemek istiyorum: resim açıklamasını buraya girin

aynen böyle - tablonun yukarısındaki resmin yanında bir etiket.

Tablonun dışına yerleştiremediğim için tüm görünümün kaydırılabilir olmasını istiyorum.

Bunu nasıl yapabilirim?

Yanıtlar:


245

UITableViewBir sahiptir tableHeaderViewözelliği. Bunu orada istediğiniz görünüme ayarlayın.

UIViewKapsayıcı olarak yenisini kullanın, yeni olana bir metin etiketi ve resim görünümü ekleyin UIView, ardından tableHeaderViewyeni görünüme ayarlayın.

Örneğin, bir UITableViewController:

-(void)viewDidLoad
{
     // ...
     UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:imageView];
     UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(XXX, YYY, XXX, YYY)];
     [headerView addSubview:labelView];
     self.tableView.tableHeaderView = headerView;
     [imageView release];
     [labelView release];
     [headerView release];
     // ...
} 

Harika! Teşekkürler çalışıyor. Tableview hücrelerinin içindeki metin kadar büyüyebilmesinin bir özelliği var mı?
Assaf b

Bunu yapmak için, bir dize verilen hücrenin yüksekliğini hesaplayabilmeniz ve heightForRowAtIndexPath için bu değeri iletebilmeniz gerekir. NSString'in sizeWithFont: constrainedToSize: işlevini kullanarak, bir boyutla kısıtlandığında metnin yüksekliğini anlayabilirsiniz.
Mark

Düzenden sonra ekleyin, yoksa boyutu istediğiniz gibi olmaz. Ve viewDidLoad iyi bir yer.
BollMose

ViewDidLoad aşamasında görünümün geometrisini ayarlamak iyi bir uygulama mı?
Nandish A

1
Tamam, tablolarda başlık görünümünü ayarladıysanız, kaynak görünüyorsa, yüksekliği de ayarladığınızdan emin olun: örnek:public override UIView GetViewForHeader(UITableView tableView, nint section) { return headerView; } public override nfloat GetHeightForHeader(UITableView tableView, nint section) { return headerView.Frame.Height; }
panthor314

193

Interface Builder'da bunu oldukça kolay yapabilirsiniz. Yalnızca tablo içeren bir görünüm oluşturun ve başka bir görünümü tabloya bırakın. Bu tablo üstbilgisi görünümü olur. Etiketlerinizi ve resminizi bu görünüme ekleyin. Görünüm hiyerarşisi için aşağıdaki resme bakın. Hiyerarşiyi Arayüz Oluşturucu'da Görüntüleme


12
Bu cevabı tercih ederim, çünkü düzgün bir şekilde ayarlayabildiğimde ve IB'de konumlandırabildiğimde kod yazıyorum
Besi

1
ipucu için harika teşekkürler. BTW Başka birinin merak etmesi veya denemesi durumunda başlığınızda kaydırma görünümüne ihtiyacınız yoktur. Üstbilgi teknik olarak UITableView
Rob R.

2
Şu anda StoryBoard editöründe nasıl çalıştığını belirtmeye değer: stackoverflow.com/q/7841167/926907
Dmitry Zaytsev

Bunun için uç kullanmayın. Yüklenmesi daha uzun sürer. Kodu yazın. Yeniden kullanılabilirlik için özel bir sınıf oluşturun ve anlık ...
Charles Robertson

1
Üstbilgi görünümüne yükseklik kısıtlaması eklememe izin vermiyor.
Ian Warburton

14

In Swift :

override func viewDidLoad() {
    super.viewDidLoad()

    // We set the table view header.
    let cellTableViewHeader = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewHeaderCustomCellIdentifier) as! UITableViewCell
    cellTableViewHeader.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewHeaderCustomCellIdentifier]!)
    self.tableView.tableHeaderView = cellTableViewHeader

    // We set the table view footer, just know that it will also remove extra cells from tableview.
    let cellTableViewFooter = tableView.dequeueReusableCellWithIdentifier(TableViewController.tableViewFooterCustomCellIdentifier) as! UITableViewCell
    cellTableViewFooter.frame = CGRectMake(0, 0, self.tableView.bounds.width, self.heightCache[TableViewController.tableViewFooterCustomCellIdentifier]!)
    self.tableView.tableFooterView = cellTableViewFooter
}

İOS 7 veya üstü için bu yaklaşımı kullanmak bir çalışma zamanı uyarısını tetikler: "yeniden kullanılan tablo hücresi için dizin yolu yok". Bu hatayı önlemek için referans bağlantısı
baskInEminence

11

Ayrıca YALNIZCA Arayüz oluşturucuda bir UIView oluşturabilir ve ImageView ve UILabel'i sürükleyip bırakabilirsiniz (istediğiniz başlık gibi görünmesini sağlamak için) ve bunu kullanın.

UIView'iniz de istediğiniz şekilde göründüğünde, programlı olarak XIB'den başlatabilir ve UITableView'ınıza ekleyebilirsiniz. Başka bir deyişle, IB'deki ENTIRE tablosunu tasarlamak zorunda değilsiniz. Yalnızca headerView (bu şekilde başlık görünümü diğer tablolarda da kullanılabilir)

Örneğin, tablo başlıklarımdan biri için özel bir UIView'im var. Görünüm "CustomHeaderView" adlı bir xib dosyası tarafından yönetilir ve UITableViewController alt sınıfımda aşağıdaki kod kullanılarak tablo başlığına yüklenir:

-(UIView *) customHeaderView {
    if (!customHeaderView) {
        [[NSBundle mainBundle] loadNibNamed:@"CustomHeaderView" owner:self options:nil];
    }

    return customHeaderView;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Set the CustomerHeaderView as the tables header view 
    self.tableView.tableHeaderView = self.customHeaderView;
}

-36
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    {

    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0,0,tableView.frame.size.width,30)];
    headerView.backgroundColor=[[UIColor redColor]colorWithAlphaComponent:0.5f];
    headerView.layer.borderColor=[UIColor blackColor].CGColor;
    headerView.layer.borderWidth=1.0f;

    UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5,100,20)];

    headerLabel.textAlignment = NSTextAlignmentRight;
    headerLabel.text = @"LeadCode ";
    //headerLabel.textColor=[UIColor whiteColor];
    headerLabel.backgroundColor = [UIColor clearColor];


    [headerView addSubview:headerLabel];

    UILabel *headerLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, headerView.frame.size.width-120.0, headerView.frame.size.height)];

    headerLabel1.textAlignment = NSTextAlignmentRight;
    headerLabel1.text = @"LeadName";
    headerLabel.textColor=[UIColor whiteColor];
    headerLabel1.backgroundColor = [UIColor clearColor];

    [headerView addSubview:headerLabel1];

    return headerView;

}

Sorunuzu anlamadınız mı?
Priyam

2
Bu yanlış. Sadece bir tablo üstbilgisi değil bir bölüm üstbilgisi istiyor. İki şey çok farklı. Lütfen soruyu okuyun.
Charles Robertson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.