iOS 7 / Xcode 5:以编程方式访问设备启动图像

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 7 / Xcode 5:以编程方式访问设备启动图像相关的知识,希望对你有一定的参考价值。

有没有办法使用应用程序LaunchImage作为通用ios应用程序的背景,而无需在多个地方放置相同的图像资源?

我无法访问LaunchImage中的Images.xcassets文件,所以我创建了两个新的图像集“背景肖像”和“背景景观”(因为似乎没有办法将横向和纵向图像放入同一组)。

虽然这个解决方法完成了这些工作,但我不愿意将每个图像都包含在应用程序中两次。这也具有高维护成本。

任何有关如何访问当前设备的LaunchImage的建议都表示赞赏。

GCOLaunchImageTransition必须完成iOS <7的工作。

答案

您可以使用启动图像,而无需包括它们两次。关键是当您使用资产目录时,应用程序包中包含的图像的文件名是(有点)标准化的,可能与您为原始文件命名的内容无关。

特别是,当您使用LaunchImage映像集时,最终在应用程序包中的文件具有类似的名称

  • LaunchImage.png
  • launch image@2小.PNG
  • launch image-700@2小.PNG
  • launch image-568还@2小.PNG
  • launch image-700-568还@2小.PNG
  • launch image-700-landscape@2小~iPad.PNG

注意,特别是,它们没有被命名为Default.png或其任何变体。即使那就是你所谓的文件。一旦将它们放入资产目录中的一个井中,它们就会以标准名称出现在另一端。

所以[UIImage imageNamed:@"Default"]将无法正常工作,因为应用程序包中没有这样的文件。然而,[UIImage imageNamed:@"LaunchImage"]将起作用(假设您已经填充了iPhone Portrait 2x井或iOS7 iPhone Portrait 1x井)。

文档表明imageNamed:上的UIImage方法应该自动选择正确的版本,但我认为这仅适用于启动图像以外的图像集 - 至少我没有让它正常工作(可能只是我没有做正确的事情)。

因此,根据您的具体情况,您可能需要进行一些试验和错误才能获得正确的文件名。在模拟器中构建并运行应用程序,然后您可以始终查看~/Library/Application Support/iPhone Simulator的相应子目录,以验证应用程序包中的实际文件名是什么。

但同样,主要的一点是,不需要包含图像文件的副本,也不需要对Copy Bundle Resources构建阶段进行任何调整。

另一答案

Matthew Burke的答案是正确的答案。下面是我正在使用的代码,用于iOS9 / Xcode7,为iOS7及更高版本构建应用程序,适用于iPhone和iPad,允许使用横向。

首先,详细说明一下:在iOS8 / Xcode6中,如果你使用故事板启动屏幕文件,在应用启动时,应用程序将以正确的分辨率创建该启动屏幕文件的2个图像(一个肖像,一个横向)您的设备,您可以从文件路径中获取该图像。 (我相信它存储在Library / LaunchImage文件夹中)。

但是在iOS9 / XCode 7中,不再创建此图像(尽管快照是在快照文件夹中拍摄的,但它具有一直在不断更改的名称),因此如果要在代码中的其他位置使用LaunchImage,您将不得不使用启动图像源(最好通过资产目录,因为App Thinning)。现在,正如Matthew Burke所解释的那样,你无法通过这样做来达到这个形象:

let launchImage = UIImage(named: "LaunchImage")

即使资产目录中的图像名称是LaunchImage,Xcode / iOS9也不会让你。

幸运的是,您不必在资产目录中再次包含启动图像。幸运的是,如果您为所有设备制作应用程序,这意味着您的应用程序下载大小将增加20MB。

