Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c uiview animatewithduration在视图关闭后继续完成_Objective C_Uiviewanimation - Fatal编程技术网

Objective c uiview animatewithduration在视图关闭后继续完成

Objective c uiview animatewithduration在视图关闭后继续完成,objective-c,uiviewanimation,Objective C,Uiviewanimation,我有一个包含UIView动画的modelViewController。当动画块完成时,它会调用自身,从而循环 当我关闭调用[\u饥饿视图removeFromSuperview]的modelViewController(dismissInfo)时,该函数会被一次又一次地调用,每秒打印多次NSLog行 @implementation InfoVC { NSArray *imgs; NSString *currentImg; } - (void)viewDidLoad { [

我有一个包含UIView动画的modelViewController。当动画块完成时,它会调用自身,从而循环

当我关闭调用[\u饥饿视图removeFromSuperview]的modelViewController(dismissInfo)时,该函数会被一次又一次地调用,每秒打印多次NSLog行

@implementation InfoVC
{
    NSArray *imgs;
    NSString *currentImg;
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    _imageview.contentMode = UIViewContentModeLeft;
    _imageviewUnder.contentMode = UIViewContentModeLeft;

    imgs = [NSArray arrayWithObjects:
            @"01.jpg",
            @"02.jpg",
            @"03.jpg",
            @"04.jpg",
            @"05.jpg",
            @"06.jpg",
            nil];

    _imgInt = (arc4random()%6);

    [self initialImage];
}

- (void)viewWillAppear:(BOOL)animated{
}


- (void)viewDidAppear:(BOOL)animated{
    NSLog(@"viewDidAppear");
}

- (void)initialImage
{        
    _starView.contentMode = UIViewContentModeLeft;
    _imageviewUnder.contentMode = UIViewContentModeLeft;

    currentImg = [imgs objectAtIndex:_imgInt];
    UIImage *image = [UIImage imageNamed:currentImg];

    _starView = [[UIImageView alloc] initWithImage:image];

    // Size the image view to the image (it's bigger)
    _starView.bounds = CGRectMake(0.0, 44.0, 416.0, 416.0);

    NSLog(@"tarView.center %@", NSStringFromCGPoint(_starView.center) );

    _starView.alpha=1;

    int nextImgInt = _imgInt + 1 ;

    if (nextImgInt>5)
    {
        nextImgInt=0;
    }

    NSString *nextImg = [imgs objectAtIndex:nextImgInt];
    UIImage *nextImage = [UIImage imageNamed:nextImg];
    [_imageviewUnder setImage:nextImage];

    [self.view sendSubviewToBack:_imageviewUnder];


    _imgInt++;

    if (_imgInt>5) {
        _imgInt=0;
    }

    [UIView setAnimationBeginsFromCurrentState:YES];

    [UIView animateWithDuration:7.6f
                          delay:0.1f
                        options:UIViewAnimationCurveLinear
                     animations:^{
                         [_starView setCenter:CGPointMake(112, 208)];
                         [_starView setAlpha:0.0f];
                     }
                     completion:^(BOOL finished){
                         [_starView removeFromSuperview];
                         [self initialImage];
                     }];

    [self.view insertSubview:_starView atIndex:1];

}


- (void)visitTwitter
{    
    NSURL *URL = [NSURL URLWithString:@"http://twitter.com/"];
    SVWebViewController *webViewController = [[SVWebViewController alloc] initWithURL:URL];
    [self.navigationController pushViewController:webViewController animated:YES];

}



- (IBAction)dismissInfo:(id)sender
{
    [self cleanup];
    [self dismissModalViewControllerAnimated:YES];
}


- (void)cleanup
{
    [_starView.layer removeAllAnimations];
    [self.view.layer removeAllAnimations];
    [_starView removeFromSuperview];
}

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

@end

将自己设置为动画标志,在viewDidLoad中设置为true,在cleanup中设置为false。然后在initialImage方法中进行检查:

if ( ! animating )
    return;

这是我第二次碰到这个。一个可能的原因是在viewDidLoad中初始化了方法,但子视图和图像没有及时准备好(似乎动画循环的第一个过程无法向机器添加重影)

我将呼叫移动到ViewDidDisplay,确保显示初始化图像以停止白色闪烁。最后,在模态窗口中创建无限动画

- (void)viewDidLoad
{
    [super viewDidLoad];

    _imageview.contentMode = UIViewContentModeLeft;
    _imageviewUnder.contentMode = UIViewContentModeLeft;

    imgs = [NSArray arrayWithObjects:
            @"01.jpg",
            @"02.jpg",
            @"03.jpg",
            @"04.jpg",
            @"05.jpg",
            @"06.jpg",
            nil];

    _imgInt = (arc4random()%6);

    currentImg = [imgs objectAtIndex:_imgInt];
    UIImage *image = [UIImage imageNamed:currentImg];
    [_imageviewUnder setImage:image];
}

- (void)viewDidAppear:(BOOL)animated{
    [self initialImage];
}

- (void)initialImage
{        
    currentImg = [imgs objectAtIndex:_imgInt];
    UIImage *image = [UIImage imageNamed:currentImg];

    _starView = [[UIImageView alloc] initWithImage:image];

    // Size the image view to the image (it's bigger)
    _starView.bounds = CGRectMake(0.0, 44.0, 416.0, 416.0);

    NSLog(@"initialImage");

    _starView.alpha=1;

    [self.view insertSubview:_starView atIndex:1];

    int nextImgInt = _imgInt + 1 ;

    if (nextImgInt>5)
    {
        nextImgInt=0;
    }

    NSString *nextImg = [imgs objectAtIndex:nextImgInt];
    UIImage *nextImage = [UIImage imageNamed:nextImg];
    [_imageviewUnder setImage:nextImage];

    [self.view sendSubviewToBack:_imageviewUnder];

    _imgInt++;

    if (_imgInt>5) {
        _imgInt=0;
    }

    [UIView setAnimationBeginsFromCurrentState:YES];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:7.6];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    //[UIView setAnimationDidStopSelector:@selector(initialImage) ];
    [_starView setCenter:CGPointMake(112, 208)];
    [_starView setAlpha:0.0f];
    [UIView commitAnimations];

    [self performSelector:@selector(initialImage) withObject:nil afterDelay:7.6];
}

- (IBAction)dismissInfo:(id)sender
{
    [self cleanup];
    [self dismissModalViewControllerAnimated:YES];
}

- (void)cleanup
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    [_starView.layer removeAllAnimations];
    [self.view.layer removeAllAnimations];
    [_starView removeFromSuperview];
}

如果只想创建循环动画,最好使用选项:“UIViewAnimationOptionRepeat”。例如:

[UIView animateWithDuration:2.0
                      delay:0.0f
                    options:UIViewAnimationOptionRepeat
                 animations:^{
                            [myUIViewThing setCenter:CGPointMake(myUIViewThing.center.x - 100, myUIViewThing.center.y)];
                             }
                 completion:nil];