【问题标题】:Transformation unable to perform twice转换无法执行两次
【发布时间】:2023-04-04 07:05:02
【问题描述】:

我有这个功能,

-(void)transitionstar{
star.hidden = NO;
star2.hidden = NO;
star3.hidden = NO;
star4.hidden = NO;
star5.hidden = NO;
star6.hidden = NO;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.4f];
[UIView animateWithDuration:0.0 animations:^{
    CGAffineTransform scale = CGAffineTransformMakeScale(1, 1);
    CGAffineTransform rotate = CGAffineTransformMakeRotation(360.0);
     CGAffineTransform rotate2 = CGAffineTransformMakeRotation(-360.0);
     CGAffineTransform rotate3 = CGAffineTransformMakeRotation(-720.0);
     CGAffineTransform rotate4 = CGAffineTransformMakeRotation(720.0);
     CGAffineTransform rotate5 = CGAffineTransformMakeRotation(1080.0);
     CGAffineTransform rotate6 = CGAffineTransformMakeRotation(-1080.0);
    CGAffineTransform translate = CGAffineTransformMakeTranslation(-800, -800);
     CGAffineTransform translate2 = CGAffineTransformMakeTranslation(600, -600);
     CGAffineTransform translate3 = CGAffineTransformMakeTranslation(400, 400);
     CGAffineTransform translate4 = CGAffineTransformMakeTranslation(-200, 200);
     CGAffineTransform translate5 = CGAffineTransformMakeTranslation(900, -300);
     CGAffineTransform translate6 = CGAffineTransformMakeTranslation(-200, 500);

    CGAffineTransform transform =  CGAffineTransformConcat(translate, scale);
    transform = CGAffineTransformConcat(transform, rotate);

    CGAffineTransform transform2 =  CGAffineTransformConcat(translate2, scale);
    transform2 = CGAffineTransformConcat(transform2, rotate2);

    CGAffineTransform transform3 =  CGAffineTransformConcat(translate3, scale);
    transform3 = CGAffineTransformConcat(transform3, rotate3);

    CGAffineTransform transform4 =  CGAffineTransformConcat(translate4, scale);
    transform4 = CGAffineTransformConcat(transform4, rotate4);
    CGAffineTransform transform5 =  CGAffineTransformConcat(translate5, scale);
    transform5 = CGAffineTransformConcat(transform5, rotate5);
    CGAffineTransform transform6 =  CGAffineTransformConcat(translate6, scale);
    transform6 = CGAffineTransformConcat(transform6, rotate6);

    star.transform = transform;
    star2.transform = transform2;
    star3.transform = transform3;
    star4.transform = transform4;
    star5.transform = transform5;
    star6.transform = transform6;
}
                 completion:^(BOOL finished){
                     if (finished) {
                         star.hidden = YES;
                         star2.hidden = YES;
                         star3.hidden = YES;
                         star4.hidden = YES;
                         star5.hidden = YES;
                         star6.hidden = YES;
                     }
                 }];
[UIView commitAnimations];
}

当我第一次调用它时,它确实有效。

但是,我在同一视图内再次调用,它无法执行并卡在那里。

-隐藏的工作

-过渡无效

-旋转不起作用

-nslog 工作

为什么第二次会变成这样?

更新

if(!positionrepeat)
        {
            //Display Correct IMAGE;
            [isrepeat addObject:[NSNumber numberWithInt:positionvalue]];
            //soundeffect = [self createSoundID: @"correct"];
            //AudioServicesPlaySystemSound(soundeffect);
            [self displayresulttext:@"correct"];
            [self.view setNeedsDisplay];
            [self transitionstar];
            correct++;
            completed.text = [NSString stringWithFormat:@"%d", correct];
            [self result];
        }

这就是我调用函数的方式。不过还是一样。