那么,如何获得那些发布图像呢?嗯,这是步骤:

  1. 创建启动映像并将其放入资产目录中。图像名称并不重要。
  2. 确保您的启动屏幕文件(在目标的常规设置下)为空,并从您的设备和模拟器中删除您的应用程序。 (只是删除文件名并重新运行不会这样做,你必须先删除你的应用程序)
  3. 在模拟器中运行您的应用程序,然后转到〜/ Library / Application Support / iPhone Simulator文件夹,在那里找到您的应用程序。 (这有点麻烦,因为文件夹名称是无意义的。)显示.app文件的包内容,在那里你会看到几个以“LaunchImage- ...”开头的图像文件。在我的例子中有9个图像因为我正在为iOS7及以上的iPhone和iPad制作应用程序。
  4. 然后,在您的代码中,您需要确定您的应用运行的设备,以及它是纵向还是横向,然后决定使用哪个图像。为了使这更容易,我使用了这个框架:https://github.com/InderKumarRathore/DeviceGuru。是商品,它还没有包括最新的设备(iPhone 6s和iPhone 6s plus),所以你必须在他的swift文件中添加一行。然后,将下面的代码放在你想要你的launchImage的vc中,然后你去: func launchImage() -> UIImage? { if let launchImageName = launcheImageName() { print(launchImageName) return UIImage(named: launchImageName) } else { print("no launch image") return nil } } func launcheImageName() -> String? { let HD35 = "LaunchImage-700@2x.png" let HD40 = "LaunchImage-700-568h@2x" let HD47 = "LaunchImage-800-667h@2x.png" var HD55 = "LaunchImage-800-Portrait-736h@3x.png" var padHD = "LaunchImage-700-Portrait@2x~ipad.png" var pad = "LaunchImage-700-Portrait~ipad.png" if UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft || UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight { HD55 = "LaunchImage-800-Landscape-736h@3x.png" padHD = "LaunchImage-700-Landscape@2x~ipad.png" pad = "LaunchImage-700-Landscape~ipad.png" } let hardware = hardwareString() if (hardware == "iPhone1,1") { return HD35 } if (hardware == "iPhone1,2") { return HD35 } if (hardware == "iPhone2,1") { return HD35 } if (hardware == "iPhone3,1") { return HD35 } if (hardware == "iPhone3,2") { return HD35 } if (hardware == "iPhone3,3") { return HD35 } if (hardware == "iPhone4,1") { return HD35 } if (hardware == "iPhone5,1") { return HD40 } if (hardware == "iPhone5,2") { return HD40 } if (hardware == "iPhone5,3") { return HD40 } if (hardware == "iPhone5,4") { return HD40 } if (hardware == "iPhone6,1") { return HD40 } if (hardware == "iPhone6,2") { return HD40 } if (hardware == "iPhone7,1") { return HD55 } if (hardware == "iPhone7,2") { return HD47 } if (hardware == "iPhone8,1") { return HD55 } if (hardware == "iPhone8,2") { return HD47 } if (hardware == "iPod1,1") { return HD35 } if (hardware == "iPod2,1") { return HD35 } if (hardware == "iPod3,1") { return HD35 } if (hardware == "iPod4,1") { return HD35 } if (hardware == "iPod5,1") { return HD40 } if (hardware == "iPad1,1") { return pad } if (hardware == "iPad1,2") { return pad } if (hardware == "iPad2,1") { return pad } if (hardware == "iPad2,2") { return pad } if (hardware == "iPad2,3") { return pad } if (hardware == "iPad2,4") { return pad } if (hardware == "iPad2,5") { return pad } if (hardware == "iPad2,6") { return pad } if (hardware == "iPad2,7") { return pad } if (hardware == "iPad3,1") { return padHD } if (hardware == "iPad3,2") { return padHD } if (hardware == "iPad3,3") { return padHD } if (hardware == "iPad3,4") { return padHD } if (hardware == "iPad3,5") { return padHD } if (hardware == "iPad3,6") { return padHD } if (hardware == "iPad4,1") { return padHD } if (hardware == "iPad4,2") { return padHD } if (hardware == "iPad4,3") { return padHD } if (hardware == "iPad4,4") { return padHD } if (hardware == "iPad4,5") { return padHD } if (hardware == "iPad4,6") { return padHD } if (hardware == "iPad4,7") { return padHD } if (hardware == "iPad4,8") { return padHD } if (hardware == "iPad5,3") { return padHD } if (hardware == "iPad5,4") { return padHD } if (hardware == "i386") { return HD55 } if (hardware == "x86_64") { return HD55 } if (hardware.hasPrefix("iPhone")) { return HD55 } if (hardware.hasPrefix("iPod")) { return HD55 } if (hardware.hasPrefix("iPad")) { return padHD } //log message that your device is not present in the list logMessage(hardware) return nil }
另一答案
 if (IS_IPHONE_4_OR_LESS) {
    self.imageView.image = [UIImage imageNamed:@"LaunchImage-700@2x.png"];
}
else if (IS_IPHONE_5){
     self.imageView.image = [UIImage imageNamed:@"LaunchImage-700-568h@2x.png"];
}
else if (IS_IPHONE_6){
     self.imageView.image = [UIImage imageNamed:@"LaunchImage-800-667h@2x.png"];
}
else if (IS_IPHONE_6P){
      self.imageView.image = [UIImage imageNamed:@"LaunchImage-800-Portrait-736h@3x.png"];
}
另一答案

以下是基于Daniel Witurna解决方案的修改代码。此代码段使用谓词从包图像列表中过滤启动图像名称。谓词可能会避免多个循环来从图像路径数组中过滤启动图像。

-(NSString *)getLaunchImageName{

NSArray *allPngImageNames = [[NSBundle mainBundle] pathsForResourcesOfType:@"png" inDirectory:nil];
NSString *expression=[NSString stringWithFormat:@"SELF contains '%@'",@"LaunchImage"];

NSArray *res = [allPngImageNames filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:expression]];

NSString *launchImageName;
for (launchImageName in res){
    {
        UIImage *img = [UIImage imageNamed:launchImageName];
        // Has image same scale and dimensions as our current device's screen?
        if (img.scale == [UIScreen mainScreen].scale && CGSizeEqualToSize(img.size, [UIScreen mainScreen].bounds.size)) {
            NSLog(@"Found launch image for current device %@", img.description);
            break;
        }

    }

}
retu

以上是关于iOS 7 / Xcode 5:以编程方式访问设备启动图像的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式设置 UILabel 位置 iOS 7

以编程方式创建 AutoLayout 约束 (IOS) Xcode 7.0.1

XCode 5.1 Beta 4 无法识别 iOS 7.1 Beta 4 测试设备

Xcode 7 iOS9 字体不再被识别

如何在iOS 7中以编程方式设置设备方向?

如何以编程方式访问连接到 Windows 桌面的 iOS 设备的文件系统?