iOS 6.1 está actuando de manera diferente con willTransitionToState

Estoy subclassando mi UITableCell para mover la image Minus y la image Delete en EditMode a la dirección opuesta. Funcionó muy bien hasta ahora, pero en iOS 6 cuando uso reloadData en mi tabla, la image less salta al lado izquierdo de la celda en lugar de permanecer a la derecha. No tengo idea de lo que cambió en iOS 6 para desencadenar ese comportamiento.

No sé si eso es lo que está causando el problema, pero he registrado todos los orígenes en iOS 5 y iOS 6 y la única diferencia fue:

iOS 5.0: logging 5: estado 1 y 3: 560.000000 , 0.000000, 41.000000, 40.000000

iOS 6.1: Registro 5 – Estado 1 y 3: 808.000000 , 0.000000, 41.000000, 40.000000

Aquí está el código:

.marido:

 #import <UIKit/UIKit.h> #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; 

.metro:

 #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 

Si el layout automático está habilitado en el xib, podría ser la causa del problema. Esta respuesta puede proporcionar información de penetración de contenido no sangrante en la célula de prototipo iOS 6 UITableViewCell