iOS:使用LaunchImage作为应用程序背景

iOS:使用LaunchImage作为应用程序背景,ios,objective-c,iphone,uiview,swift,Ios,Objective C,Iphone,Uiview,Swift,这可能没有故障吗 我的Xcode项目在assets aka Images.xcsets中定义了一个启动映像,包括所有支持的大小和方向。由于我希望在初始视图中使用与背景相同的图像,因此我将其添加到视图控制器中作为背景: view.layer.contents = UIImage(named:"LaunchImage").CGImage; 但是,当启动屏幕切换到初始视图时,会出现明显的小故障,因为视图中设置的背景图像会拉伸。当我旋转设备时,图像也会拉伸 旋转设备时发生的拉伸似乎是合理的,因

这可能没有故障吗

我的Xcode项目在assets aka Images.xcsets中定义了一个启动映像,包括所有支持的大小和方向。由于我希望在初始视图中使用与背景相同的图像,因此我将其添加到视图控制器中作为背景:

    view.layer.contents = UIImage(named:"LaunchImage").CGImage;
但是,当启动屏幕切换到初始视图时,会出现明显的小故障,因为视图中设置的背景图像会拉伸。当我旋转设备时,图像也会拉伸

旋转设备时发生的拉伸似乎是合理的,因为我猜,当设置为背景图像时,资产目录图像中的其他图像大小/方向显然不被视为背景图像

但是,在启动屏幕和我的初始视图之间发生的拉伸似乎相当奇怪,因为两者应该具有相同的大小

当设备方向发生变化时,是否有任何经过测试的程序使bg图像始终适应纵横比?这在多尺寸的发射图像中是可能的吗

更新:

添加bg图像的一种可能方法是将UIImageView放置在所有其他视图后面的背景中,然后将图像加载到其中。该解决方案解决了设备定向问题,对我来说还可以,但还有另一个问题:它加载了错误的图像大小。如果我在iPad2 emu上测试它,它应该使用名为Default~ipad~nostatubar.png的图像,但如果我检查UIImage的大小,它只有320x480像素,因此它显然使用名为Default.png的图像

我只能按照Images.xcsets中定义的名称加载启动映像。如果我尝试使用物理文件名(例如Default.png)创建UIImage,bg将保持黑色


所以问题是:如何让iOS从Images.xcsets中的LaunchImage中选择正确的图像大小/方向?

我在objC中有一个UIImage+DefaultImage[iOS]类别,允许这样做。应易于移植到快速扩展

#import <UIKit/UIKit.h>

@interface UIImage (DefaultImage)

// uses statusbar orientation
+ (UIImage *)defaultImage;

//uses given orientation
+ (UIImage *)defaultImageForOrientation:(UIInterfaceOrientation)orient;

@end

免责声明:我自己的代码-摘自

我在objC中有一个UIImage+DefaultImage[ios]类别,允许这样做。应易于移植到快速扩展

#import <UIKit/UIKit.h>

@interface UIImage (DefaultImage)

// uses statusbar orientation
+ (UIImage *)defaultImage;

//uses given orientation
+ (UIImage *)defaultImageForOrientation:(UIInterfaceOrientation)orient;

@end

免责声明:我自己的代码-取自

启动映像位于名为default的应用程序包中。。因此,您只需将其加载到UIImageView中,并将该imageView添加到UIView中。

启动映像位于名为default的应用程序包中。。因此,您只需将其加载到UIImageView中,并将该imageView添加到UIView中。

要完全解决此问题,以下是我的Swift版本的Daij Djan代码。它还列出了评论栏中大量不同的启动映像版本。有一些对我自己的util-lib-EnvUtil的调用,但这是另一个故事,大多数用户可以找到如何获得所需的变量

/**
   Returns the default image (launch image) of the application with regard to the screen size and orientation.

   Default.png                               | LaunchImage.png                       |  320 x 480  | iPhone 4 Low Res.
   Default@2x.png                            | LaunchImage@2x.png                    |  640 x 960  | iPhone 4
   Default@2x.png                            | LaunchImage-700@2x.png                |  640 x 960  | iPhone 4 iOS7
   Default-568h@2x.png                       | LaunchImage-568h@2x.png               |  640 x 1136 | iPhone 5
   Default-568h@2x.png                       | LaunchImage-700-568h@2x.png           |  640 x 1136 | iPhone 5
   Default~ipad.png                          | LaunchImage-Portrait~ipad.png         |  768 x 1004 | iPad Portrait
   Default~ipad~nostatusbar.png              | LaunchImage-700-Portrait~ipad.png     |  768 x 1024 | iPad Portrait FS
   Default~ipad~landscape.png                | LaunchImage-Landscape~ipad.png        | 1024 x 748  | iPad Landscape
   Default~ipad~landscape~nostatusbar.png    | LaunchImage-700-Landscape~ipad.png    | 1024 x 768  | iPad Landscape FS
   Default~ipad@2x.png                       | LaunchImage-Portrait@2x~ipad.png      | 1536 x 2008 | iPad Portrait Retina
   Default~ipad~nostatusbar@2x.png           | LaunchImage-700-Portrait@2x~ipad.png  | 1536 x 2048 | iPad Portrait Retina FS
   Default~ipad~landscape@2x.png             | LaunchImage-Landscape@2x~ipad.png     | 2048 x 1496 | iPad Landscape Retina
   Default~ipad~landscape~nostatusbar@2x.png | LaunchImage-700-Landscape@2x~ipad.png | 2048 x 1536 | iPad Landscape Retina FS
 */
