`
stephen830
  • 浏览: 3011643 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

iOS表格绘制cell-往cell.contentView添加子视图

 
阅读更多

 

iOS表格绘制cell-往cell.contentView添加子视图

 

当你动态修改cell中的视图,比如UILabel上的文字、UIImageView的图片、UIButton,必须先删除cell.contentView中自定义的视图,代码:

//删除cell.contentView中新加的视图
        for(UIView *view in [cell.contentView subviews])
        {
            [view removeFromSuperview];
        }

 

备注:如果不加上面的代码,则表格上下滚动的时候,contentView上的标签、按钮、图片会因为缓存的缘故发生重叠。

 

 

 

 

#pragma mark - 绘制单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"-------cellForRowAtIndexPath");
    static NSString *identifier = @"cell_id";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }else{
        //删除cell.contentView中新加的视图
        for(UIView *view in [cell.contentView subviews])
        {
            [view removeFromSuperview];
        }
    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSDictionary *option = [_dicData objectForKey:[_categoryArray objectAtIndex:indexPath.section]][indexPath.row];
//    UIView* mainView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, cell.width, cell.height)];
    //时间和联赛
    UILabel* timeAndClubName = [[UILabel alloc]initWithFrame:CGRectMake(0, 12, cell.width, 10)];
    timeAndClubName.text=[NSString stringWithFormat:@"%@ %@",[[option objectForKey:@"time"] substringWithRange:NSMakeRange(11,5)],[option objectForKey:@"name"]];
    [timeAndClubName setFont:[UIFont systemFontOfSize:13]];
    timeAndClubName.textAlignment = NSTextAlignmentCenter;
    timeAndClubName.textColor = [UIColor lightGrayColor];
    //主队和客队
    UIImageView* ivTeam1Icon = [[UIImageView alloc] initWithFrame:CGRectMake(40, 20, 40, 40)];
    [ivTeam1Icon sd_setImageWithURL:[[option objectForKey:@"team1"] objectForKey:@"icon"] placeholderImage:[UIImage imageNamed:KGQ_DEFAULT_FOR_TEAM]];
    
    UIImageView* ivTeam2Icon = [[UIImageView alloc] initWithFrame:CGRectMake(cell.width-80, 20, 40, 40)];
    [ivTeam2Icon sd_setImageWithURL:[[option objectForKey:@"team2"] objectForKey:@"icon"] placeholderImage:[UIImage imageNamed:KGQ_DEFAULT_FOR_TEAM]];
    
    UILabel* lblTeam1Name = [[UILabel alloc]initWithFrame:CGRectMake(0, ivTeam1Icon.bottom +5, 120, 20)];
    lblTeam1Name.text=[[option objectForKey:@"team1"] objectForKey:@"name"];
    lblTeam1Name.textAlignment = NSTextAlignmentCenter;

    UILabel* lblTeam2Name = [[UILabel alloc]initWithFrame:CGRectMake(cell.width-120, ivTeam2Icon.bottom+5 , 120, 20)];
    lblTeam2Name.text=[[option objectForKey:@"team2"] objectForKey:@"name"];
    lblTeam2Name.textAlignment = NSTextAlignmentCenter;

    //关注按钮或比分
    BOOL isAttention = [[option objectForKey:@"attention_state"] isEqualToString:@"0"] ? NO : YES;
    UIButton* btnAttention = [UIButton buttonWithType:UIButtonTypeCustom];
    btnAttention.frame = CGRectMake((cell.width-25)/2, timeAndClubName.bottom +15, 25, 25);
    if (isAttention) {
        [btnAttention setImage:[UIImage imageNamed:@"img_collect"] forState:UIControlStateNormal];
    }else{
        [btnAttention setImage:[UIImage imageNamed:@"img_uncollect"] forState:UIControlStateNormal];
    }
    [btnAttention addTarget:self action:@selector(btnAttentionClick:) forControlEvents:UIControlEventTouchUpInside];

    
    //加入contentView
    [cell.contentView addSubview:btnAttention];
    [cell.contentView addSubview:ivTeam1Icon];
    [cell.contentView addSubview:ivTeam2Icon];
    [cell.contentView addSubview:timeAndClubName];
    [cell.contentView addSubview:lblTeam1Name];
    [cell.contentView addSubview:lblTeam2Name];

    return cell;
}

 

 

 问题:如果先定义一个UIView *mainView,然后把上面代码中的标签、按钮、图片视图先全部加到mainView中,然后再把mainView加到cell.contentView上,会发生一个奇怪的问题:运行后,按钮的点击事件不起作用,但是把表格向下或向上滚动拉出更多的cell后,按钮的点击事件又可以使用了!

 

 

 

 

 

分享到:
评论

相关推荐

    ios-表格视图.zip

    在iOS开发中,表格视图(UITableView)是十分常见且重要的组件,用于展示大量结构化的数据。本资源“ios-表格视图.zip”显然聚焦于如何通过自定义绘图技术来增强表格视图的表现力,而非依赖标准的UI控件。这种自定义...

    ios-RoundTableviewCell.zip

    一个UITableViewCell通常包含一个或多个视图,如背景视图、内容视图和子视图等。为了实现圆角效果,我们主要关注的是内容视图(contentView)和背景视图(backgroundView)。在创建自定义UITableViewCell时,我们...

    tableview分割线.zip

    let separatorView = UIView(frame: CGRect(x: 0, y: cell.contentView.frame.height - 1, width: cell.contentView.bounds.width, height: 1)) separatorView.backgroundColor = UIColor.gray cell.contentView....

    ios自定义table例子

    本示例“ios自定义table例子”旨在教你如何通过自定义UITableViewCell来实现个性化展示,让你能够在表格中自由地绘制内容。 首先,自定义一个UITableViewCell类。在Swift中,你可以创建一个新的Swift文件,例如`...

    UITableViewCell根据文字自动改变cell和lable的高度

    创建一个继承自UITableViewCell的子类,并在其中添加一个UILabel作为子视图。设置UILabel的约束,确保它填充整个cell的contentView,并设置好内边距。 2. **计算UILabel的高度**: 在`awakeFromNib`或者`...

    绘制UITableViewCell

    将自定义的形状或图像放入单独的layer,然后添加到cell的contentView上,这样可以利用硬件加速提高性能。 3. 重用机制: 务必充分利用UITableView的重用机制。在`tableView(_:cellForRowAtIndexPath:)`中,始终尝试...

    UITableViewCell自适应高度

    5. **reloadData**:在数据更改后,别忘了调用`reloadData`方法来更新表格视图。这样`UITableView`会重新计算每个单元格的高度并重新绘制。 6. **注意性能优化**: 自适应高度可能会对滚动性能造成影响,特别是当...

    用core text绘制在一个CGContextRef

    使用core text可以将文本绘制在一个CGContextRef上,最后再通过UIGraphicsGetImageFromCurrentImageContext()生成图片,再将图片赋值给cell.contentView.layer,从而达到减少cell层级的目的。 2、显示图片 图片包括...

    SwiftDynamicTableviewHeight:一个关于如何用system cell做动态高度的项目

    在iOS开发中,特别是涉及到用户界面时,表格视图(UITableView)是一种常用且强大的组件,它允许我们展示可滚动的数据列表。然而,当表格中的cell需要根据内容自适应高度时,开发者往往需要处理复杂的情况。这个项目...

    iOS使用UIBezierPath实现ProgressView

    8. 最后,将CAShapeLayer添加到视图的layer中,以便显示:`[cell.contentView.layer addSublayer:shapeLayer];` 在`ProgressTableViewCell`中,上述过程会被详细实现,每个cell的进度条根据需要绘制相应比例的红色...

    swift-这是一个可以左右滑动显示当前月份的日历

    3. 将这些子视图添加到`UIScrollView`的`contentView`中,并根据月份的顺序和布局策略调整它们的位置。 4. 实现`UIScrollViewDelegate`协议,监听`scrollViewDidScroll:`方法,以便在用户滑动时更新当前显示的月份。...

Global site tag (gtag.js) - Google Analytics