我正试图让iPad启动画面淡出,以便在2秒内显示我的应用程序的主界面。主界面是我的主视图控制器和视图,在导航控制器内。
所以我做了以下事情:
UINavigationController与我的根视图控制器。 根视图控制器的接口全部布局,最后一步是一个CALayer,它具有相同的png,用于覆盖界面的初始屏幕。
这个想法是,一旦真正的闪屏消失,仍然有CALayer。然后我淡出CAlayer以显示界面。它有点工作:淡入淡出发生,但无论我为动画设置的持续时间,它仍然发生得太快。
这是代码:( logoLayer是一个ivar,mainCanvas是self.view中的容器视图,我在其中插入了大多数子视图 - 用于其他屏幕暗淡类型的效果。)
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
{
// Custom initialization
self.view.layer.backgroundColor = [UIColor clearColor].CGColor;
[self setLayerContent:[[NSBundle mainBundle] pathForResource:@"interfaceBackground" ofType:@"png"]];
[self layoutNavigationButtonWithResource:@"button1" glowing:YES forAction:@"biblioteca"];
[self layoutNavigationButtonWithResource:@"button2"glowing:YES forAction:@"portfolio"];
NSString *logoPath = [[NSBundle mainBundle] pathForResource:@"Default-Portrait~ipad" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:logoPath];
logoLayer = [[CALayer layer] retain];
logoLayer.contents = (id)image.CGImage;
logoLayer.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
logoLayer.anchorPoint = CGPointMake(0, 0);
logoLayer.opacity = 1;
[mainCanvas.layer addSublayer:logoLayer];
}
return self;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self performSelector:@selector(fadeOutLogo) withObject:nil afterDelay:0.1];
}
- (void)fadeOutLogo
{
CABasicAnimation *a = [CABasicAnimation animation];
a.duration = 10;
[logoLayer addAnimation:a forKey:@"opacity"];
[logoLayer setOpacity:0];
}
注意我甚至延迟了对动画代码的调用以防万一。而且我最终得到了10秒的值。这对于褪色是荒谬的。仍然......褪色发生在大约0.2秒内。
有什么想法吗?
答案 0 :(得分:1)
CABasicAnimation实际上并没有做任何事情,因为你没有给它fromValue
或toValue
;当您设置图层的不透明度时,它只是动画,因为核心动画图层上的设置属性会触发隐式动画,其默认持续时间约为四分之一秒。你想要做的是:
- (void)fadeOutLogo
{
[CATransaction begin];
[CATransaction setAnimationDuration:2];
[logoLayer setOpacity:0];
[CATransaction commit];
}
答案 1 :(得分:1)
或者,在viewWillAppear中:您可以使用Default-Portrait~ipad.png实例化UIImageView,将其添加到self.view,使用UIView animateWithDuration:animations:completion:class方法将alpha的值设置为0的值。 2秒的时间段,然后在完成块中删除并释放UIImageView。下面的代码演示了这个想法,使用UIView而不是UIImageView:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear: animated];
UIView __block *fadeView = [[UIView alloc]
initWithFrame: CGRectMake(0, 0, 320, 460)];
fadeView.backgroundColor = [UIColor blackColor];
[self.view addSubview: fadeView];
[UIView animateWithDuration: 2 animations:^{
fadeView.alpha = 0;
} completion:^(BOOL finished) {
fadeView = nil;
}];
}