【问题讨论】:

    标签: objective-c ios5 transformation


    【解决方案1】:

    在这段代码中你改变了转换

      star.transform = transform;
            star2.transform = transform2;
            star3.transform = transform3;
            star4.transform = transform4;
            star5.transform = transform5;
            star6.transform = transform6;
    

    例如,考虑您的 star1 初始变换是 x , 现在你正在做一些变换计算......

    CGAffineTransform rotate = CGAffineTransformMakeRotation(360.0);
    CGAffineTransform translate = CGAffineTransformMakeTranslation(-800, -800);
    CGAffineTransform transform =  CGAffineTransformConcat(translate, scale);
        transform = CGAffineTransformConcat(transform, rotate);
    

    然后

    您将星形 x 的变换更改为 y...

    star.transform = transform;//say this is y
    

    现在你的星星变换会变得很好......

    通过再次调用再次执行此代码,因此您的初始星形变换再次为 y,而您的等效变换为 y,因此不需要并且您没有看到任何结果...

    y=y 所以没有结果....

    所以需要改变一些这样的逻辑或一些你想要的但这是一个想法......

    第一个变化:你需要存储每颗星的变换,所以你需要一些变换类型的变量...

      CGAffineTransform star1Initial,star2Initial,star3Initial,star4Initial,star5Initial,star6Initial;
    

    第二个变化:你需要在加载的视图中保存星星的初始变换......

        star1Initial=star1.transform;
        star2Initial=star2.transform;
        star3Initial=star3.transform;
        star4Initial=star4.transform;
        star5Initial=star5.transform;
        star6Initial=star6.transform;
    
    
    -(void)transitionstar{
        star1.hidden = NO;
        star2.hidden = NO;
        star3.hidden = NO;
        star4.hidden = NO;
        star5.hidden = NO;
        star6.hidden = NO;
    
            star1.transform=star1Initial;
            star2.transform=star2Initial;
            star3.transform=star3Initial;
            star4.transform=star4Initial; 
            star5.transform=star5Initial;
            star6.transform=star6Initial;
    
    
    //    [UIView beginAnimations:nil context:NULL];
    //    [UIView setAnimationDuration:0.4f];
        [UIView animateWithDuration:1.0 animations:^{
            CGAffineTransform scale = CGAffineTransformMakeScale(1, 1);
            CGAffineTransform rotate = CGAffineTransformMakeRotation(360.0);
            CGAffineTransform rotate2 = CGAffineTransformMakeRotation(-360.0);
            CGAffineTransform rotate3 = CGAffineTransformMakeRotation(-720.0);
            CGAffineTransform rotate4 = CGAffineTransformMakeRotation(720.0);
            CGAffineTransform rotate5 = CGAffineTransformMakeRotation(1080.0);
            CGAffineTransform rotate6 = CGAffineTransformMakeRotation(-1080.0);
            CGAffineTransform translate = CGAffineTransformMakeTranslation(-800, -800);
            CGAffineTransform translate2 = CGAffineTransformMakeTranslation(600, -600);
            CGAffineTransform translate3 = CGAffineTransformMakeTranslation(400, 400);
            CGAffineTransform translate4 = CGAffineTransformMakeTranslation(-200, 200);
            CGAffineTransform translate5 = CGAffineTransformMakeTranslation(900, -300);
            CGAffineTransform translate6 = CGAffineTransformMakeTranslation(-200, 500);
    
            CGAffineTransform transform =  CGAffineTransformConcat(translate, scale);
            transform = CGAffineTransformConcat(transform, rotate);
    
            CGAffineTransform transform2 =  CGAffineTransformConcat(translate2, scale);
            transform2 = CGAffineTransformConcat(transform2, rotate2);
    
            CGAffineTransform transform3 =  CGAffineTransformConcat(translate3, scale);
            transform3 = CGAffineTransformConcat(transform3, rotate3);
    
            CGAffineTransform transform4 =  CGAffineTransformConcat(translate4, scale);
            transform4 = CGAffineTransformConcat(transform4, rotate4);
            CGAffineTransform transform5 =  CGAffineTransformConcat(translate5, scale);
            transform5 = CGAffineTransformConcat(transform5, rotate5);
            CGAffineTransform transform6 =  CGAffineTransformConcat(translate6, scale);
            transform6 = CGAffineTransformConcat(transform6, rotate6);
    
            star1.transform = transform;
            star2.transform = transform2;
            star3.transform = transform3;
            star4.transform = transform4;
            star5.transform = transform5;
            star6.transform = transform6;
        }
                         completion:^(BOOL finished){
                             if (finished) {
                                 star1.hidden = YES;
                                 star2.hidden = YES;
                                 star3.hidden = YES;
                                 star4.hidden = YES;
                                 star5.hidden = YES;
                                 star6.hidden = YES;
                             }
                         }];
    //    [UIView commitAnimations];
    }
    

    希望对你有帮助....

    你好,试试这个旋转动画的代码.....

    - (void) runSpinAnimationWithDuration:(CGFloat) duration;
    {
        CABasicAnimation* rotationAnimation;
        int rotations=1;
        rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        rotationAnimation.toValue = [NSNumber numberWithFloat: M_PI * 2.0 /* full rotation*/ * rotations * duration ];
        rotationAnimation.duration = duration;
        rotationAnimation.cumulative = YES;
        rotationAnimation.repeatCount = 1.0; 
        rotationAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
    

    【讨论】:

      【解决方案2】:

      我假设您在上面编写的方法在从 UIView 派生的类中工作。

      如果这个假设是正确的,那么当必须重绘视图时可能会调用你的方法。

      要重绘视图,您必须调用 setNeedsDisplay 方法,如下所示:

      [myCustomView setNeedsDisplay];
      

      【讨论】:

        猜你喜欢
        • 2011-12-20
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-05
        • 1970-01-01
        相关资源
        最近更新 更多