1

何か変なことに問題があります。無限に反転するUIViewのグリッドを作成しようとしています。この目的のために、私は次のクラスを作成しました。

@implementation LMFlipViewController

@synthesize viewOne=_viewOne, viewTwo=_viewTwo, animationDuration=_animationDuration, pause=_pause, animationFlag=_animationFlag;

-(LMFlipViewController *)initWithViewOne:(UIView *)viewOne viewTwo:(UIView *)viewTwo animationDuration:(CGFloat)animationDuration andPauseInBetweenAnimation:(CGFloat)pause {
    [super init];
    [self.view setFrame:viewOne.bounds];
    _viewOne=viewOne;
    _viewTwo=viewTwo;
    _animationDuration=animationDuration;
    _pause=pause;
    return self;
}

-(void)viewDidLoad{
    [super viewDidLoad];
    NSLog(@"0");
    _animationFlag=NO;
}

-(void)viewDidUnload{
    [super viewDidUnload];
}

-(void)viewWillAppear:(BOOL)animated {
    [self.view addSubview:_viewOne];
//    [self performSelector:@selector(loopAnimation) withObject:nil afterDelay:_pause];
    [NSTimer scheduledTimerWithTimeInterval:_pause
                                     target:self
                                   selector:@selector(loopAnimation)
                                   userInfo:nil
                                    repeats:NO];
    NSLog(@"1");
}

-(void)triggerAnimation {
    NSLog(@"5");
    if (_animationFlag) {
        NSLog(@"Animation flag: YES");
        _animationFlag=NO;
        [UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
            [_viewTwo removeFromSuperview];
        } completion:^(BOOL finished) {
            [UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
                [self.view addSubview:_viewOne];
            } completion:nil];
        }];
    }else{
        NSLog(@"Animation flag: NO");
        _animationFlag=YES;
        [UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
            [_viewOne removeFromSuperview];
        } completion:^(BOOL finished) {
            [UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
                [self.view addSubview:_viewTwo];
            } completion:nil];
        }];
    }
    NSLog(@"6");
}

-(void)loopAnimation {
    NSLog(@"2");
    [self triggerAnimation];
    NSLog(@"3");
//    [self performSelector:@selector(loopAnimation) withObject:nil afterDelay:_pause];
    [NSTimer scheduledTimerWithTimeInterval:_pause
                                     target:self
                                   selector:@selector(loopAnimation)
                                   userInfo:nil
                                    repeats:NO];
    NSLog(@"4");
}

@end

次に、このクラスを次のように試しました。

- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *viewOne=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    viewOne.backgroundColor=[UIColor redColor];

    UIView *viewTwo=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    viewTwo.backgroundColor=[UIColor purpleColor];

    LMFlipViewController *flipViewController=[[LMFlipViewController alloc] initWithViewOne:viewOne viewTwo:viewTwo animationDuration:0.5 andPauseInBetweenAnimation:3];
    [self.view addSubview:flipViewController.view];

    UIView *viewThree=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    viewThree.backgroundColor=[UIColor blackColor];

    UIView *viewFour=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    viewFour.backgroundColor=[UIColor blueColor];

    LMFlipViewController *flipViewControllerTwo=[[LMFlipViewController alloc] initWithViewOne:viewThree viewTwo:viewFour animationDuration:0.5 andPauseInBetweenAnimation:3];
    [flipViewControllerTwo.view setFrame:CGRectMake(0, 60, 100, 50)];
    [self.view addSubview:flipViewControllerTwo.view];
}

この方法は完璧に機能しました。重要なのは、この方法でいくつかのフリップビューをインスタンス化する必要があり、それらを「for」ループで実装する必要があるということです。だから私はこれを試しました:

- (void)viewDidLoad {
    [super viewDidLoad];
    for (int i=0;i<2;i++) {
        UIView *viewOne=[[UIView alloc] initWithFrame:CGRectMake(0, i*60, 100, 50)];
        viewOne.backgroundColor=[UIColor redColor];

        UIView *viewTwo=[[UIView alloc] initWithFrame:CGRectMake(0, i*60, 100, 50)];
        viewTwo.backgroundColor=[UIColor purpleColor];

        [self.view addSubview:[[LMFlipViewController alloc] initWithViewOne:viewOne viewTwo:viewTwo animationDuration:0.5 andPauseInBetweenAnimation:3].view];
    }
}

ループを試してみると、最初のビューは正しくアニメーション化されていますが、他のビューは正しくアニメーション化されていません。アニメーションはスキップされ、ビューの切り替えはまっすぐになります。

誰かが理由を知っていますか?私の推測では、それはスレッドの問題かこのようなものだと思いますが、私はこれらのものについて無知です。どんな助けでも歓迎します。どうも。

4

1 に答える 1

1

の2つのバージョンの間には少し矛盾がありますviewDidLoad。私は次のようにループしたものを書きます:

- (void)viewDidLoad {
  [super viewDidLoad];
  for (int i=0;i<2;i++) {
    UIView *viewOne=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    viewOne.backgroundColor=[UIColor redColor];

    UIView *viewTwo=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
    viewTwo.backgroundColor=[UIColor purpleColor];

    LMFlipViewController *flipViewController=[[LMFlipViewController alloc] initWithViewOne:viewThree viewTwo:viewFour animationDuration:0.5 andPauseInBetweenAnimation:3];
    [flipViewController.view setFrame:CGRectMake(0, i*60, 100, 50)];
    [self.view addSubview:flipViewController.view];

  }
}

これが物事を改善するかどうかわからない。

別の問題があります(ARCを使用していないと言っているため):LMFlipViewController割り当て/初期化されて解放されないため、すべてのオブジェクトがリークします(保存されておらず、参照が後で単に「失われる」ため、リークすることはできません)メソッドを終了しviewDidLoadます)。

NSMutableArrayこれを回避する方法は、インスタンス化するすべてのコントローラーを維持することです。

self.flipControllers = [NSMutableArray arrayWithCapacity:...];

...

そしてviewDidLoad(ARCの場合):

[self.flipControllers addObject:[[LMFlipViewController alloc] initWithViewOne:viewOne viewTwo:viewTwo animationDuration:0.5 andPauseInBetweenAnimation:3]];
[self.view addSubview:[self.flipControllers lastObject].view];
于 2012-10-22T17:36:24.877 に答える