今天遇到了一个情况,就是 一个table的 cell在 ios6上面显示的 很好,但是在ios8上面就有一部分显示不出来。
开始以为是 因为 cell加了个scrollerView,导致定位不准导致的问题。
代码如下:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
实现是这样的:
UILabel *startTime = [[UILabel alloc] initWithFrame:CGRectMake(10, 12, 145, 38)];
startTime.backgroundColor = [UIColor colorWithRed:240.0 / 255.0 green:240.0 / 255.0 blue:240.0 / 255.0 alpha:1.0];
startTime.textAlignment = NSTextAlignmentCenter;
startTime.textColor = [UIColor lightGrayColor];
startTime.text = NSLocalizedString(@"text_pedometer_sleep_starttime", "");
UILabel *endTime = [[UILabel alloc] initWithFrame:CGRectMake(164, 12, 148, 38)];
endTime.backgroundColor = [UIColor colorWithRed:240.0 / 255.0 green:240.0 / 255.0 blue:240.0 / 255.0 alpha:1.0];
endTime.textAlignment = NSTextAlignmentCenter;
endTime.textColor = [UIColor lightGrayColor];
endTime.text = NSLocalizedString(@"text_pedometer_sleep_endtime", "");
if ([[StringUtils getPreferredLanguage] isEqualToString:@"zh-CN"] || [[StringUtils getPreferredLanguage] isEqualToString:@"zh-TW"]) {
startTime.font = [UIFont fontWithName:chinese_font size:16];
endTime.font = [UIFont fontWithName:chinese_font size:16];
} else {
startTime.font = [UIFont fontWithName:english_font size:16];
endTime.font = [UIFont fontWithName:english_font size:16];
}
increaseOne = [UIButton buttonWithType:UIButtonTypeCustom];
increaseOne.tag = Digit_Button_One_Increase;
increaseOne.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[increaseOne setTitle:@"+" forState:UIControlStateNormal];
[increaseOne setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[increaseOne addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
increaseOne.layer.borderColor = [[UIColor orangeColor] CGColor];
increaseOne.layer.borderWidth = button_border;
decreaseOne = [UIButton buttonWithType:UIButtonTypeCustom];
decreaseOne.tag = Digit_Button_One_Decrease;
decreaseOne.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[decreaseOne setTitle:@"-" forState:UIControlStateNormal];
[decreaseOne setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[decreaseOne addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
decreaseOne.layer.borderColor = [[UIColor orangeColor] CGColor];
decreaseOne.layer.borderWidth = button_border;
increaseTwo = [UIButton buttonWithType:UIButtonTypeCustom];
increaseTwo.tag = Digit_Button_Two_Increase;
increaseTwo.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[increaseTwo setTitle:@"+" forState:UIControlStateNormal];
[increaseTwo setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[increaseTwo addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
increaseTwo.layer.borderColor = [[UIColor orangeColor] CGColor];
increaseTwo.layer.borderWidth = button_border;
decreaseTwo = [UIButton buttonWithType:UIButtonTypeCustom];
decreaseTwo.tag = Digit_Button_Two_Decrease;
decreaseTwo.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[decreaseTwo setTitle:@"-" forState:UIControlStateNormal];
[decreaseTwo setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[decreaseTwo addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
decreaseTwo.layer.borderColor = [[UIColor orangeColor] CGColor];
decreaseTwo.layer.borderWidth = button_border;
increaseThree = [UIButton buttonWithType:UIButtonTypeCustom];
increaseThree.tag = Digit_Button_Three_Increase;
increaseThree.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[increaseThree setTitle:@"+" forState:UIControlStateNormal];
[increaseThree setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[increaseThree addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
increaseThree.layer.borderColor = [[UIColor orangeColor] CGColor];
increaseThree.layer.borderWidth = button_border;
decreaseThree = [UIButton buttonWithType:UIButtonTypeCustom];
decreaseThree.tag = Digit_Button_Three_Decrease;
decreaseThree.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[decreaseThree setTitle:@"-" forState:UIControlStateNormal];
[decreaseThree setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[decreaseThree addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
decreaseThree.layer.borderColor = [[UIColor orangeColor] CGColor];
decreaseThree.layer.borderWidth = button_border;
increaseFour = [UIButton buttonWithType:UIButtonTypeCustom];
increaseFour.tag = Digit_Button_Four_Increase;
increaseFour.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[increaseFour setTitle:@"+" forState:UIControlStateNormal];
[increaseFour setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[increaseFour addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
increaseFour.layer.borderColor = [[UIColor orangeColor] CGColor];
increaseFour.layer.borderWidth = button_border;
decreaseFour = [UIButton buttonWithType:UIButtonTypeCustom];
decreaseFour.tag = Digit_Button_Four_Decrease;
decreaseFour.titleLabel.font = [UIFont fontWithName:chinese_font size:17];
[decreaseFour setTitle:@"-" forState:UIControlStateNormal];
[decreaseFour setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
[decreaseFour addTarget:self action:@selector(digitCountPressed:) forControlEvents:UIControlEventTouchUpInside];
decreaseFour.layer.borderColor = [[UIColor orangeColor] CGColor];
decreaseFour.layer.borderWidth = button_border;
increaseOne.frame = CGRectMake(10 , 60, 70, 30);
decreaseOne.frame = CGRectMake(10, 170, 70, 30);
increaseTwo.frame = CGRectMake(85, 60, 70, 30);
decreaseTwo.frame = CGRectMake(85, 170, 70, 30);
increaseThree.frame = CGRectMake(164, 60, 70, 30);
decreaseThree.frame = CGRectMake(164, 170, 70, 30);
increaseFour.frame = CGRectMake(241, 60, 70, 30);
decreaseFour.frame = CGRectMake(241, 170, 70, 30);
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(-92, 30, 50, 0)];
[view1 addSubview:digitOne];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(-16, 30, 50, 0)];
[view2 addSubview:digitTwo];
UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(63, 30, 50, 0)];
[view3 addSubview:digitThree];
UIView *view4 = [[UIView alloc] initWithFrame:CGRectMake(140, 30, 50, 0)];
[view4 addSubview:digitFour];
[cell.contentView addSubview:startTime];
[cell.contentView addSubview:endTime];
[cell.contentView addSubview:increaseOne];
[cell.contentView addSubview:decreaseOne];
[cell.contentView addSubview:increaseTwo];
[cell.contentView addSubview:decreaseTwo];
[cell.contentView addSubview:increaseThree];
[cell.contentView addSubview:decreaseThree];
[cell.contentView addSubview:increaseFour];
[cell.contentView addSubview:decreaseFour];
[cell.contentView addSubview:view1];
[cell.contentView addSubview:view2];
[cell.contentView addSubview:view3];
[cell.contentView addSubview:view4];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
cell.frame = CGRectMake(0, 0, screen_width, 250);
cell.contentView.superview.frame = cell.frame;
效果就是 在ios8 上面只能显示一部分控件,
increaseOne , 这几个控件不显示。
后面发现原因在于, increaseOne 这几个控件不是每次cell创建的时候都创建,而是用的成员变量保存起来,只创建了一次。
如何看看
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
这个函数的实现:
return [[self tableView:tableView cellForRowAtIndexPath:indexPath] frame].size.height;
这个函数为了省的自己再次计算高度,再次手动调用了1次
cellForRowAtIndexPath:indexPath
函数,导致cell 被重新创建了一次,而increaseOne这个是成员,估计在oldCell中被释放掉了,但是这个newcell不会用来显示,仅仅被用来计算高度了,导致了oldcell 中的显示问题。
找到了问题就好解决了,有2个方法:
1.
heightForRowAtIndexPath 函数中老实的每次返回自己计算的高度
2.
cellForRowAtIndexPath
函数中每次都重新创建子控件,而不是 用成员变量来保存。