2013-04-26 4 views
2

После просмотра Интернета для различных способов создания расширяющихся/собираемых UITableViewCells, я начал свой подход раньше сегодня.Расширение UITableViewCell не работает должным образом

У меня есть массив, который содержит состояние каждой строки в моем UITableView (COLLAPSED = 0, EXPANDED = 1). Когда нажата кнопка expand, я меняю состояние в массиве и вызываю reloadSection в зависимости от того, какой раздел должен быть обновлен.

В моем методе делегата heightForRowAtIndexPath я проверяю, нужно ли расширять ячейку или нет и возвращать нужную высоту. Проблема, с которой я сталкиваюсь, заключается в том, что моя ячейка действительно расширяется, но вместо того, чтобы показывать мой контент под ним (я сделал ячейку намного больше, добавив дополнительную информацию под сокращенным ее в IB и включив подзаголовки клипов, чтобы зафиксировать перекрытие ячеек), это показывает два других сгруппированных UITableViewCells с похожим фоном, как у меня, и выбрасывает расположение некоторых ярлыков/кнопок.

Я включаю фотографии того, как он выглядит нормально и расширен. Я прошел через код, и все выглядит нормально, я думаю, что может быть настройка, которую мне нужно изменить, чтобы это правильно отображалось.

Collapsed

Expanded

Collapsed Cell in IB

Expanded Cell in IB

Вот источник:

#define UITABLEVIEWCELLSIZE_COLLAPSED 97 
#define UITABLEVIEWCELLSIZE_EXPANDED 285 
#define EXPANDED 1 
#define COLLAPSED 0 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    NSNumber *state = [cellExpansionArray objectAtIndex:[indexPath section]]; 
    if ([state intValue] == COLLAPSED) { 
     return UITABLEVIEWCELLSIZE_COLLAPSED; 
    }else if([state intValue] == EXPANDED) { 
     return UITABLEVIEWCELLSIZE_EXPANDED; 
    } 
    return UITABLEVIEWCELLSIZE_COLLAPSED; 
} 

