Table cell extension in iOS 7

I am developing an iOS application. I used a table view. When the user clicks on any cell, the cell expands. But some boxes do not expand in iOS 7. Other versions work correctly. The following is sample code. How can I fix it?

- (BOOL)cellIsSelected:(NSIndexPath *)indexPath {
    // Return whether the cell at the specified index path is selected or not
    NSNumber *selectedIndex = [selectedIndexes objectForKey:indexPath];
    return selectedIndex == nil ? FALSE : [selectedIndex boolValue];
}


#pragma mark - Table view data source

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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if([self cellIsSelected:indexPath])
        {
            return 111;
        }
        // Cell isn't selected so return single height
        return 41;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return  [self.filteredItineraries count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"FlightTracker";

    CellFlightTracker *cell = (CellFlightTracker *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];


    if(cell == nil)
    {
        NSArray *nib=nil;

        nib = [[NSBundle mainBundle] loadNibNamed:@"CellFlightTracker" owner:self options:nil];

        cell = [nib objectAtIndex:0];
     }




        if([self cellIsSelected:indexPath])
        {
            cell.backgroundColor=[UIColor blackColor];
        }else
        {
            cell.backgroundColor=[UIColor darkGrayColor];
        }


    return cell;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
     if([self cellIsSelected:indexPath])
             cell.backgroundColor= [UIColor blackColor];
         else
             cell.backgroundColor= [UIColor darkGrayColor];
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [tableView deselectRowAtIndexPath:indexPath animated:TRUE];

        // Toggle 'selected' state
        BOOL isSelected = ![self cellIsSelected:indexPath];

        // Store cell 'selected' state keyed on indexPath
        NSNumber *selectedIndex = [NSNumber numberWithBool:isSelected];
        [selectedIndexes setObject:selectedIndex forKey:indexPath];


        // This is where magic happens...
        [tableView1 beginUpdates];
        CellFlightTracker *selectedCell = (CellFlightTracker*)[tableView cellForRowAtIndexPath:indexPath];



        if(selectedCell.lblDepartureAirportStatus.hidden)
            [selectedCell.lblDepartureAirportStatus setHidden:NO];
        else
            [selectedCell.lblDepartureAirportStatus setHidden:YES];


        [tableView1 endUpdates];
}
+4
source share
1 answer

It would be better if you are a subclass and UITableViewCell and use layoutSubviews to adjust when adjusting the cell size.

//In SMTableViewCell.h

@interface SMTableViewCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *statusLabel;
@property (weak, nonatomic) IBOutlet UIButton *seeMoreButton;

//SMTableViewCell.m

- (void)layoutSubviews
{
    CGRect labelFrame = self.statusLabel.frame;
    labelFrame.size.height = self.frame.size.height - 55.0f;
    self.statusLabel.frame = labelFrame;

    CGRect buttonFrame = self.seeMoreButton.frame;
    buttonFrame.origin.y = labelFrame.origin.y+labelFrame.size.height+10.0f;
    self.seeMoreButton.frame = buttonFrame;
}

Store an array to store selected IndexPaths

@property (nonatomic, strong) NSMutableArray *selectedIndexPaths;

Calculate cell height

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath];

    CGFloat maxHeight = MAXFLOAT;
    CGFloat minHeight = 40.0f;

    CGFloat constrainHeight = isSelected?maxHeight:minHeight;
    CGFloat constrainWidth  = tableView.frame.size.width - 20.0f;

    NSString *text       = self.items[indexPath.row];
    CGSize constrainSize = CGSizeMake(constrainWidth, constrainHeight);
    CGSize labelSize     = [text sizeWithFont:[UIFont systemFontOfSize:15.0f]
                            constrainedToSize:constrainSize
                                lineBreakMode:NSLineBreakByCharWrapping];

    return MAX(labelSize.height+75, 100.0f);

}

Initialize Custom Show More TableViewCell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CellIdentifier";

    SMTableViewCell *cell= (SMTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil)
    {
        cell = [[[NSBundle mainBundle]loadNibNamed:NSStringFromClass([SMTableViewCell class])
                                             owner:nil
                                           options:nil] lastObject];
    }

    BOOL isSelected = [self.selectedIndexPaths containsObject:indexPath];
    cell.statusLabel.numberOfLines = isSelected?0:2;

    NSString *text = self.items[indexPath.row];
    cell.statusLabel.text = text;


    NSString *buttonTitle = isSelected?@"See Less":@"See More";
    [cell.seeMoreButton setTitle:buttonTitle forState:UIControlStateNormal];
    [cell.seeMoreButton addTarget:self action:@selector(seeMoreButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [cell.seeMoreButton setTag:indexPath.row];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}

Button Click Event Method

- (void)seeMoreButtonPressed:(UIButton *)button
{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:button.tag inSection:0];
    [self addOrRemoveSelectedIndexPath:indexPath];
}

- (void)addOrRemoveSelectedIndexPath:(NSIndexPath *)indexPath
{
    if (!self.selectedIndexPaths) {
        self.selectedIndexPaths = [NSMutableArray new];
    }

    BOOL containsIndexPath = [self.selectedIndexPaths containsObject:indexPath];

    if (containsIndexPath) {
        [self.selectedIndexPaths removeObject:indexPath];
    }else{
        [self.selectedIndexPaths addObject:indexPath];
    }

    [self.tableView reloadRowsAtIndexPaths:@[indexPath]
                     withRowAnimation:UITableViewRowAnimationFade];

}

The same event is set if a cell is selected.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [self addOrRemoveSelectedIndexPath:indexPath];

}

.

+20

All Articles