2013-12-14 5 views
4

Я хочу, чтобы изменить вид заголовка раздела, когда пользователь прокручивает вниз, что-то похожее на это в музыкальном приложении (Notics как цвет вид фон изменился и получил нижнюю границу)Изменить вид заголовка раздела после прокрутки вниз

screen shots http://f.cl.ly/items/3q123Z3N0k4117331Q0Q/Untitled-1.png

Есть ли хороший способ отслеживать, когда вид находится над секцией или в положении прокрутки?

Update:

Мое единственное решение до сих пор сохранить массив всех представлений заголовка раздела и изменить вид первого видимого раздела в scrollViewDidScroll: метод делегата (получение первого индекса виден раздел с помощью tableView.indexPathsForVisibleRows)

Если кто-нибудь может придумать более простой способ, это было бы здорово!

ответ

0

Может быть, более простое решение существует, но это woud быть одним из способов достижения того, что вы хотите:

  • удалить tableHeader и добавить его как отдельный подвид вашему viewControllers зрения (Примечание: не использовать UITableViewController, как то ViewController имеет TableView как его точки зрения, и вы не хотите, что)

  • Подведите Tableview вниз так, что она подходит прямо под этой точкой зрения бывшего-tableheader

  • вычислительном и установите contentOffset для tableView (это UIScrollView), чтобы ячейки, похоже, не переместились в новую позицию.

Кроме того, вы можете попробовать возвращающие sectionHeaderView (который прокручивается вместе с Tableview вниз, но не вверх, смотри, например, у вас списки контактов, как это работает). Играйте с этим представлением как ячейка или заголовок раздела.

2

Вы можете изменить цвет (и все, что захотите) в виде заголовка раздела в методе scrollViewDidScroll. Этот пример затемняет цвет плавающего заголовка, когда пользователь прокручивает вниз и сохраняет белое значение этого цвета между 0,9 и 0,6. Он также отображает нижнюю границу в заголовке, если вы прокрутите вниз более чем на 5 пунктов.

.m файл для RDHeaderView:

- (id)init{ 
    self = [super init]; 
    if (self) { 
     UIView *line = [[UIView alloc] init]; 
     [line setTranslatesAutoresizingMaskIntoConstraints:NO]; 
     line.backgroundColor = [UIColor darkGrayColor]; 
     [self addSubview:line]; 
     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[line]|" options:0 metrics:nil views:@{@"line":line}]]; 
     [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[line]|" options:0 metrics:nil views:@{@"line":line}]]; 
     [line addConstraint:[NSLayoutConstraint constraintWithItem:line attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:1]]; 
     self.bottomLine = line; 
     self.bottomLine.hidden = YES; 
    } 
    return self; 
} 

Соответствующие методы в контроллере табличного:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    RDHeaderView *header = [[RDHeaderView alloc] init]; 
    header.contentView.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1]; 
    return header; 
} 


-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    NSInteger topSection = [[self.tableView indexPathsForVisibleRows].firstObject section]; 
    NSInteger sectionYOffset = [self.tableView rectForHeaderInSection:topSection].origin.y; 
    RDHeaderView *pinnedHeader = (RDHeaderView *)[self.tableView headerViewForSection:topSection]; 
    pinnedHeader.bottomLine.hidden = ((scrollView.contentOffset.y - sectionYOffset) > 5)? NO: YES; 
    CGFloat colorOffset = fmaxf(0.6, 0.9 - (scrollView.contentOffset.y - sectionYOffset)/1000.0); 
    if (colorOffset > 0.9) colorOffset = 0.9; 
    pinnedHeader.contentView.backgroundColor = [UIColor colorWithWhite:colorOffset alpha:1]; 
} 


-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { 
    return 80; 
} 
+0

Извините, но это изменит все представления заголовка раздела, у меня есть более чем один раздел представление таблицы, которое вы знаете. Мысль о подобном решении, в котором я отслеживаю все позиции разделов и использую методы делегата прокрутки для изменения представлений соответствующим образом. Я ищу динамическое решение (если оно есть) –

+0

@EdLess, я изменил свой ответ, чтобы показать, как я это сделал для нескольких разделов. – rdelmar

Смежные вопросы