Как я могу получить доступ к стандартному viewForHeaderInSection для tableView? - PullRequest
6 голосов
/ 12 сентября 2011

У меня есть индексированный UITableView с отдельными разделами.Я хотел бы использовать другой цвет фона для представлений заголовка в каждом разделе.Я знаю, что могу полностью свернуть свое собственное представление, реализовав tableView: viewForHeaderInSection: (например, см. вопрос # 2898361 ), но мне кажется, что это "слишком много работы" - стандартный вид выглядит нормально,Мне просто нужно изменить цвет фона.

Но как мне получить доступ к этому стандартному представлению?Я не могу использовать [super tableView:viewForHeaderInSection:], потому что это вопрос реализации протокола, а не проблема наследования.Есть ли другой способ получить стандартный вид?

Ответы [ 3 ]

13 голосов
/ 13 сентября 2011

Я почти уверен, что вы не можете сделать это легко.Я недавно использовал один из моих запросов на техническую поддержку в своей учетной записи dev, спрашивая об изменении фона и границ разделов UITableView.Яблочный инженер сказал мне, что это действительно было непросто, и даже если вам это удастся, это, вероятно, повлияет на производительность.Он также указал мне на cocoawithlove и статью о редактировании uitableviews:

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

Действительно, создание собственного заголовка не так уж много усилий.Ниже приведен код, который я извлек из одного из моих проектов - он был закомментирован, поэтому может не сработать сразу - но вы можете понять:

 - (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;
}

Убедитесь, что

#import <QuartzCore/QuartzCore.h>

Кстати ... это не должно имитировать внешний вид стандартных заголовков - это всего лишь пример.Но я уверен, что с помощью проб и ошибок вы можете изменить это, чтобы имитировать стандартные, а затем слегка изменить цвета.

5 голосов
/ 01 ноября 2012

Хотя другие ответы правильно указывают на то, что вы не можете получить доступ к представлению по умолчанию, чтобы внести в него простые изменения, если вам нечего настраивать для конкретного заголовка раздела, вы можете вернуть nil из tableView:viewForHeaderInSection:, и представление таблицы будетиспользуйте представление по умолчанию.

Это полезно, если вам нужно настроить только некоторые заголовки.

По какой-либо причине это недокументировано .

1 голос
/ 08 сентября 2012

Существует одна проблема с решением @bandejapalsa: разделитель предыдущей ячейки все еще виден в этой реализации, где он отсутствует в разделе iOS по умолчанию для iOS.Я нашел решение использовать CALayer и сместить его на 1 пиксель.Изображение должно быть на 1 пиксель выше, чем сама рамка просмотра.

// 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...