2015-02-08 1 views
1

У меня есть статический UITableView с 4 пользовательскими ячейками. Поскольку ячейки являются статическими, значит, все дело в UITableViewController. Я помещал случайное изображение внутри ячеек. Теперь я хочу, чтобы моя первая ячейка была зафиксирована в верхней части моего таблицы. И остальные три ячейки будут прокручиваться. Я не могу этого сделать, добавив UIImageView верх UITableView, потому что это статическая ячейка. Тогда, как я могу это сделать?Первый UITableViewCell должен быть исправлен для статического UITableView в UITableViewController

Вот мой код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

    if ((indexPath.row)==0) 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"one"]; 

     UIImageView *backgroundView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 170)]; 
     backgroundView.image=[UIImage imageNamed:@"default-cover-image.jpg"]; 

     [cell.contentView addSubview:backgroundView]; 
    } 
    if ((indexPath.row)==1) 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"two"]; 

     UIImageView *backgroundView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
     backgroundView.image=[UIImage imageNamed:@"sectionHeader.png"]; 

     [cell.contentView addSubview:backgroundView]; 
    } 
    if ((indexPath.row)==2) 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"three"]; 

     UIImageView *backgroundView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
     backgroundView.image=[UIImage imageNamed:@"sectionHeader2.png"]; 

     [cell.contentView addSubview:backgroundView]; 
    } 
    if ((indexPath.row)==3) 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"four"]; 

     UIImageView *backgroundView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 170)]; 
     backgroundView.image=[UIImage imageNamed:@"default-cover-image.jpg"]; 

     [cell.contentView addSubview:backgroundView]; 
    } 

    return cell; 
} 
+0

Я не мог отказаться от понимания .. вы хотите, чтобы одна ячейка всегда была в верхней части таблицыView? вы используете раскадровки? – YuviGr

+0

@YuviGr Да. Именно этого я и хотел. – Tulon

ответ

0

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

Установите кадр моего статического Tableview с CGRectMake(0, 170, 320, 960):

[self.tableView setFrame:CGRectMake(0, 170, 320, 960)]; 

Он положил некоторое черное пространство в этом пустом пространстве. Поэтому я положил фон как белый.

[[[UIApplication sharedApplication] keyWindow] setBackgroundColor:[UIColor whiteColor]]; 

Затем добавьте UIImageView в этом пустом пространстве (здесь вы не можете добавить UIImage в tableView, вы должны добавить это изображение в superView).

UIImageView *backgroundView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 170)]; 
backgroundView.image=[UIImage imageNamed:@"default-cover-image.jpg"]; 
[self.view.superview addSubview:backgroundView]; 

Так что код будет выглядеть следующим образом:

- (void)viewDidAppear:(BOOL)animated 
{ 
    // Set the frame of the UITableViewController table 
    [self.tableView setFrame:CGRectMake(0, 170, 320, 960)]; 
    [[[UIApplication sharedApplication] keyWindow] setBackgroundColor:[UIColor whiteColor]]; 

    // Set the image in superView (not in tableView) as subView on top of the tabelView 
    UIImageView *backgroundView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 170)]; 
    backgroundView.image=[UIImage imageNamed:@"default-cover-image.jpg"]; 
    [self.view.superview addSubview:backgroundView]; 
} 
3

Клетка сделана прокручиваться с другими, если у вас есть простой вид таблицы стиля вы можете просто использовать заголовок для секции.
Если у вас есть один раздел, все ячейки будут прокручиваться под заголовком.
Чтобы сделать простой эксперимент просто добавить этот код

- (NSString *)tableView:(UITableView *)tableView 
titleForHeaderInSection:(NSInteger)section 

И сделать это возвращает строку. Если вам нужна дополнительная настройка, воспользуйтесь этим методом делегата:

- (UIView *)tableView:(UITableView *)tableView 
viewForHeaderInSection:(NSInteger)section 
+0

