这似乎是一个非常奇怪的问题。我在storyBoard中有一个小图像视图,并添加了点击手势。在手势的动作我试图添加不同的图像视图。
目标C代码 -
-(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 Code -
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”更改框架,所以现在它在手势点击中显示图像视图。但没有动画。
所以我在主线程上移除了dipatch并且它是动画的。
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
} }
但仍有疑问仍然存在。我们是不是假设在闭包/块内的主线程上放置UI更改?有人请解释一下。
答案 0 :(得分:0)
可能是你的延迟和动画时间相同所以试试这个
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
} }
答案 1 :(得分:0)
viewDidLoad()
不是理想的观看地点。 viewDidAppear()
方法可能有效。
答案 2 :(得分:0)
替换此代码
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
} }
答案 3 :(得分:0)
尝试使用dispatch_async()没有任何好处。 动画的工作方式只需在指定的动画块中设置属性即可;事实上,这些值是立即设置的,iOS会尽可能使用GPU来设置转换动画。 如果在不同的线程上运行代码块,它将超出动画的范围,因此只是立即生效。
答案 4 :(得分:0)
AnimationWithDuration块获取其所有数据(持续时间,选项等)。您的调度块只是单独迭代。这就是为什么它没有动画。原因很简单:由于堆栈系统,调度块内的所有内容都与其他代码分开迭代。帧停止,调度堆栈,执行,并且当它返回动画时:跳,它已经具有最终值并且不需要动画。