iOS 6.1与willTransitionToState的行为不同

我正在为我的UITableCell子类,以便将Minus图像和EditMode中的Delete图像移动到相反的方向。 它到目前为止工作得很好,但在iOS 6中,当我在tableView上使用reloadData时,负图像跳转到单元格的左侧而不是保持在右侧。 我不知道在iOS 6中发生了什么变化来触发这种行为。

我不知道是不是导致这个问题的原因,但是我已经记录了iOS 5和iOS 6中的所有来源,唯一的区别是:

iOS 5.0:日志5 – 状态1和3: 560.000000,0.000000,41.000000,40.000000

iOS 6.1:日志5 – 状态1和3:808.000000,0.000000,41.000000,40.000000

这是代码:

。H:

 #import  #define UITableViewCellEditControlOffset 280 #define UITableViewCellDeleteConfirmationControlOffset 250 #define UITableViewCellAnimationOffset 20 #define UITableViewCellAnimationDuration 0.0 #define BigCellHeight 40 #define SmallCellHeight 40 typedef enum{ Name = -1, Additions = -2, Price = -3, BackgroundImage = -4, Line = -5, Edit = -6, Plate = -7, Sign = -8 }CellData; @interface RTLUITableViewCelliPhone : UITableViewCell { UITableViewCellStateMask state; BOOL editHiddenEarlier, priceHiddenEarlier; } @property (nonatomic, assign) BOOL inEditingMode; @property (nonatomic, assign) BOOL editable, removable; 

