UIview animatewithDuration不适用于swift

这似乎是一个非常奇怪的问题。 我在storyBoard中有一个小图像视图,并添加了点击手势。 在手势的行动,我想添加一个不同的图像视图。

Objective C code-

-(void)tapImage{ bigImageView = [[UIImageView alloc]init]; [bigImageView setImage:[UIImage imageNamed:@"main.png"]]; [bigImageView setFrame:CGRectMake(0, 0, 50, 50)]; [self.view addSubview:bigImageView]; [UIView animateWithDuration:2.0 delay:2.0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void) { [bigImageView setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; //Leave it empty } completion:^(BOOL finished){ // Your code goes here }]; } 

工作完全正常。

SWIFT代码 –

 func imageTapped() { println("Tapped on Image") bigImageView = UIImageView(frame: CGRectMake(0, 0, 50, 50)) bigImageView.image = UIImage(named: "main") self.view.addSubview(self.bigImageView) UIView.animateWithDuration(2.0, delay: 2.0, options:UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in dispatch_async(dispatch_get_main_queue()) { self.bigImageView = UIImageView(frame: CGRectMake(0, 0, 320, 500)) } }) { (completed:Bool) -> Void in } } 

不起作用。 我不知道我在哪里错了。 🙁

更新 –

首先,我用“bigimageview.frame”改变框架,所以现在它是在手势点击显示图像视图。 但没有animation。

所以我删除了主线上的dipatch,它是animation。

 UIView.animateWithDuration(0.4, delay: 0.0, options:UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in // dispatch_async(dispatch_get_main_queue()) { self.bigImageView.frame = CGRectMake(0, 0, 320, 500) // } }) { (completed:Bool) -> Void in } } 

但仍然有问题,为什么发生。 我们是不是假设在closures/块内的主线程上进行UI更改? 有人请解释一下。

可能是你的延迟和animation时间是一样的,所以试试这个

 func imageTapped() { println("Tapped on Image") bigImageView = UIImageView(frame: CGRectMake(0, 0, 50, 50)) bigImageView.image = UIImage(named: "main") self.view.addSubview(self.bigImageView) UIView.animateWithDuration(2.0, delay: 1.0, options:UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in dispatch_async(dispatch_get_main_queue()) { self.bigImageView = UIImageView(frame: CGRectMake(0, 0, 320, 500)) } }) { (completed:Bool) -> Void in } } 

replace这个代码

 UIView.animateWithDuration(2.0, delay: 1.0, options:UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in dispatch_async(dispatch_get_main_queue()) { self.bigImageView = UIImageView(frame: CGRectMake(0, 0, 320, 500)) } }) { (completed:Bool) -> Void in } } 

 UIView.animateWithDuration(2.0, delay: 1.0, options:UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in dispatch_async(dispatch_get_main_queue()) { bigImageView.frame = CGRectMake(0, 0, 320, 500) } }) { (completed:Bool) -> Void in } } 

viewDidLoad()不是您应该为视图添加animation的理想场所。 viewDidAppear()方法可能工作。

尝试使用dispatch_async()没有什么可以获得的。 animation的工作方式只需在指定的animation块中设置属性; 实际上,这些值是立即设置的,iOS在可能的情况下使用GPU来为转换设置animation。 如果您在不同的线程上运行代码块,它将超出animation的范围,因此只需立即生效。

AnimationWithDuration块获取所有的数据(持续时间,选项等)。 你的调度块只是单独迭代。 这就是为什么它没有animation。 原因很简单:因为堆栈系统,调度块内的所有内容都与其他代码分开迭代。 帧停止,分派到堆栈,执行,当它回到animation:跳,它已经有最终的价值,并没有animation需要。