今天遇到了一个情况,就是 一个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
函数中每次都重新创建子控件,而不是 用成员变量来保存。