在关闭ViewController后,会重复调用transitionWithView

时间:2012-10-24 23:35:56

标签: objective-c uiview objective-c-blocks quartz-graphics

这是使用ModalViewControllerStoryBoard

ARC

当我关闭视图时,我看到这一行...... NSLog(@"%d %@",[imgArray count],fileName); ...一遍又一遍地打印。

如果视图被解除,如何终止transitionWithView/animateWithDuration函数?

缺少一些非常重要的东西!

·H

#import <UIKit/UIKit.h>

@interface InfoVC : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *imageview;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollview;

@end

的.m

#import "InfoVC.h"
#import <QuartzCore/QuartzCore.h>

@interface InfoVC ()

@end

@implementation InfoVC {
    int randomInt;
    NSArray *imgs;
    NSMutableArray *imgArray;
    NSTimer *myTimer;
    NSTimer *myTimer2;
    NSString *currentImg;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    imgs = [NSArray arrayWithObjects:
                      @"01.jpg",
                      @"02.jpg",
                      @"03.jpg",
                      nil];
    imgArray = [imgs mutableCopy];
    [self initialImage];
}


- (void)initialImage
{
    _imageview.contentMode = UIViewContentModeLeft;

    int rnd = [imgArray count];
    randomInt = (arc4random()%rnd);
    currentImg = [imgArray objectAtIndex:randomInt];    
    UIImage *image = [UIImage imageNamed:currentImg];

    [_imageview setImage:image];
    _imageview.bounds = CGRectMake(0, 0, image.size.width, image.size.height);

    _scrollview.contentSize = image.size;
    _scrollview.contentOffset = CGPointMake(-150.0, 0.0);

    [imgArray removeObjectAtIndex: randomInt];

    [self animate];
}

- (void)randomImage
{        
    if ([imgArray count]==0) {
        imgArray = [imgs mutableCopy];
    }

    int rnd = [imgArray count];
    randomInt = (arc4random()%rnd);
    NSString *fileName = [imgArray objectAtIndex:randomInt];

    NSLog(@"%d %@",[imgArray count],fileName);

    [imgArray removeObjectAtIndex: randomInt];

    UIImage * toImage = [UIImage imageNamed:fileName];


    void (^completion)(void) = ^{
        [self animate];
    };

    [UIView transitionWithView:self.view
                      duration:1.75f
                       options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionAllowUserInteraction
                    animations:^
                    {
                        _imageview.image = toImage;
                    }
                    completion:^(BOOL finished)
                    {
                        completion();
                    }
    ];

}

- (void)animate{

    CGPoint offset = _scrollview.contentOffset;

    float flt = 150.0;

    if (_scrollview.contentOffset.x == flt)
    {
        offset.x = 0.0 ;
    }
    else
    {
        offset.x = flt ;
    }

    void (^completion2)(void) = ^{
        [self randomImage];
    };

    [UIView animateWithDuration:5.0 delay:0 options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseIn
                     animations:^{
                         _scrollview.contentOffset = offset; 
                     }completion:^(BOOL completed){
                         completion2();
                     }
     ];


}

- (void)viewDidUnload
{
    [super viewDidUnload];

    [_scrollview.layer removeAllAnimations];
    [_imageview.layer removeAllAnimations];
}


- (IBAction)dismissInfo:(id)sender
{
    [_scrollview.layer removeAllAnimations];
    [_imageview.layer removeAllAnimations];

    [self dismissModalViewControllerAnimated:YES];
}

1 个答案:

答案 0 :(得分:1)

我尝试使用transitionWithView使用CABasicAnimation等使用NSTimer来复制大量的东西。

最后我刚刚做了:

[_imageview removeFromSuperview];

在驳回视图时,一切都很棒。

但是从这里的其他帖子看,在将{alpha}转换应用到UIScrollview时会出现一个错误的母鸡 - 当视图透明时,视图的引用会丢失。