iOS:使用 LaunchImage 作为应用背景

标签 ios objective-c iphone uiview swift

这可能没有故障吗?

我的 Xcode 项目有一个在 Assets (又名 Images.xcassets)中定义的启动图像,包括。所有支持的尺寸和方向。因为我想在我的初始 View 中使用相同的图像作为背景,所以我将它作为背景添加到 View Controller 中:

    view.layer.contents = UIImage(named:"LaunchImage").CGImage;

但是,当启动屏幕切换到初始 View 时,会出现明显的故障,因为 View 中设置的背景图像会拉伸(stretch)。此外,当我旋转设备时,图像会拉伸(stretch)。

设备旋转时发生的拉伸(stretch)似乎是合理的,因为显然 Assets 目录图像中的其他图像尺寸/方向在设置为背景图像时不被视为(我的猜测)。

但是启动屏幕和我的初始 View 之间发生的拉伸(stretch)看起来很奇怪,因为两者应该具有相同的大小。

当设备方向发生变化时,是否有任何经过试验和测试的程序可以让 bg 图像始终适应纵横比?这甚至可以通过(多尺寸)启动图像实现吗?


更新:

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

而且我只能通过 Images.xcassets 中定义的名称加载启动图像。如果我尝试使用物理文件名(例如 Default.png)创建一个 UIImage,背景将保持黑色。

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

最佳答案

为了完全解决这个问题,这里是我的 Daij-Djan 代码的 Swift 版本。它还在评论区列出了数量惊人的不同启动图像版本。有一些对我自己的实用程序库 (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);
}

关于iOS:使用 LaunchImage 作为应用背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25472957/

相关文章:

ios - 如何正确偏移 MKMapRect

javascript - 在不使用 window.scrollBy 的情况下在浏览器中滚动滚动条

ios - 了解 ARKit 中的坐标空间

ios - UITableView insertRows 不锁定主线程

ios - UIAppearance setTranslucent error : Illegal property type, c for appearance setter, _installAppearanceSwizzleForSetter

iphone - 向 iphone/android app/webapp 发送通知有哪些选项?

iphone - 选择 UITableViewCell 导航到新的 DetailViewController

ios - 使用条件排名数组进行快速归约和求和

objective-c - 赋值运算符是否会生成 NSArray 的浅拷贝?

ios - 什么时候重新发送数据?