4

私はiOSアプリケーションを開発しています。テーブルビューを使用しました。ユーザーが任意のセルをクリックすると、セルが展開されます。ただし、一部のセルは iOS 7 で展開されません。他のバージョンは正常に動作します。以下はサンプルコードです。どうすれば修正できますか?

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

1 に答える 1

20

セルのサイズを調整する場合はUITableViewCellをサブクラス化し、layoutSubviewsを使って調整すると良いでしょう。

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

selectedIndexPaths を格納する配列を保持する

@property (nonatomic, strong) NSMutableArray *selectedIndexPaths;

セルの高さを計算する

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

}

カスタムの初期化 もっと見る 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;
}

ボタンクリックイベントメソッド

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

}

セルが選択されている場合、同じイベントが与えられます

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

    [self addOrRemoveSelectedIndexPath:indexPath];

}

サンプルデモ プロジェクトのリンク。

于 2013-10-01T12:21:53.327 に答える