.M:

 #import "RTLUITableViewCelliPhone.h" @implementation RTLUITableViewCelliPhone @synthesize editable, removable, inEditingMode; - (void)layoutSubviews{ [super layoutSubviews]; self.contentView.frame = CGRectMake(0, 0, 320, BigCellHeight); } - (void)willTransitionToState:(UITableViewCellStateMask)aState{ [super willTransitionToState:aState]; state = aState; if (state==0) { for (UIView *subview in self.subviews){ if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]){ UIView *noEntranceView = [subview.subviews objectAtIndex:0]; noEntranceView.alpha = 0; } if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]){ UIView *deleteView = [subview.subviews objectAtIndex:0]; deleteView.alpha = 0; } } } if (state==1 || state==3){ for (UIView *subview in self.subviews){ if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]){ UIView *noEntranceView = [subview.subviews objectAtIndex:0]; noEntranceView.alpha = 0; subview.frame = CGRectMake(subview.frame.origin.x+UITableViewCellEditControlOffset, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); NSLog(@"Log 1 - State 1 And 3: %f , %f , %f , %f ",subview.frame.origin.x+UITableViewCellEditControlOffset, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); } if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]){ UIView *deleteView = [subview.subviews objectAtIndex:0]; deleteView.alpha = 0; subview.frame = CGRectMake(subview.frame.origin.x-UITableViewCellDeleteConfirmationControlOffset, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); NSLog(@"Log 2 - State 1 And 3: %f , %f , %f , %f ",subview.frame.origin.x-UITableViewCellDeleteConfirmationControlOffset, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); } } } if ([self inEditingMode]) { if (state==3) { editHiddenEarlier = [self.contentView viewWithTag:Edit].hidden; priceHiddenEarlier = [self.contentView viewWithTag:Price].hidden; [self.contentView viewWithTag:Sign].hidden = [self.contentView viewWithTag:Edit].hidden = [self.contentView viewWithTag:Price].hidden = YES; } if (state==1) { [self.contentView viewWithTag:Edit].hidden = !self.editable || editHiddenEarlier; [self.contentView viewWithTag:Sign].hidden = [self.contentView viewWithTag:Price].hidden = ![self.contentView viewWithTag:Edit].hidden; } } } - (void)didTransitionToState:(UITableViewCellStateMask)aState{ [super didTransitionToState:aState]; state = aState; if (state==0) { // End editing for (UIView *subview in self.subviews){ if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]){ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:UITableViewCellAnimationDuration]; UIView *noEntranceView = [subview.subviews objectAtIndex:0]; noEntranceView.alpha = 1; noEntranceView.frame = CGRectMake(noEntranceView.frame.origin.x+UITableViewCellAnimationOffset, noEntranceView.frame.origin.y, noEntranceView.frame.size.width, noEntranceView.frame.size.height); [UIView commitAnimations]; NSLog(@"Log 3 - State 0: %f , %f , %f , %f ",noEntranceView.frame.origin.x+UITableViewCellAnimationOffset, noEntranceView.frame.origin.y, noEntranceView.frame.size.width, noEntranceView.frame.size.height); } if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]){ UIView *deleteView = [subview.subviews objectAtIndex:0]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:UITableViewCellAnimationDuration]; deleteView.alpha = 1; deleteView.frame = CGRectMake(deleteView.frame.origin.x-UITableViewCellAnimationOffset, deleteView.frame.origin.y, deleteView.frame.size.width, deleteView.frame.size.height); [UIView commitAnimations]; NSLog(@"Log 4 - State 0: %f , %f , %f , %f ",deleteView.frame.origin.x-UITableViewCellAnimationOffset, deleteView.frame.origin.y, deleteView.frame.size.width, deleteView.frame.size.height); } } } if (state==1 || state==3){ for (UIView *subview in self.subviews){ if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellEditControl"]){ subview.frame = CGRectMake(560, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); NSLog(@"Log 5 - State 1 And 3: %f , %f , %f , %f ",subview.frame.origin.x+UITableViewCellEditControlOffset, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); UIView *noEntranceView = [subview.subviews objectAtIndex:0]; noEntranceView.frame = CGRectMake(noEntranceView.frame.origin.x+UITableViewCellAnimationOffset, noEntranceView.frame.origin.y, noEntranceView.frame.size.width, noEntranceView.frame.size.height); NSLog(@"Log 6 - State 1 And 3: %f , %f , %f , %f ",noEntranceView.frame.origin.x+UITableViewCellAnimationOffset, noEntranceView.frame.origin.y, noEntranceView.frame.size.width, noEntranceView.frame.size.height); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:UITableViewCellAnimationDuration]; noEntranceView.alpha = 1; noEntranceView.frame = CGRectMake(noEntranceView.frame.origin.x-UITableViewCellAnimationOffset, noEntranceView.frame.origin.y, noEntranceView.frame.size.width, noEntranceView.frame.size.height); [UIView commitAnimations]; NSLog(@"Log 7 - State 1 And 3: %f , %f , %f , %f ",noEntranceView.frame.origin.x-UITableViewCellAnimationOffset, noEntranceView.frame.origin.y, noEntranceView.frame.size.width, noEntranceView.frame.size.height); } if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]){ subview.frame = CGRectMake(subview.frame.origin.x-UITableViewCellDeleteConfirmationControlOffset, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); NSLog(@"Log 8 - State 1 And 3: %f , %f , %f , %f ",subview.frame.origin.x-UITableViewCellDeleteConfirmationControlOffset, subview.frame.origin.y, subview.frame.size.width, subview.frame.size.height); UIView *deleteView = [subview.subviews objectAtIndex:0]; deleteView.frame = CGRectMake(deleteView.frame.origin.x-UITableViewCellAnimationOffset, deleteView.frame.origin.y, deleteView.frame.size.width, deleteView.frame.size.height); NSLog(@"Log 9 - State 1 And 3: %f , %f , %f , %f ",deleteView.frame.origin.x-UITableViewCellAnimationOffset, deleteView.frame.origin.y, deleteView.frame.size.width, deleteView.frame.size.height); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:UITableViewCellAnimationDuration]; deleteView.alpha = 1; deleteView.frame = CGRectMake(deleteView.frame.origin.x+UITableViewCellAnimationOffset, deleteView.frame.origin.y, deleteView.frame.size.width, deleteView.frame.size.height); [UIView commitAnimations]; NSLog(@"Log 10 - State 1 And 3: %f , %f , %f , %f ",deleteView.frame.origin.x+UITableViewCellAnimationOffset, deleteView.frame.origin.y, deleteView.frame.size.width, deleteView.frame.size.height); } } } } @end 

如果在xib上启用了自动布局,则可能是问题的原因。 这个答案可能会提供一些洞察内容, 而不是在iOS 6 UITableViewCell原型单元中缩进