public class func getDefaultImage() -> UIImage
{
    var fileName:String = "LaunchImage";
    let osVersion:String = EnvUtil.systemVersionMajor() > 6 ? "700" : "";
    let scale:String = EnvUtil.isRetina() ? "@2x" : "";
    let div:String = osVersion.length > 0 ? "-" : "";

    if (EnvUtil.isPad())
    {
        let orientation:String = EnvUtil.isPortraitOrientation() ? "Portrait" : "Landscape";
        fileName += "-" + osVersion + div + orientation + scale + "~ipad";
    }
    else
    {
        if (CGRectGetHeight(UIScreen.mainScreen().bounds) > 480.0)
        {
            /* iPhone 5. */
            fileName += "-" + osVersion + div + "568h@2x";
        }
        else
        {
            /* iPhone 4 with iOS7? */
            fileName += div + osVersion + scale;
        }
    }

    fileName += ".png";
    //Log.debug(fileName);

    return UIImage(named: fileName);
}

为了完全解决这个问题,这里是我的DaijDjan代码的Swift版本。它还列出了评论栏中大量不同的启动映像版本。有一些对我自己的util-lib-EnvUtil的调用,但这是另一个故事,大多数用户可以找到如何获得所需的变量

/**
   Returns the default image (launch image) of the application with regard to the screen size and orientation.

   Default.png                               | LaunchImage.png                       |  320 x 480  | iPhone 4 Low Res.
   Default@2x.png                            | LaunchImage@2x.png                    |  640 x 960  | iPhone 4
   Default@2x.png                            | LaunchImage-700@2x.png                |  640 x 960  | iPhone 4 iOS7
   Default-568h@2x.png                       | LaunchImage-568h@2x.png               |  640 x 1136 | iPhone 5
   Default-568h@2x.png                       | LaunchImage-700-568h@2x.png           |  640 x 1136 | iPhone 5
   Default~ipad.png                          | LaunchImage-Portrait~ipad.png         |  768 x 1004 | iPad Portrait
   Default~ipad~nostatusbar.png              | LaunchImage-700-Portrait~ipad.png     |  768 x 1024 | iPad Portrait FS
   Default~ipad~landscape.png                | LaunchImage-Landscape~ipad.png        | 1024 x 748  | iPad Landscape
   Default~ipad~landscape~nostatusbar.png    | LaunchImage-700-Landscape~ipad.png    | 1024 x 768  | iPad Landscape FS
   Default~ipad@2x.png                       | LaunchImage-Portrait@2x~ipad.png      | 1536 x 2008 | iPad Portrait Retina
   Default~ipad~nostatusbar@2x.png           | LaunchImage-700-Portrait@2x~ipad.png  | 1536 x 2048 | iPad Portrait Retina FS
   Default~ipad~landscape@2x.png             | LaunchImage-Landscape@2x~ipad.png     | 2048 x 1496 | iPad Landscape Retina
   Default~ipad~landscape~nostatusbar@2x.png | LaunchImage-700-Landscape@2x~ipad.png | 2048 x 1536 | iPad Landscape Retina FS
 */
public class func getDefaultImage() -> UIImage
{
    var fileName:String = "LaunchImage";
    let osVersion:String = EnvUtil.systemVersionMajor() > 6 ? "700" : "";
    let scale:String = EnvUtil.isRetina() ? "@2x" : "";
    let div:String = osVersion.length > 0 ? "-" : "";

    if (EnvUtil.isPad())
    {
        let orientation:String = EnvUtil.isPortraitOrientation() ? "Portrait" : "Landscape";
        fileName += "-" + osVersion + div + orientation + scale + "~ipad";
    }
    else
    {
        if (CGRectGetHeight(UIScreen.mainScreen().bounds) > 480.0)
        {
            /* iPhone 5. */
            fileName += "-" + osVersion + div + "568h@2x";
        }
        else
        {
            /* iPhone 4 with iOS7? */
            fileName += div + osVersion + scale;
        }
    }

    fileName += ".png";
    //Log.debug(fileName);

    return UIImage(named: fileName);
}

这似乎解决了方向拉伸问题,但它选择了错误的图像大小。当我在iPad emulator上检查图像大小时,它显示320x480不正确。这似乎解决了方向拉伸问题,但它选择了错误的图像大小。当我在iPad emulator上检查图像的大小时,它显示320x480,这是不正确的。但是这种方法只会组合图像文件名,并从中生成UIImage。但是,如果我尝试指定物理文件名,例如UIImagenamed:Default.png,它已经不起作用了。很明显,它并没有通过其物理文件名找到图像,尽管它存在,但只使用资产ID,例如“LaunchImage”。另一个奇怪的是,我的启动图像包含大小不同的文件,包括状态栏和不包括状态栏,例如Default~ipad~nostatsbar.png。但是,在您的解决方案中根本不考虑这些。Grml nevermind!我刚刚发现图像文件名在编译过程中发生了变化!UIImage*myImage=[UIImage defaultImage];可能有些情况下,我还没有涉及到一张图片:-我刚才写的。您可以扩展它以覆盖这些图像,但这就是goBut的方法。此方法仅组合图像文件名并从中生成UIImage。但是,如果我尝试指定物理文件名,例如UIImagenamed:Default.png,它已经不起作用了。很明显,它并没有通过其物理文件名找到图像,尽管它存在,但只使用资产ID,例如“LaunchImage”。另一个奇怪的是,我的启动图像包含大小不同的文件,包括状态栏和不包括状态栏,例如Default~ipad~nostatsbar.png。但是,在您的解决方案中根本不考虑这些。Grml nevermind!我刚刚发现图像文件名在编译过程中发生了变化!UIImage*myImage=[UIImage defaultImage];可能有些情况下,我还没有涉及到一张图片:-我刚才写的。你可以把它扩展到这些 但这是一条路要走