41

複数の場所に同じ画像リソースを配置せずに、アプリ LaunchImage をユニバーサル iOS アプリの背景として使用する方法はありますか?

LaunchImageのファイルにアクセスできなかったImages.xcassetsので、「背景縦」と「背景横」の 2 つの新しい画像セットを作成しました (横向きと縦向きの画像を同じセットに入れる方法はないようです)。

この回避策で問題は解決しますが、すべての画像をアプリに 2 回含めるのは避けたいと思います。これも維持費が高い。

現在のデバイスの LaunchImage にアクセスする方法についてアドバイスをいただければ幸いです。

GCOLaunchImageTransitionは、iOS < 7 のジョブを完了している必要があります。

4

16 に答える 16

56

次のコードをコピーして貼り付けて、実行時にアプリの起動イメージを読み込むことができます。

// Load launch image
NSString *launchImageName;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    if ([UIScreen mainScreen].bounds.size.height == 480) launchImageName = @"LaunchImage-700@2x.png"; // iPhone 4/4s, 3.5 inch screen
    if ([UIScreen mainScreen].bounds.size.height == 568) launchImageName = @"LaunchImage-700-568h@2x.png"; // iPhone 5/5s, 4.0 inch screen
    if ([UIScreen mainScreen].bounds.size.height == 667) launchImageName = @"LaunchImage-800-667h@2x.png"; // iPhone 6, 4.7 inch screen
    if ([UIScreen mainScreen].bounds.size.height == 736) launchImageName = @"LaunchImage-800-Portrait-736h@3x.png"; // iPhone 6+, 5.5 inch screen
}
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    if ([UIScreen mainScreen].scale == 1) launchImageName = @"LaunchImage-700-Portrait~ipad.png"; // iPad 2
    if ([UIScreen mainScreen].scale == 2) launchImageName = @"LaunchImage-700-Portrait@2x~ipad.png"; // Retina iPads
}
self.launchImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:launchImageName]];
于 2014-12-05T17:44:33.683 に答える
10

Daniel Witurna による優れた回答の Swift バージョンで、既知のすべてのデバイス タイプまたは向きのリストと照合する必要はありません。

func appLaunchImage() -> UIImage? {

        let allPngImageNames = Bundle.main.paths(forResourcesOfType: "png", inDirectory: nil)

        for imageName in allPngImageNames
        {
            // make sure that the image name contains the string 'LaunchImage' and that we can actually create a UIImage from it.

            guard
                imageName.contains("LaunchImage"), 
                let image = UIImage(named: imageName) 
                else { continue }

            // if the image has the same scale AND dimensions as the current device's screen...

            if (image.scale == UIScreen.main.scale) && (image.size.equalTo(UIScreen.main.bounds.size))
            {
                return image
            }
        }

        return nil
    }
于 2016-07-19T13:22:21.973 に答える
2

実行時に起動イメージ名を取得するための Swift の簡潔な関数:

func launchImageName() -> String {
    switch (UI_USER_INTERFACE_IDIOM(), UIScreen.mainScreen().scale, UIScreen.mainScreen().bounds.size.height) {
        case (.Phone, _, 480): return "LaunchImage-700@2x.png"
        case (.Phone, _, 568): return "LaunchImage-700-568h@2x.png"
        case (.Phone, _, 667): return "LaunchImage-800-667h@2x.png"
        case (.Phone, _, 736): return "LaunchImage-800-Portrait-736h@3x.png"
        case (.Pad, 1, _): return "LaunchImage-700-Portrait~ipad.png"
        case (.Pad, 2, _): return "LaunchImage-700-Portrait@2x~ipad.png"
        default: return "LaunchImage"
    }
}
于 2015-09-10T09:07:00.800 に答える
1

デバイスを特定する必要がある場合は、次のコードを使用します (少し速くて汚いですが、うまくいきます)。

if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone ){

    CGFloat screenHeight = [UIScreen mainScreen].bounds.size.height;
    CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
    if( screenHeight < screenWidth ){
        screenHeight = screenWidth;
    }

    if( screenHeight > 480 && screenHeight < 667 ){
        DLog(@"iPhone 5/5s");
    } else if ( screenHeight > 480 && screenHeight < 736 ){
        DLog(@"iPhone 6");
    } else if ( screenHeight > 480 ){
        DLog(@"iPhone 6 Plus");
    } else {
        DLog(@"iPhone 4/4s");
    }
}
于 2014-10-16T09:23:32.273 に答える
1

これがコードを介したアクセスで意味するものかどうかはわかりません。ただし、「プロジェクト->ターゲット->ビルドフェーズ->バンドルリソースのコピー」を選択した場合は、「+」をクリックして「他を追加」して、Images.xcassets->LaunchImage.launchimageに移動し、使用するpngを選択しますそして「開く」をクリック。これで、次のような画像を使用できます[UIImage imageNamed:@"Default"];

于 2013-10-16T20:38:06.837 に答える
1

マシュー・バークの答えが正解です。以下は、iOS9 / Xcode7でこれを機能させるために使用しているコードで、iOS7以降、iPhoneおよびiPad用のアプリを構築し、横向きを許可します。

まず、もう少し詳しく説明します。iOS8 / Xcode6 では、ストーリーボードの起動画面ファイルを使用していた場合、アプリの起動時に、アプリはその起動画面ファイルの 2 つの画像 (1 つの縦長、1 つの横長) を適切な解像度で作成します。お使いのデバイスで、ファイル パスからそのイメージを取得できました。(Library/LaunchImage フォルダーに保存されていたと思います)。

ただし、iOS9/XCode 7 では、このイメージはもう作成されません (ただし、スナップショットはスナップショット フォルダーに作成されますが、その名前は常に変化するわかりやすい名前ではありません)。そのため、LaunchImage をコード内の別の場所で使用する場合は、 Launch Image Source を使用する必要があります (App Thinning のため、できればアセット カタログを介して)。さて、マシュー・バークが説明しているように、次のようにするだけではそのイメージにたどり着けません:

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) はまだ含まれていないので注意してください。そのため、彼の迅速なファイルに行を追加する必要があります。次に、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
    }
    
于 2015-09-22T02:12:34.670 に答える
0

プロジェクトに新しいグループを作成します。物理ディレクトリに依存していません。そのグループに起動イメージを から直接インポートしますLaunchImage.launchimage。出来上がり。

于 2015-03-10T22:52:50.283 に答える
0

を作成したらImages.xcassets、名前を に変更LaunchImageDefaultます。

iOS5 および iOS6 をサポートしている場合、これにより多くの手間が省けます。

「フォルダー」/カテゴリの実際の名前は、ビルド時にアセットに続きます。マシュー・バークが言ったことは他のすべてが真実です;)

于 2014-02-07T01:24:51.383 に答える
0
 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"];
}
于 2016-05-31T13:08:35.360 に答える
-1

「LaunchImage」アセットは実際にはカスタム ビーストなので…</p>

私の提案は、画像の複製 (または実際に必要なサブセット) を含むセカンダリ アセット カタログを作成することです。

私はFauxLaunchImageと呼んでいます。好きなようにアクセスできます

[UIImage imageNamed:@"FauxLaunchImage"];
于 2014-04-02T17:15:36.590 に答える