在tableview单元格中动态调整子视图的大小

时间:2015-04-07 05:35:59

标签: ios xcode uitableview addsubview

关于在tableView Cell中添加子视图我有一个小问题。

我的细胞背景是百分比计数的动态。

enter image description here

我正确地得到了百分比,我可以完美地设置背景,但是当我添加一个新条目时......所有搞砸了

enter image description here

我得到的新条目是完美的,但是之前的细胞在我调整大小之后仍保持相同。

神奇的事情就是当我停下来并建立完美的方式时......

enter image description here

请帮帮我..

我使用以下代码来实现这一目标......

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// Dequeue the cell.
speedoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"speedoCell" forIndexPath:indexPath];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

CGRect rect = cell.frame;

NSLog(@"Cell width = %f",rect.size.width);
float cell_width=rect.size.width;
float per;
float viewSize=0.0;


if (self.recent_calls.count == 0) {
    cell.title.text =@"No records";
    cell.desc.text =@"";
}

else{
    NSInteger indexOfFirstname = [self.dbManager.arrColumnNames indexOfObject:@"ex_category"];
    NSInteger indexOfSecondname = [self.dbManager.arrColumnNames indexOfObject:@"totle"];

    NSString *totle_cat=[NSString stringWithFormat:@"%@", [[self.recent_calls objectAtIndex:indexPath.row] objectAtIndex:indexOfSecondname]];

    int x=[totle_cat intValue];
    NSLog(@"%d--yoyoyoyoyoyoyoyoyoyo--%d",x,amount_totle);

    float result=0;

    result=((float)x/(float)amount_totle)*100;

// cell_width is static = 343.0 ..... result is percentage we found
viewSize=(cell_width*result)/100;

     NSLog(@"%f----------",viewSize);

    UIView *view,*view1;


    view=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 0, 0)];
    view1=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 0, 0)];


    view1.frame=CGRectMake(5, 5, cell.frame.size.width-10, cell.frame.size.height-3);

    [view1.layer setCornerRadius:8.0f];
    [view1.layer setMasksToBounds:YES];
    [view1.layer setBorderWidth:0.5f ];


    CGRect frame = view.frame;
    frame.size.width = viewSize;
    frame.size.height=cell.frame.size.height-3;
    view.frame = frame;


    NSLog(@"%f",view.frame.size.width);

    [view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"road_panorama1.jpg"]]];


    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];

    UIVisualEffectView *visualEffectView;
    visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];

    visualEffectView.frame = CGRectMake(0, 0, viewSize, cell.frame.size.height-3);
    [view addSubview:visualEffectView];

    [view1 setBackgroundColor:[UIColor whiteColor]];

    [view1 insertSubview:view atIndex:0];

    [cell.contentView insertSubview:view1 atIndex:0];
UIImage *image;
    if ([category isEqualToString:@"Travel"]) {
        image=[UIImage imageNamed:@"taxi13.png"];

    }
    else if ([category isEqualToString:@"Food"]) {

        image=[UIImage imageNamed:@"fastfood6.png"];
    }
    else if ([category isEqualToString:@"Medical"]) {

        image=[UIImage imageNamed:@"stethoscope11.png"];
    }
    else if ([category isEqualToString:@"Shopping"]) {

        image=[UIImage imageNamed:@"shopping-cart13.png"];
    }
    else{


        image=[UIImage imageNamed:@"question-mark2.png"];
    }


    [cell.img setImage:image];




}
return cell;

}

从第二个视图控制器添加条目

 NSString *query= [NSString stringWithFormat:@"insert into ex_man_last (ex_title,ex_amount,ex_description,ex_date,ex_category,ex_upload_date,ex_image,ex_my) values ('%@','%@','%@','%@','%@','%@','%@','%@')",_ex_title.text,_ex_amount.text,_ex_description.text,_ex_date.text,_ex_category.text,datestring,imageName,my ];

// Execute the query.
[self.dbManager executeQuery:query];

并调用方法从视图中的db获取更新条目将出现方法..

 NSString *query =[NSString stringWithFormat:@"SELECT *,sum(ex_amount) as totle FROM ex_man_last where ex_my='%@' GROUP BY ex_category ",query_date];


if (self.recent_calls != nil ) {
    self.recent_calls = nil;

}
self.recent_calls = [[NSArray alloc] initWithArray:[self.dbManager loadDataFromDB:query]];
NSLog(@"--->%@",_ex_main);
NSLog(@"%lu",(unsigned long)[self.recent_calls count]);

NSInteger indexOfSecondname = [self.dbManager.arrColumnNames indexOfObject:@"totle"];

for (int i=0; i<[self.recent_calls count]; i++) {
    NSString *amount=[[self.recent_calls objectAtIndex:i] objectAtIndex:indexOfSecondname] ;
    amount_totle=amount_totle+[amount intValue];
}

整个代码在索引路径方法的行的单元格中...

请帮帮我...提前致谢...

2 个答案:

答案 0 :(得分:1)

使用speedoCell *cell = [tableView dequeueReusableCellWithIdentifier:@"speedoCell" forIndexPath:indexPath];

时使用可重复使用的单元格

因此,一旦分配了单元格,它将一次又一次地重复使用。

考虑一个案例,第一次创建具有两个单元格的表格,如屏幕截图1所示,其中Medical和Travel具有80&amp;因此,您分别创建了模糊视图并将其添加到白色视图上20%,最后在单元格的contentView的第0个索引上插入了view1(包含模糊效果的白色背景的视图)。

