【问题标题】:Splash screen iOS only shown on simulator and at wrong size启动画面 iOS 仅在模拟器上显示且尺寸错误
【发布时间】:2012-11-15 06:29:54
【问题描述】:

当我使用下面提到的代码时,我在 iPhone 模拟器上得到了所需的闪屏,但图片似乎放大了 2 倍:我只得到初始图片的左上四分之一(= 启动图像),放大到全屏。在启动画面启动之前,启动图像本身会以正确的大小显示。

代码在 AppDelegate 的 didFinishLaunchingWithOptions 中输入。

// Splash screen
    UIImageView*imageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"IMG_1357.png"]];
    [[navigationController view] addSubview:imageView];
    [[navigationController view] bringSubviewToFront:imageView];

    // as usual
    [self.window makeKeyAndVisible];

    //now fade out splash image
    [UIView transitionWithView:self.window duration:4.0f options:UIViewAnimationOptionTransitionNone animations:^(void){imageView.alpha=0.0f;} completion:^(BOOL finished){[imageView removeFromSuperview];}];

此外,启动画面似乎没有出现在设备上(iPhone 4S (Retina) 和 iOS 6.0),只出现在模拟器上:在 iPhone 上运行时,它只显示启动图像。

这两个问题的原因和解决方案可能是什么? 提前致谢!

【问题讨论】:

  • 至于设备上没有显示闪屏:这是文件名不同造成的。代码中的扩展名是小写的,而实际文件具有大写 (PNG) 扩展名。

标签: ios xcode splash-screen


【解决方案1】:
  1. 为 imageView 设置框架,否则它与图像大小相同
  2. 设置正确的 contentMode
  3. 尝试使用 self.window,而不是 [navigationController 视图]

例子:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"IMG_1357.png"]];
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.frame = self.window.bounds;
[self.window addSubview:imageView];
[imageView release];

[self.window makeKeyAndVisible];

//now fade out splash image
[UIView transitionWithView:self.window
                  duration:4.0f
                   options:UIViewAnimationOptionTransitionNone
                animations:^(void) {
                    imageView.alpha = 0.0f;
                }
                completion:^(BOOL finished ){
                    [imageView removeFromSuperview];
                }];

在淡出前添加 1 秒暂停:

int64_t delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [UIView transitionWithView:self.window
                      duration:4.0f
                       options:UIViewAnimationOptionTransitionNone
                    animations:^(void) {
                        imageView.alpha=0.0f;
                    }
                    completion:^(BOOL finished ){
                        [imageView removeFromSuperview];
                    }];
});

[self performSelector:@selector(_hideSplash:) withObject:imageView afterDelay:1.0];

- (void) _hideSplash:(UIView *)view
{
    [UIView transitionWithView:self.window
                      duration:4.0f
                       options:UIViewAnimationOptionTransitionNone
                    animations:^(void) {
                        view.alpha=0.0f;
                    }
                    completion:^(BOOL finished ){
                        [view removeFromSuperview];
                    }];    
}

【讨论】:

  • 非常感谢! 1.和2.解决了我的问题。 3. 对我不起作用:该更改阻止了我的启动画面显示。我必须更改或添加什么才能在淡出之前添加 1 秒的暂停?我想投票,但似乎还没有赢得足够的声誉.. :(
  • 我更新了示例代码来展示如何在淡出之前添加暂停
  • @Andrey Soloviev 我有一个问题,我现在正在尝试,但它不适合我。我对“正确的内容模式”的含义有些困惑。我是新手,我应该警告你:)。但是当我们说话时,我正在学习故事板。我在 didFinishLaunchingWithOptions 中实现了这一点,并将源图像更改为我的,也在情节提要中,我做了一个视图控制器,里面有一个图像视图,并将图像设置为单独可见。你能帮我看看可能有什么问题/遗漏吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 2011-03-23
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
相关资源
最近更新 更多