问题
I'm subclassing my UITableCell in order move the Minus image and the Delete image in EditMode to the oposite direction. It worked great so far but in iOS 6 when I use reloadData on my tableView the minus image jumps to the left side of the cell instead of staying on the right. I have no idea what changed in iOS 6 to trigger that behavior.
I don't know if that's what is causing the issue but I've logged all the origins in iOS 5 and iOS 6 and the only difference was:
iOS 5.0: Log 5 - State 1 And 3: 560.000000 , 0.000000 , 41.000000 , 40.000000
iOS 6.1: Log 5 - State 1 And 3: 808.000000 , 0.000000 , 41.000000 , 40.000000
Here's the code:
.h:
#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;
.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
回答1:
If auto-layout is enabled on the xib it could be the cause of the issue. This answer may provide some insight contentView not indenting in iOS 6 UITableViewCell prototype cell
来源:https://stackoverflow.com/questions/15255802/ios-6-1-is-acting-differently-with-willtransitiontostate