4

UITableCellEditMode の Minus 画像と Delete 画像を反対方向に移動するために、my をサブクラス化しています。これまでのところうまくいきましたが、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 <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
4

1 に答える 1

0

xib で自動レイアウトが有効になっている場合、それが問題の原因である可能性があります。この回答は、iOS 6 UITableViewCell プロトタイプ セルで contentView がインデントされないという洞察を提供する可能性があります

于 2013-05-14T13:53:29.440 に答える