//expandCell is called when the arrow indicator is clicked on the cell 
-(IBAction)expandCell:(id)sender 
{ 
    NSInteger cellNumber = [sender tag]; 
    NSNumber *state = [cellExpansionArray objectAtIndex:cellNumber]; 
    if (state.intValue == 0) { 
     [cellExpansionArray replaceObjectAtIndex:cellNumber withObject:[NSNumber numberWithInt:EXPANDED]]; 
    }else if (state.intValue == 1) { 
     [cellExpansionArray replaceObjectAtIndex:cellNumber withObject:[NSNumber numberWithInt:COLLAPSED]]; 
    } 
    //[self.tableView beginUpdates]; 
    //[self.tableView endUpdates]; 
    //[self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:cellNumber] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    [self.tableView reloadData]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"PCFCustomCell"; 
    PCFCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    //cell.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
    [cell setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"1slot.png"]]]; 
    PCFClassModel *course = [classesOffered objectAtIndex:[indexPath section]]; 
    cell.courseCRN.text = [course CRN]; 
    cell.courseDataRange.text = [course dateRange]; 
    cell.courseDaysOffered.text = [course days]; 
    cell.courseHours.text = [course credits]; 
    cell.courseInstructor.text = [course instructor]; 
    cell.courseTime.text = [course time]; 
    cell.courseLocation.text = [course classLocation]; 
    cell.courseSection.text = [course sectionNum]; 
    cell.courseName.text = [course courseNumber]; 
    cell.courseTitle.text = [course classTitle]; 
    cell.courseType.text = [course scheduleType]; 
    //cell.professorEmail.text = [course instructorEmail]; 
    [cell.mailProf setTag:[indexPath section]]; 
    [cell.showCatalog setTag:[indexPath section]]; 
    [cell.followClass setTag:[indexPath section]]; 
    [cell.addToSchedule setTag:[indexPath section]]; 
    [cell.buttonDropDown setTag:[indexPath section]]; 
    [cell.mailProf setHidden:NO]; 
    [cell.mailProf setEnabled:YES]; 
     if (![course instructorEmail]) { 
      [cell.mailProf setTitle:@"NO EMAIL PROVIDED" forState:UIControlStateNormal]; 
      [cell.mailProf setEnabled:NO]; 
     } 
    [cell.followClass setBackgroundImage:[UIImage imageNamed:@"search_res_11.png"] forState:UIControlStateNormal]; 
    [cell.addToSchedule setBackgroundImage:[UIImage imageNamed:@"search_res_09.png"] forState:UIControlStateNormal]; 
    if ([savedResults count] > 0) { 
     for (PCFClassModel *courseTwo in savedResults) { 
      if ([[courseTwo CRN] isEqualToString:[course CRN]]) { 
       [[cell followClass] setBackgroundImage:[UIImage imageNamed:@"favorite_activated.png"] forState:UIControlStateNormal]; 
       break; 
      } 
     } 
    } 
    //schedule 
    if ([savedSchedule count] > 0) { 
     for (PCFClassModel *courseTwo in savedSchedule) { 
      if ([[courseTwo CRN] isEqualToString:[course CRN]]) { 
       [[cell addToSchedule] setBackgroundImage:[UIImage imageNamed:@"purdue_activated.png"] forState:UIControlStateNormal]; 
       break; 
      } 
     } 
    } 
    [cell.mailProf addTarget:self action:@selector(mailProf:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.showCatalog addTarget:self action:@selector(showCatalog:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.followClass addTarget:self action:@selector(followClass:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.addToSchedule addTarget:self action:@selector(addToSchedule:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.buttonDropDown addTarget:self action:@selector(expandCell:) forControlEvents:UIControlEventTouchUpInside]; 
    //get internet data 
    /* 
    [[cell staticAvailable] setHidden:YES]; 
    [[cell available] setHidden:YES]; 
    [cell.available setText:@""]; 
    [[cell remainingActivityIndicator] startAnimating]; 
    dispatch_queue_t getSpots = dispatch_queue_create("GetSpots", nil); 
    dispatch_async(getSpots, ^{ 
     NSString *webData = nil; 
     while (!webData && self.view.window) webData = [PCFWebModel queryServer:[course classLink] connectionType:nil referer:@"https://selfservice.mypurdue.purdue.edu/prod/bwckschd.p_get_crse_unsec" arguements:nil]; 
     if (!self.view.window) return; 
     NSArray *courseRecord = [PCFWebModel parseData:webData type:3]; 
     PCFCourseRecord *record = [courseRecord objectAtIndex:0]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [[cell remainingActivityIndicator] stopAnimating]; 
      [[cell staticAvailable] setHidden:NO]; 
      NSString *val = @"1"; 
      if ([val compare:record.enrolled] > 0) { 
       //[[cell available] setTextColor:[UIColor redColor]]; 
      }else { 
       //[[cell available] setTextColor:[UIColor colorWithRed:.0565442 green:.430819 blue:.0724145 alpha:1]]; 

      } 
      [[cell available] setText:[NSString stringWithFormat:@"SLOTS: %@/%@", record.enrolled,record.capacity]]; 
      [[cell available] setHidden:NO]; 
      [PCFAnimationModel fadeTextIntoView:cell.available time:1]; 
      [PCFAnimationModel fadeTextIntoView:cell.staticAvailable time:1]; 
     }); 
    }); 
    */ 
    // Configure the cell... 
    //[PCFFontFactory convertViewToFont:cell]; 
    [cell.courseTitle setFont:[PCFFontFactory droidSansFontWithSize:13]]; 
    [cell.courseName setFont:[PCFFontFactory droidSansFontWithSize:38]]; 
    [cell.courseDaysOffered setFont:[PCFFontFactory droidSansBoldFontWithSize:11]]; 
    NSNumber *state = [cellExpansionArray objectAtIndex:indexPath.section]; 
    if (state.intValue == COLLAPSED) { 
     [cell.imageViewBackground setHidden:YES]; 
    }else { 
     //[cell.imageViewBackground setHidden:NO]; 
    } 
    return cell; 
} 
+0

Проверить мой вопрос: http://stackoverflow.com/q/15245488/1603072 – Bhavin

+0

Это не помогло, так как мои ячейки расширялись/сокращались на кнопку tap – kamran619

+0

Забыв фоновое изображение, все предметы привязаны к вершине и внизу, вы пытались привязать их к левому/верхнему? –

ответ

0

Это похоже на проблему автосохранения для меня! Подвижности вашей ячейки имеют гибкие поля & ширина, высота. Я могу дать несколько предложений, а не точное решение. Надеюсь, что они помогают ..

  1. Попробуйте удалить свойства Autosizing для подвидов (В XIB нажмите на view-> Гото Размер inspector-> Autosizing) ИЛИ
  2. 2 разные шаблоны ячеек, которые будут использоваться во время состояния расширения и разрушаться. Та же ячейка XIB с двумя различными ячейками. Используйте UINib для загрузки xib.
  3. Не используйте изображение рисунка в качестве фона ячейки, если изображение фиксированного размера. Используйте API изображений stretchableImageWithLeftCapWidth:topCapHeight.

Приветствия!
Amar.

+0

Я решил проблему. Мне нужно, чтобы ячейка была в максимальном размере в IB, вместо того, чтобы устанавливать ее на меньший размер. По какой-то причине, если я буду расширять ее, когда она находится на минимальной высоте в IB, Если я оставлю его полный размер в IB и просто измените высоту кода, он работает – kamran619

-1

Вы не отправил свой cellForRowAtIndexPath, но я предполагаю, что вы неправильно используете ячейки там. Проверьте ответ на аналогичный вопрос:

Objective C UITableView - Table cells display wrong content after changing cell's height


Я попытался с кодом похож на ваш и, кажется, работает, как ожидалось.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    states = [[NSMutableArray alloc] init]; 
    for (int i = 0; i < 10; i++) 
    { 
     [states addObject:[NSNumber numberWithBool:false]]; 
    } 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellId"]; 
    cell.textLabel.text = [NSString stringWithFormat:@"Title @%d", indexPath.section]; 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"Subtitle @%d", indexPath.row]; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath 
{ 
    NSNumber *state = [states objectAtIndex:indexPath.section]; 
    [states replaceObjectAtIndex:indexPath.section withObject:[NSNumber numberWithBool:!state.boolValue]]; 

    [self.tableView reloadData]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSNumber *state = [states objectAtIndex:indexPath.section]; 
    if (state.boolValue == false) 
    { 
     return 100; 
    } 
    else 
    { 
     return 244; 
    } 
} 
+0

Эй, мне не нужно ничего менять в cellForRowAtIndexPath, поскольку содержимое уже находится в ячейке и не нуждается в изменении. Это чуть ниже того, что может видеть пользователь, пока не будет нажата кнопка расширения. Если вы видите прикрепленные изображения, вы можете видеть, о чем я говорю. – kamran619

+0

Итак, у вас в основном есть прототип из одной ячейки, который вы заполняете полностью, когда вызывается 'cellForRowAtIndexPath'? Разница только в том, что вы меняете высоту расширенных ячеек? – gberginc

+0

Правильно. Ячейка полностью заполнена cellForRowAtIndexPath. Единственное, что сделано, это изменение высоты и изменение ячейки, и я вызываю reloadSections .. EDIT: Я буду включать cellForRowAtIndexPath в любом случае – kamran619

-1

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

[tableview beginUpdates]; 
[tableview endUpdates]; 
+0

Эй, я уже пробовал несколько способов, например, вы отправили, перезагрузили раздел, о котором идет речь, и перезагрузили всю таблицу - ни одна из них не работала :( – kamran619

+0

О, вы тоже. Извините, я полностью пропустил бит, который был – Bergasms

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