上述情况完美无缺。

再次,你插入新的条目(单元格)食物,所有事情搞砸了! 这里的问题是,因为索引0和1之前创建了两个单元格,因此它们被重用,这次数据被更改,因此您计算了模糊和白色区域,创建了视图并再次插入到单元格的内容视图中在索引0处,这是问题所在。

无论在superview上相同索引处添加的其他视图如何,已经插入索引的视图都将可见。

要解决此问题,如果首次重复使用该单元格,则必须检查重用单元格是否包含具有模糊效果的白色背景视图,然后必须先将其删除,重新计算模糊度白色区域,并再次在单元格的contentView的索引0处插入view1。

这是重复使用单元格的时间,因此首先我们从单元格的内容视图中删除索引0处已插入的视图,再次创建白色+模糊视图,并在第0个索引处插入新创建的视图单元格的内容视图,并且将始终显示新创建的内容视图(因为一次将存在一个,之前将删除)。

答案 1 :(得分:1)

oky,试试吧,

为什么要在方法cellForRowAtIndexPath中执行所有操作,其工作是返回tableview的单元格,以便不处理单元格内的所有子视图

Cell是处理它里面的每一件东西的人。它包含内容视图,其中包含您的视图组件,因此我们不允许单元格处理其视图组件。为此,我们需要将一些信息传递给它,例如在您的情况下百分比和标签文本以及您正在显示的图像和休息将其留给单元格。如果您正在修改某些内容或根据(MVC)模式添加新组件,这将在功能中使用。

我不会只关注你的问题做所有的事情,在cellForRowAtIndexPath你每次都要继续添加新的视图,即使是重复使用的单元格也是如此。只需删除所有视图处理代码(这将在自定义单元格中使用)

如果你只是想创建一个新项目并尝试一下,我真的在这里尝试了你的代码,我工作正常,所以让我们尝试一个新的项目,这样你就可以清楚地理解了,最后我也会添加gif文件以显示结果。

首先创建一个子类为UITableViewCell的新文件,并为其命名,我将其作为CustomCell

<{1>}文件中的

CustomCell.h
<{1>}文件中的

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface CustomCell : UITableViewCell

 //creating the properties for all view components and also for percentage value that we need for calculating of width
 //i took your code hear 
@property (nonatomic, assign) CGFloat percentage;
@property (nonatomic, assign) CGFloat viewWidth;

@property (nonatomic, strong) UIView *view;
@property (nonatomic, strong) UIView *view1;

@property (nonatomic, strong)  UIBlurEffect *blurEffect ;

@property (nonatomic, strong) UIVisualEffectView *visualEffectView;
@property (nonatomic, strong)  UILabel *percentageLabel ;
@end

来到主控制器 在主视图控制器中, 为它添加一个tableview和刮刀出口

CustomCell.m

#import "CustomCell.h" @implementation CustomCell //we are using this to create new cell just override it and call super - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if(self) { [self initiliseViewComponents]; //hear we are adding views to cell } return self; } - (void)setPercentage:(CGFloat)percentage { float result=0; result=((float)percentage/(float)100)*100; _percentage = result; _viewWidth = result*343 / 100; _percentageLabel.text = [NSString stringWithFormat:@"%d",(int)_percentage]; //to show the percentage } //at this point we don't no the size of cell, //same what u are doing in your project just initialising and add it to cell's content view - (void)initiliseViewComponents { _view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 0, 0)]; _view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 0, 0)]; _blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]; _visualEffectView = [[UIVisualEffectView alloc] initWithEffect:_blurEffect]; _percentageLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 0, 0)]; [_view addSubview:_visualEffectView]; [_view1 setBackgroundColor:[UIColor whiteColor]]; [_view1 insertSubview:_view atIndex:0]; [self.contentView insertSubview:_view1 atIndex:0]; [self.contentView addSubview:_percentageLabel]; } - (void)awakeFromNib { // Initialization code } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } //in this method just set frames for your subviews this method will be called automatically //dont change the cell's frame just the subviews frame - (void)layoutSubviews { _percentageLabel.frame = CGRectMake(self.contentView.bounds.size.width - 50, self.contentView.bounds.origin.y + 10, 50, 50); CGRect cellFrame = self.contentView.frame; cellFrame.origin.x += 5; cellFrame.origin.y += 5; cellFrame.size.width -= 10; cellFrame.size.height -= 3; _view1.frame=cellFrame; [_view1.layer setCornerRadius:8.0f]; [_view1.layer setMasksToBounds:YES]; [_view1.layer setBorderWidth:0.5f ]; // [_view setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"images2.jpg"]]]; [_view setBackgroundColor:[UIColor redColor]]; self.backgroundColor = [UIColor clearColor]; CGRect frame = _view.frame; frame.size.width = _viewWidth; frame.size.height = self.frame.size.height-3; _view.frame = frame; _visualEffectView.frame = CGRectMake(0, 0, _viewWidth, frame.size.height); NSLog(@"%f",_view.frame.size.width); [super layoutSubviews]; //finally call super } @end 实现数据源和委托

//in ViewController.h
@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *aTableView;
@property (strong,nonatomic) NSMutableArray *aMutableArray; //to holde percentages

所以按下运行按钮,结果将如下所示

enter image description here

抱歉gif图像我不得不压缩它质量有点低蓝色按钮是将新单元添加到tableview并且标签不需要

希望这有助于你