IT虾米网

自定义UITableView折叠效果详解

sanshao 2018年06月24日 手机开发 426 0
类似于QQ的那种折叠效果。只刷新点击的折叠行。不加载所有数据源。 测试环境Xcode4.3.3+SDK5.1兼容ios6
// 
//  MyTableViewController.m 
//  TableSectionStatistics 
// 
 
#import "MyTableViewController.h" 
#define originalHeight 25.0f 
#define newHeight 85.0f 
#define isOpen @"85.0f" 
 
@interface MyTableViewController () 
 
@end 
 
@implementation MyTableViewController 
{ 
    NSMutableDictionary *dicClicked; 
    NSInteger count; 
    CGFloat mHeight; 
    NSInteger sectionIndex; 
} 
 
- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
        // Custom initialization 
    } 
    return self; 
} 
 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    count = 0; 
    mHeight = originalHeight; 
    sectionIndex = 0; 
    dicClicked = [NSMutableDictionary dictionaryWithCapacity:3]; 
} 
 
- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 
 
#pragma mark - Table view data source 
 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 50; 
} 
 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 2; 
} 
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{     
    static NSString *contentIndentifer = @"Container"; 
    if (indexPath.row == 0) { 
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:contentIndentifer]; 
        if (cell == nil) { 
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:contentIndentifer]; 
        } 
        NSString *statisticsContent = [[NSString alloc] initWithString:@"rlf:岁月流芳,花开几度,走在岁月里,醉在流香里,总在时光里辗转徘徊。花开几许,落花几度,岁月寒香,飘进谁的诗行,一抹幽香,掺入几许愁伤,流年似花,春来秋往,睁开迷离的双眼,回首张望,随风的尘烟荡漾着迷忙,昨日的光阴已逝去,留下无尽的回忆让人留恋与追忆"]; 
        cell.textLabel.font = [UIFont systemFontOfSize:12.0f]; 
        cell.textLabel.text = statisticsContent; 
        cell.textLabel.textColor = [UIColor brownColor] 
        ; 
        cell.textLabel.opaque = NO; // 选中Opaque表示视图后面的任何内容都不应该绘制         
        cell.textLabel.numberOfLines = 8;         
        cell.selectionStyle = UITableViewCellSelectionStyleNone; 
        return cell; 
    } 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    cell.imageView.image = [UIImage imageNamed:@"ic_milestone_heart.png"]; 
    cell.textLabel.text = [NSString stringWithFormat:@"%d",count]; 
    count++; 
    return cell; 
} 
 
//Section的标题栏高度 
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    if (section == 0) 
        return 46; 
    else 
        return 30.0f; 
} 
 
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    CGRect headerFrame = CGRectMake(0, 0, 300, 30); 
    CGFloat y = 2; 
    if (section == 0) { 
        headerFrame = CGRectMake(0, 0, 300, 100); 
        y = 18; 
    } 
    UIView *headerView = [[UIView alloc] initWithFrame:headerFrame]; 
    UILabel *dateLabel=[[UILabel alloc] initWithFrame:CGRectMake(20, y, 240, 24)];//日期标签 
    dateLabel.font=[UIFont boldSystemFontOfSize:16.0f]; 
    dateLabel.textColor = [UIColor darkGrayColor]; 
    dateLabel.backgroundColor=[UIColor clearColor]; 
    UILabel *ageLabel=[[UILabel alloc] initWithFrame:CGRectMake(216, y, 88, 24)];//年龄标签 
    ageLabel.font=[UIFont systemFontOfSize:14.0]; 
    ageLabel.textAlignment=UITextAlignmentRight; 
    ageLabel.textColor = [UIColor darkGrayColor]; 
    ageLabel.backgroundColor=[UIColor clearColor]; 
 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.dateFormat = @"MM dd,yyyy"; 
    dateLabel.text = [NSString stringWithFormat:@"%@",[dateFormatter stringFromDate:[NSDate date]]]; 
    ageLabel.text = @"1岁 2天"; 
 
    [headerView addSubview:dateLabel]; 
    [headerView addSubview:ageLabel]; 
    return headerView; 
} 
 
#pragma mark - Table view delegate 
 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 0) {    
        UITableViewCell *targetCell = [tableView cellForRowAtIndexPath:indexPath]; 
        if (targetCell.frame.size.height == originalHeight+1){           
            [dicClicked setObject:isOpen forKey:indexPath]; 
        } 
        else{      
            [dicClicked removeObjectForKey:indexPath]; 
        }        
      [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
    NSLog(@"indexPath=%@",indexPath); 
    NSLog(@"dicClicked=%@",dicClicked); 
} 
 
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 0) { 
        if ([[dicClicked objectForKey:indexPath] isEqualToString: isOpen])  
            return [[dicClicked objectForKey:indexPath] floatValue]; 
        else 
            return originalHeight;      
    } 
    else { 
        return 45.0f; 
    } 
} 
 
@end 
 

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

iOS应用中网络等待Loading的实现方法详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。