Спасибо за сообщение. Да все верно. Но по какой-то неизбежной причине мне приходится использовать Static Cell. Я попытался с помощью 'HeaderInSection', но он прокручивается с помощью' tableView'. – Tulon

+0

BEcause вы видите таблицу как сгруппированный стиль, меняйте ее на plian, если она в порядке с вашими спецификациями. – Andrea

+0

Нет. Это простой стиль. :) – Tulon

1

Чтобы выполнить то, что вы описали, у вас есть 2 варианта.

Если вы используете storyboards, это очень просто. Просто добавьте вид выше tableView с высоты ячейки вы хотите и используйте autolayout, чтобы держать их вместе, вот так:

enter image description here

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

Если вы не используете storyboard, вам нужно будет создать представление по коду или создать заголовок для вашего tableView. Единственная проблема с заголовками заключается в том, что они будут прокручиваться вниз, если пользователь прокручивается вниз

+0

Большое спасибо за ваш комментарий. Но здесь я использую 'UITableViewController' со статической ячейкой. Таким образом, я не могу положить что-то выше своего «tableView». Что бы вы ни перетаскивали на панель, она помещала каждую вещь в «tableView». В результате «образ» прокручивается с помощью «tableViewCell». – Tulon

+0

, тогда пользователь UIViewController, и разместите его внутри UITableView. По-моему, это облегчит вашу жизнь. Если вы хотите продолжить работу с UITableViewController, я предлагаю вам перейти с подходом заголовка tableView. – YuviGr

+0

По какой-то неизбежной причине мне приходится использовать Static Cell с 'UITableViewController'. В противном случае это будет сделано легко, как вы сказали. :) – Tulon

2

Я использую для установки другого UIViewController, содержащего один UIImageView и один UITableViewController.Так же, как следующее:

Add View Container to contain a UITableViewController

Вы можете выбрать вид контейнера в библиотеку объектов, так же, как что:

View Container

После запуска, это так:

Red is static, and table can scroll

+0

Нет, контейнер прокручивается ячейкой 'tableView'. – Tulon

0

Попробуйте использовать обычную ячейку и использовать ее в качестве заголовка, в то время как th e другой вы указали их + 1 для отображения

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [arrayPeople count]<1 ? 0 : arrayPeople.count-1; 
} 

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    if(arrayPeople.count>0) 
    { 
     RankingCell *cell =nil; 

     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"RankingCell" owner:nil options:nil]; 

     for (id currentObject in topLevelObjects) 
      if ([currentObject isKindOfClass:[RankingCell class]]) 
      { 
       cell = (RankingCell *)currentObject; 
       break; 
      } 

     NSDictionary *element=[arrayPeople objectAtIndex:0]; 
     element=[element dictionaryByReplacingNullsWithStrings]; 

     [cell setupCell:[element objectForKey:@"username"] title2:[element objectForKey:@"total"] title3:[element objectForKey:@"place"] remoteImage:[element objectForKey:@"image"] forPath:[NSIndexPath indexPathForItem:0 inSection:0]]; 

     return cell; 
    } 

    return nil; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    return 60; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"RankingCell"; 

    RankingCell *cell =(RankingCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) 
    { 
     NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"RankingCell" owner:nil options:nil]; 

     for (id currentObject in topLevelObjects) 
      if ([currentObject isKindOfClass:[RankingCell class]]) 
      { 
       cell = (RankingCell *)currentObject; 
       break; 
      } 
    } 

    NSDictionary *element=[arrayPeople objectAtIndex:indexPath.row+1]; 
    element=[element dictionaryByReplacingNullsWithStrings]; 

    [cell setupCell:[element objectForKey:@"username"] title2:[element objectForKey:@"total"] title3:[element objectForKey:@"place"] remoteImage:[element objectForKey:@"image"] forPath:[NSIndexPath indexPathForItem:indexPath.row+1 inSection:0]]; 

    return cell; 
}