代码之家  ›  专栏  ›  技术社区  ›  Tinyfool

为什么新的uiimageview不能设置动画?

  •  2
  • Tinyfool  · 技术社区  · 14 年前

    我的iphone应用程序中有这样的代码:

    //fromView is a UIImageView. 
    //self is a UIView.
            UIGraphicsBeginImageContext(fromView.bounds.size); 
            [fromView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
            UIImage *dummyFromImage = UIGraphicsGetImageFromCurrentImageContext(); 
            UIGraphicsEndImageContext();
            UIImageView* dummyImageView = [[UIImageView alloc] initWithImage:dummyFromImage]; 
            [self addSubview:dummyImageView];
            [UIView beginAnimations:nil context:nil]; 
            [UIView setAnimationDuration:0.5]; 
            [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView: dummyImageView cache:YES]; //line:9 
            [UIView commitAnimations];
    

    dummyimageview只显示但不翻转,如果将第9行的dummyimageview改为fromview,fromview do flip,请告诉我原因。

    2 回复  |  直到 14 年前
        1
  •  3
  •   Tinyfool    14 年前

    我把这个问题问给苹果开发者技术支持,他们说,

    “基本问题是,由于动画的计时,核心动画没有可从中设置动画的“上一个”状态,因为视图刚刚添加到视图层次结构中,因此在尝试转换时,它所能做的只是显示“最终”状态。

    如果在下一次运行循环迭代中执行翻转,则核心动画将有时间为视图的层创建初始状态,因此翻转将正确发生。可以通过将翻转方法一分为二并使用-performselector:withobject:afterdelay:like-so来完成此操作: “

    -(IBAction)flip {
    
       UIImageView* dummyImageView = [[UIImageView alloc] initWithImage:fromView.image];
       dummyImageView.frame = fromView.frame;
       [window addSubview:dummyImageView];
    
       [self performSelector:@selector(animate:) withObject:dummyImageView afterDelay:0.0];
    }
    
    -(void)animate:(UIView*)view {
    
       [UIView beginAnimations:nil context:nil];
       [UIView setAnimationDuration:0.5];
       [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView: view cache:YES];
       [UIView commitAnimations];
    }
    

    但是,既然您提到“fromview”是一个uiimageview,我想知道为什么要使用-renderincontext:请注意,在您的示例中,图像比您正在使用的视图小。

        2
  •  1
  •   kennytm    14 年前
        [UIView setAnimationTransition:… forView: dummyImageView cache:YES]; //line:9 
    

    中的视图 -setAnimationTransition:… 方法应分配给 包含 变化。对你来说, self .

    这个 dummyImageView 本身没有改变(外部的改变,如改变超级视图是无关的),所以动画什么也做不了。