我们需要以一定的时间间隔顺序显示10个图像(默认图像隐藏=是,并且标记为1111到1120)。代码的结果是一次性出现图像,没有延迟。动画是一个单独的功能。可能是什么问题呢?我正在使用xcode 8.2.1
-(void)doski:(NSInteger)i
{
[UIView animateWithDuration:1.0
delay:5.0
options:UIViewAnimationOptionAutoreverse | UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction
animations:^(void) {
}
completion:^(BOOL finished) {
[self.view viewWithTag:(i+1110)].hidden=NO;
NSInteger i2=i;
i2++;
if(i2<11)
[self doski:i2];
}];
}
...........
//function call
[self doski:1];
使用此选项时,情况未发生变化:
-(void)doski:(NSInteger)i
{
[UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionCurveEaseInOut
animations:^(void) {
}
completion:^(BOOL finished){
[UIView animateWithDuration:2.0 delay:1.0 options:
UIViewAnimationOptionCurveEaseIn animations:^{
[self.view viewWithTag:(i+1110)].hidden=NO;
} completion:^ (BOOL completed) {NSInteger i2=i;
i2++;
if(i2<18)
[self doski:i2];}];
}];
}
谢谢。
答案 0 :(得分:0)
我认为图像立即出现的原因是你的动画块是空的。使用空动画块,将立即调用完成块(没有任何动画,所以我们也可以这样做。)
要修复您的代码,您可以在致电animateWithDuration...
UIView *viewToAnimate = [self.view viewWithTag:(i+1110)]
viewToAnimate.alpha = 0
viewToAnimate.hidden = NO
然后将动画块内的alpha设置为1,如下所示:
viewToAnimate.alpha = 1
这是一个完整的例子,用于说明空动画块的问题。您可以将其复制并粘贴到游乐场中。它虽然是Swift,但不是Objective-C
import UIKit
import PlaygroundSupport
class MyView : UIView {
override init(frame: CGRect) {
super.init(frame: frame)
self.setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setup() {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
view.backgroundColor = UIColor.red
self.addSubview(view)
UIView.animate(withDuration: 2, delay: 1, options: [], animations: {
// commenting out the following line will
// trigger the completion block immediately
view.frame = CGRect(x: 300, y: 300, width: 50, height: 50)
}, completion: { finished in
print("done")
})
}
}
let view = MyView(frame: CGRect(x: 0, y: 0, width: 400, height: 400))
view.backgroundColor = UIColor.black
PlaygroundPage.current.liveView = view
答案 1 :(得分:0)
您的代码存在多个问题。
您无法为视图的隐藏属性设置动画。隐藏属性不可动画。相反,您需要将alpha值设置为0并将其设置为1.0。这将导致视图淡入,我认为,这就是你想要的。
您的两个代码块都不会在动画块中执行任何操作。那是错的。在动画块中,您需要更改要设置动画的视图的一个或多个可动画属性。
如果您希望视图一次显示一个,那么您应该为第一个动画调用延迟值为0的animateWithDuration:delay:options:animations:completion:
,并为第二个动画调用第一个动画的持续时间延迟,这样第一个动画将立即开始,第二个动画将在第一个动画结束时开始,依此类推。
您的代码可能如下所示:
NSTimeInterval duration = 0.25;
for (index = 0; x < 10; x++) {
UIView *viewToAnimate = arrayOfViewsToAnimate[index];
//For each view, set it's hidden property to false
//and it's alpha to zero
viewToAninimate.hidden = false;
viewToAnimate.alpha = 0.0;
[UIView animateWithDuration:duration
delay: duration * index
options: 0
animations: ^ {
//inside the animation block, set the alpha to 1.0
viewToAnimate.alpha = 1.0;
}
completion: nil
];
}
该代码假定您已创建包含要设置动画的视图的数组arrayOfViewsToAnimate
。您还可以为视图分配标签,并在for循环中使用该标签查找每个视图。无论如何,您需要根据需要调整上述代码,而不仅仅是将其复制/粘贴到您的程序中。