2011-09-12 17 views
6

Tek tek bölümlere sahip endeksli bir UITableView var. Her bölümdeki başlık görünümleri için farklı bir arka plan rengi kullanmak istiyorum. TabloView: viewForHeaderInSection: (örneğin, bkz. question # 2898361) uygulayarak kendi görünümümü tamamen açabileceğimi biliyorum, ancak bu bana "çok fazla iş" geliyor gibi görünüyor - standart görünüm iyi görünüyor, sadece arka planını değiştirmek zorundayım renk.Bir tableView için standart viewForHeaderInSection öğesine nasıl erişebilirim?

Ancak bu standart görünüme nasıl erişebilirim? [super tableView:viewForHeaderInSection:] kullanamıyorum, çünkü bu bir protokol uygulanması ve miras sorunu değil. Standart görünümü alabilmem için başka bir yol var mı?

cevap

13

Neredeyse bunu yapabileceğinizden eminim. Geçtiğimiz günlerde, UITableView bölümlerinin arka planını ve sınırlarını değiştirmeyi istemek için teknik destek talebimden birini kullandım. Elma mühendisi bana bunun gerçekten yapılması kolay bir şey olmadığını ve bunu yapmayı başarmış olsanız bile muhtemelen performansı etkileyeceğini söyledi. O da cocoawithlove beni işaret etti ve düzenleme uitableviews ilgili bir makale:

http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html

Gerçekten, kendi başlık oluştururken bu kadar çaba değildir. dışarı yorumladı, bu yüzden hemen çalışmayabilir - - Aşağıda benim projelerden biri çıkardı bazı kod ama fikir edinebilirsiniz:

- (CAGradientLayer *) greyGradient { 
    CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.startPoint = CGPointMake(0.5, 0.0); 
    gradient.endPoint = CGPointMake(0.5, 1.0); 

    UIColor *color1 = [UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:1.0]; 
    UIColor *color2 = [UIColor colorWithRed:240.0f/255.0f green:240.0f/255.0f blue:240.0f/255.0f alpha:1.0]; 

    [gradient setColors:[NSArray arrayWithObjects:(id)color1.CGColor, (id)color2.CGColor, nil]]; 
    return gradient; 
} 

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    CGFloat width = CGRectGetWidth(tableView.bounds); 
    CGFloat height = [self tableView:tableView heightForHeaderInSection:section]; 
    UIView *container = [[[UIView alloc] initWithFrame:CGRectMake(0,0,width,height)] autorelease]; 
    container.layer.borderColor = [UIColor grayColor].CGColor; 
    container.layer.borderWidth = 1.0f; 
    CAGradientLayer *gradient = [self greyGradient]; 
    gradient.frame = container.bounds; 
    [container.layer addSublayer:gradient]; 

    UILabel *headerLabel = [[[UILabel alloc] initWithFrame:CGRectMake(12,0,width,height)] autorelease]; 
    headerLabel.backgroundColor = [UIColor clearColor]; 
    headerLabel.font= [UIFont boldSystemFontOfSize:19.0f]; 
    headerLabel.shadowOffset = CGSizeMake(1, 1); 
    headerLabel.textColor = [UIColor whiteColor]; 
    headerLabel.shadowColor = [UIColor darkGrayColor]; 
    NSString *title = [self tableView:tableView titleForHeaderInSection:section]; 
    headerLabel.text = title; 
    return container; 
} 

emin olun

#import <QuartzCore/QuartzCore.h> 

için By yol ... bu standart başlıkların görünüşünü taklit etmemeli - bunun sadece bir örneği. Ama eminim biraz deneme ve yanılma ile bunu standart olanları taklit etmek için değiştirebilir ve sonra renkleri biraz değiştirebilirsin.

+1

Metninizde bir şey eksik görünüyor .. # neyi tanımlıyorsunuz? Muhtemelen bazı temel animasyon şeyler? – Thorsten

+0

Oh evet, CAGradientLayer'ı kullanmak için QuartzCore'dı - yazıya ekleyeceğim. Teşekkürler – bandejapaisa

+0

Ayrıca [container addSubview: headerLabel] eksik ve gerçekten böyle bir şey yaparsanız daha iyi: \t CGFloat width = tableView.bounds.size.width; \t CGFloat height = [otomatik tabloView: tableView heightForHeaderInSection: section]; UIView * container = [[UIView alloc] initWithFrame: CGRectMake (0,0, genişlik, yükseklik)]; –

1

@bandejapalsa çözümüyle ilgili bir sorun var: önceki hücrenin ayırıcısı hâlâ bu uygulamada varsayılan iOS bölümüHeaderView'da olmadığı gibi görünür durumda. Bulduğum çözüm, bir CALayer kullanmak ve 1 pix ile dengelemek oldu. Görüntü, görünüm çerçevesinin kendisinden 1 piksel daha uzun olmalıdır.

// Create the view for the header 
CGRect aFrame =CGRectMake(0, 0, tableView.contentSize.width, IMIUICustomisation.sectionHeaderViewHeight); 
UIView * aView = [[UIView alloc] initWithFrame:aFrame]; 
aView.backgroundColor = UIColor.clearColor; 

// Create a stretchable image for the background that emulates the default gradient, only in green 
UIImage *viewBackgroundImage = [[UIImage imageNamed:@"greenheader.png"] stretchableImageWithLeftCapWidth:12 topCapHeight:0]; 

// Cannot set this image directly as the background of the cell because 
// the background needs to be offset by 1pix at the top to cover the previous cell border (Alex Deplov's requirement ^_^) 
CALayer *backgroungLayer = [CALayer layer]; 

backgroungLayer.frame = CGRectMake(0, -1, tableView.contentSize.width, IMIUICustomisation.sectionHeaderViewHeight+1); 
backgroungLayer.contents = (id) viewBackgroundImage.CGImage; 
backgroungLayer.masksToBounds = NO; 
backgroungLayer.opacity = 0.9; 
[aView.layer addSublayer:backgroungLayer]; 

// Take care of the section title now 
UILabel *aTitle = [[UILabel alloc] initWithFrame: CGRectMake(10, 0, aView.bounds.size.width-10, aView.bounds.size.height)]; 
aTitle.text = [delegate tableView:tableView titleForHeaderInSection:section]; 
aTitle.backgroundColor = UIColor.clearColor; 
aTitle.font = [UIFont boldSystemFontOfSize:18]; 
aTitle.textColor = UIColor.whiteColor; 

// Text shadow 
aTitle.layer.shadowOffset = CGSizeMake(0, 1); 
aTitle.layer.shadowRadius = .2; 
aTitle.layer.masksToBounds = NO; 
aTitle.layer.shadowOpacity = 0.5; 
aTitle.layer.shadowColor = IMIUICustomisation.selectedElementTextShadowColor.CGColor; 
[aView addSubview:aTitle]; 

return aView; 
5

diğer cevaplar doğru işaret olsa da, buna basit değişiklikleri yapmak için varsayılan görünümü erişemez Belirli bir bölüm başlığı için özelleştirmek için hiçbir şey varsa, tableView:viewForHeaderInSection: den nil döndürebilir ve tablo görünümünde olacak varsayılan görünümü kullan.

Bu, yalnızca bazı başlıklarınızı özelleştirmeniz gerektiğinde kullanışlıdır. Herhangi bir nedenle undocumented.

İlgili konular