Xcode 5 और एसेट कैटलॉग: LaunchImage का संदर्भ कैसे दें?


102

मैं Xcode 5 की एसेट कैटलॉग का उपयोग कर रहा हूं, और मैं LaunchImageअपने होम व्यू की पृष्ठभूमि की छवि के रूप में उपयोग करना चाहूंगा ('लोडिंग' से 'लोडेड' लुक को सुचारू बनाने के लिए)

मैं अंतरिक्ष को बचाने के लिए एसेट कैटलॉग में एक ही प्रविष्टि का उपयोग करना चाहता हूं और दो अलग-अलग छवि सेटों में छवि को दोहराना नहीं है।

हालाँकि, कॉलिंग:

UIImage *image = [UIImage imageNamed:@"LaunchImage"]; //returns nil

जवाबों:


83

यह LaunchImage की (लगभग) पूरी सूची है (बिना किसी स्टेटस बार के iPad छवियों को छोड़कर)

  • LaunchImage-568h@2x.png
  • LaunchImage-700-568h@2x.png
  • LaunchImage-700-Landscape@2x~ipad.png
  • LaunchImage-700-लैंडस्केप ~ ipad.png
  • LaunchImage-700-Portrait@2x~ipad.png
  • LaunchImage-700-पोर्ट्रेट ~ ipad.png
  • LaunchImage-700@2x.png
  • LaunchImage-Landscape@2x~ipad.png
  • LaunchImage-लैंडस्केप ~ ipad.png
  • LaunchImage-Portrait@2x~ipad.png
  • LaunchImage-पोर्ट्रेट ~ ipad.png
  • LaunchImage.png
  • LaunchImage@2x.png
  • LaunchImage-800-667h@2x.png (iPhone 6)
  • LaunchImage-800-Portrait-736h@3x.png (iPhone 6 प्लस पोर्ट्रेट)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus लैंडस्केप)
  • LaunchImage-1100-Portrait-2436h@3x.png (iPhone X पोर्ट्रेट)
  • LaunchImage-1100-Landscape-2436h@3x.png (iPhone X लैंडस्केप)

किसी को भी कोई स्थिति पट्टी के साथ iPad छवियों को जानते हो?
मोहम्मद हाफिज

1
@ मोहम्मद हाफ़िज़: पिचिरिची वास्तव में उन्हें अपनी सूची में शामिल करता है। वे LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-लैंडस्केप ~ ipad.png, और LaunchImage-Landscape -2x~ipad.png हैं।

700 और 800 का मतलब क्या है?
साउंड ब्लास्टर

2
मैंने इसे पकड़ा: इसका मतलब है कि iOS 7 और 8
साउंड ब्लास्टर

4
यह अविश्वसनीय रूप से कष्टप्रद है कि XCode स्वचालित रूप से इन छवि संपत्तियों के लिए एक फ़ाइल नाम बनाएगा और आपको हुप्स के माध्यम से कूदने के लिए पता लगाएगा कि उन्हें सीधे कैसे एक्सेस किया जाए ...
श्री टी

67
- (NSString *)splashImageNameForOrientation:(UIInterfaceOrientation)orientation {
    CGSize viewSize = self.view.bounds.size;
    NSString* viewOrientation = @"Portrait";
    if (UIDeviceOrientationIsLandscape(orientation)) {
        viewSize = CGSizeMake(viewSize.height, viewSize.width);
        viewOrientation = @"Landscape";
    }

    NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];
    for (NSDictionary* dict in imagesDict) {
        CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
        if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
            return dict[@"UILaunchImageName"];
    }
    return nil;
}

1
बहुत अच्छा काम करता है। उपलब्ध लॉन्च छवियों के लिए मुख्य बंडल की जानकारी शब्दकोश खोजने के लिए चतुर और सुरुचिपूर्ण दृष्टिकोण और फिर मिलान प्रस्ताव के साथ एक उठा!
iOSX

1
यह एक शानदार विचार है, मेरा और भविष्य के प्रमाण से बेहतर है, जब तक कि ऐप्पल info.plist की संरचना को नहीं बदलता है।
गैर

1
यह एक बहुत ही चतुर उपाय है। मेरे Xcode प्रोजेक्ट्स में मेरे पास कई लक्ष्य हैं और केवल LaunchImage स्ट्रिंग का उपयोग करने से हमेशा सही छवि वापस नहीं आती है। बहुत बहुत धन्यवाद।
एनरिको सुसात्यो

3
शानदार विचार हालांकि। लेकिन अपारदर्शी स्थिति पट्टी के साथ स्क्रीन के लिए काम नहीं करता है। इसलिए self.view.bounds.size को [UIScreen mainScreen] में बदलने की आवश्यकता है ।bounds.size
RamaKrishna Chunduri

1
महान समाधान। छोटा संपादन आवश्यक है: UIInterfaceOrientation से UIDeviceOrientation तक एक अंतर्निहित रूपांतरण है। UIInterfaceOrientationIsLandscape()इसके बजाय उपयोग करें ।
२०:२६ पर अल्मोग सी

53

LaunchImages विशेष हैं, और वास्तव में डिवाइस पर एक परिसंपत्ति कैटलॉग नहीं हैं। यदि आप iFunBox / iExplorer / etc (या सिम्युलेटर पर, या बिल्ड डायरेक्टरी में) का उपयोग करते हुए देखते हैं, तो आप अंतिम नामों को देख सकते हैं, और फिर उनका उपयोग करने के लिए कोड लिख सकते हैं - उदा। iOS7- केवल iPhone- केवल प्रोजेक्ट के लिए, यह सही लॉन्च छवि सेट करेगा:

NSString *launchImage;
if  ((UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) &&
     ([UIScreen mainScreen].bounds.size.height > 480.0f)) {
    launchImage = @"LaunchImage-700-568h";
} else {
    launchImage = @"LaunchImage-700";
}

[self.launchImageView setImage:[UIImage imageNamed:launchImage]];

मैंने इसे देखने के लिए डाल दिया।

यह वास्तव में आदर्श नहीं है, यह बहुत अच्छा होगा यदि Apple हमें ऐसा करने के लिए एक अच्छा एपीआई देगा।


2
यह मेरे लिए काम करता है, लेकिन मैं वास्तव में चाहता हूं कि लॉन्च छवि को संदर्भित करने का एक सरल तरीका था।
जोरायर 22

शायद Xcode 5.0.2 में तय किया गया है - नीचे देखें, मेरे लिए "LaunchImage.png" को संदर्भित करने के लिए काम करता है
एडम

1
@ अगर यह सच होता तो प्यार करता! मैंने अभी iphone5s / xcode5.0.2 / ios7.0.4 पर कोशिश की है, [UIImage imageNamed: @ "LaunchImage.png"] मुझे शून्य देता है।
जोसेफ

@ जोसेफ हम्म। शायद इसके लिए एक नई बनाई गई परियोजना की आवश्यकता है? यह Xcode 5.0.2 में बनाया गया प्रोजेक्ट है, केवल डिफॉल्ट में बदलाव "अक्षम एआरसी" था। यह बहुत अच्छा काम कर रहा है :)। मैं देखूंगा कि क्या मुझे कुछ और मिल सकता है, लेकिन मैं यह नहीं सोच सकता कि मैं और क्या बदल सकता हूं
एडम

मैं समान कोड की कोशिश कर रहा था लेकिन "डिफ़ॉल्ट" और "डिफ़ॉल्ट -568h" (मूल संसाधन फ़ाइल नाम) का उपयोग कर रहा था। निर्यात किए गए ऐप बंडल के अंदर देखने के बाद, मुझे एहसास हुआ कि Xcode ने "LaunchImage-700 *" के नाम बदल दिए हैं।
निकोलस मिआरी

27

मेरा ऐप वर्तमान में केवल iOS 7 और बाद में सपोर्ट करता है।

मैं एसेट कैटलॉग से लॉन्च इमेज का संदर्भ देता हूं:

NSDictionary *dict = @{@"320x480" : @"LaunchImage-700",
                       @"320x568" : @"LaunchImage-700-568h",
                       @"375x667" : @"LaunchImage-800-667h",
                       @"414x736" : @"LaunchImage-800-Portrait-736h"};
NSString *key = [NSString stringWithFormat:@"%dx%d",
    (int)[UIScreen mainScreen].bounds.size.width,
    (int)[UIScreen mainScreen].bounds.size.height];
UIImage *launchImage = [UIImage imageNamed:dict[key]];

यदि आप पुराने iOS संस्करणों का समर्थन करना चाहते हैं तो आप अधिक महत्वपूर्ण मूल्य जोड़े जोड़ सकते हैं।


1
ध्यान दें कि iOS 8 के साथ शुरू, UIScreen.mainScreen.boundsवर्तमान इंटरफ़ेस अभिविन्यास के आधार पर अलग है। देखें stackoverflow.com/a/24153540/158525
जीन रेगिसर

1
इसके लिए धन्यवाद, वास्तव में मैं क्या देख रहा था!
जोसेफ पैटरसन

Htis के लिए धन्यवाद, ऐप आइकन को एक्सेस करने की कोई विधि?
आसिफ हबीब

10

यहाँ ऊपर चेरपैक एवगेनी द्वारा प्रदान किए गए समाधान के आधार पर UIImage पर एक श्रेणी दी गई है।

UIImage + SplashImage.h :

#import <UIKit/UIKit.h>

/**
 * Category on `UIImage` to access the splash image.
 **/
@interface UIImage (SplashImage)

/**
 * Return the name of the splash image for a given orientation.
 * @param orientation The interface orientation.
 * @return The name of the splash image.
 **/
+ (NSString *)si_splashImageNameForOrientation:(UIInterfaceOrientation)orientation;

/**
 * Returns the splash image for a given orientation.
 * @param orientation The interface orientation.
 * @return The splash image.
 **/
+ (UIImage*)si_splashImageForOrientation:(UIInterfaceOrientation)orientation;

@end

UIImage + SplashImage.m :

#import "UIImage+SplashImage.h"

@implementation UIImage (SplashImage)

+ (NSString *)si_splashImageNameForOrientation:(UIInterfaceOrientation)orientation
{
    CGSize viewSize = [UIScreen mainScreen].bounds.size;

    NSString *viewOrientation = @"Portrait";

    if (UIDeviceOrientationIsLandscape(orientation))
    {
        viewSize = CGSizeMake(viewSize.height, viewSize.width);
        viewOrientation = @"Landscape";
    }

    NSArray* imagesDict = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"UILaunchImages"];

    for (NSDictionary *dict in imagesDict)
    {
        CGSize imageSize = CGSizeFromString(dict[@"UILaunchImageSize"]);
        if (CGSizeEqualToSize(imageSize, viewSize) && [viewOrientation isEqualToString:dict[@"UILaunchImageOrientation"]])
            return dict[@"UILaunchImageName"];
    }
    return nil;
}

+ (UIImage*)si_splashImageForOrientation:(UIInterfaceOrientation)orientation
{
    NSString *imageName = [self si_splashImageNameForOrientation:orientation];
    UIImage *image = [UIImage imageNamed:imageName];
    return image;
}

@end

imageNamed छवि को सिस्टम कैश में धकेल देता है, लेकिन लॉन्च की छवि कभी-कभी बहुत विशाल होती है, इसलिए यह मेमोरी में होती है जब तक कैश इसे फ्लश नहीं करता है
इगोर पालगुटा

9

@ स्विफ्ट 1.2 के लिए कोडमैन का जवाब अपडेट:

func splashImageForOrientation(orientation: UIInterfaceOrientation, size: CGSize) -> String? {
    var viewSize        = size
    var viewOrientation = "Portrait"

    if UIInterfaceOrientationIsLandscape(orientation) {
        viewSize        = CGSizeMake(size.height, size.width)
        viewOrientation = "Landscape"
    }

    if let imagesDict = NSBundle.mainBundle().infoDictionary as? [String: AnyObject] {
        if let imagesArray = imagesDict["UILaunchImages"] as? [[String: String]] {
            for dict in imagesArray {
                if let sizeString = dict["UILaunchImageSize"], let imageOrientation = dict["UILaunchImageOrientation"] {
                    let imageSize = CGSizeFromString(sizeString)
                    if CGSizeEqualToSize(imageSize, viewSize) && viewOrientation == imageOrientation {
                        if let imageName = dict["UILaunchImageName"] {
                            return imageName
                        }
                    }
                }
            }
        }
    }

    return nil

}

इसे कॉल करने के लिए, और iOS 8 के लिए रोटेशन का समर्थन करने के लिए:

override func viewWillAppear(animated: Bool) {
    if let img = splashImageForOrientation(UIApplication.sharedApplication().statusBarOrientation, size: self.view.bounds.size) {
        backgroundImage.image = UIImage(named: img)
    }
}

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    let orientation = size.height > size.width ? UIInterfaceOrientation.Portrait : UIInterfaceOrientation.LandscapeLeft

    if let img = splashImageForOrientation(orientation, size: size) {
        backgroundImage.image = UIImage(named: img)
    }

}

बस मुझे क्या चाहिए, धन्यवाद!


7

मैंने सिर्फ iPhone और iPad (लैंडस्केप, पोर्ट्रेट) के लिए छप छवि नाम प्राप्त करने के लिए एक सामान्य विधि लिखी, इसने मेरे लिए काम किया, आशा है कि यह आपकी मदद भी करेगा। मैंने अन्य SO उत्तरों की मदद से इसे लिखा, धन्यवाद पूरी सूची के लिए @Pichirichi।

+(NSString*)getLaunchImageName
{

 NSArray* images= @[@"LaunchImage.png", @"LaunchImage@2x.png",@"LaunchImage-700@2x.png",@"LaunchImage-568h@2x.png",@"LaunchImage-700-568h@2x.png",@"LaunchImage-700-Portrait@2x~ipad.png",@"LaunchImage-Portrait@2x~ipad.png",@"LaunchImage-700-Portrait~ipad.png",@"LaunchImage-Portrait~ipad.png",@"LaunchImage-Landscape@2x~ipad.png",@"LaunchImage-700-Landscape@2x~ipad.png",@"LaunchImage-Landscape~ipad.png",@"LaunchImage-700-Landscape~ipad.png"];

UIImage *splashImage;

if ([self isDeviceiPhone])
{
    if ([self isDeviceiPhone4] && [self isDeviceRetina])
    {
        splashImage = [UIImage imageNamed:images[1]];
        if (splashImage.size.width!=0)
            return images[1];
        else
            return images[2];
    }
    else if ([self isDeviceiPhone5])
    {
        splashImage = [UIImage imageNamed:images[1]];
        if (splashImage.size.width!=0)
            return images[3];
        else
            return images[4];
    }
    else
        return images[0]; //Non-retina iPhone
}
else if ([[UIDevice currentDevice] orientation]==UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown)//iPad Portrait
{
    if ([self isDeviceRetina])
    {
        splashImage = [UIImage imageNamed:images[5]];
        if (splashImage.size.width!=0)
            return images[5];
        else
            return images[6];
    }
    else
    {
        splashImage = [UIImage imageNamed:images[7]];
        if (splashImage.size.width!=0)
            return images[7];
        else
            return images[8];
    }

}
else
{
    if ([self isDeviceRetina])
    {
        splashImage = [UIImage imageNamed:images[9]];
        if (splashImage.size.width!=0)
            return images[9];
        else
            return images[10];
    }
    else
    {
        splashImage = [UIImage imageNamed:images[11]];
        if (splashImage.size.width!=0)
            return images[11];
        else
            return images[12];
    }
 }
}

अन्य उपयोगिता विधियाँ हैं

+(BOOL)isDeviceiPhone
{
 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
 {
     return TRUE;
 }

 return FALSE;
}

+(BOOL)isDeviceiPhone4
{
 if ([[UIScreen mainScreen] bounds].size.height==480)
    return TRUE;

 return FALSE;
}


+(BOOL)isDeviceRetina
{
 if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
    ([UIScreen mainScreen].scale == 2.0))        // Retina display
 {
    return TRUE;
 } 
 else                                          // non-Retina display
 {
     return FALSE;
 }
}


+(BOOL)isDeviceiPhone5
{
 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && [[UIScreen mainScreen] bounds].size.height>480)
 {
    return TRUE;
 }
 return FALSE;
}

वास्तव में isDeviceiPhone4 के लिए इस कोड में एक मामूली बग है: [[UIScreen मेनस्क्रीन] सीमाएं] अब आप iOS 8 के तहत क्या अभिविन्यास के आधार पर परिवर्तन करते हैं। आपको स्पष्ट रूप से इसे कुछ करने वाले पोर्ट्रेट सीमा में बदलने की आवश्यकता होगी [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace], लेकिन बनाते हैं यह सुनिश्चित करने के लिए कि क्या आप पहले iOS 8 पर परीक्षण कर रहे हैं अन्यथा दुर्घटनाग्रस्त हो जाएगा।
मोहम्मद हाफिज

धन्यवाद @Hafez कि बाहर इशारा करने के लिए, मैं इसे iOS 8 के लिए परीक्षण करूंगा और जल्द ही जवाब अपडेट करूंगा।
ज़हीर

7

चेरपैक एवगेनी के उत्तर का स्विफ्ट संस्करण:

    func splashImageForOrientation(orientation: UIInterfaceOrientation) -> String {
        var viewSize = self.view.bounds.size
        var viewOrientation = "Portrait"
        if UIInterfaceOrientationIsLandscape(orientation) {
           viewSize = CGSizeMake(viewSize.height, viewSize.width)
           viewOrientation = "Landscape"
        }
        let imagesDict = NSBundle.mainBundle().infoDictionary as Dictionary<NSObject,AnyObject>!
        let imagesArray = imagesDict["UILaunchImages"] as NSArray
        for dict in imagesArray {
            let dictNSDict = dict as NSDictionary
            let imageSize = CGSizeFromString(dictNSDict["UILaunchImageSize"] as String)
            if CGSizeEqualToSize(imageSize, viewSize) && viewOrientation == (dictNSDict["UILaunchImageOrientation"] as String) {
                return dictNSDict["UILaunchImageName"] as String
            }
        }
        return ""
    }

5

@ पिचिरिच के जवाब के बाद, मैंने इंटरफ़ेसबीउल्ट में अपनी लॉन्चिंग को संदर्भित किया:

"LaunchImage.png"

... और Xcode 5.0.2 के साथ, यह स्वचालित रूप से उचित छवि को सीधे एसेट कैटलॉग से बाहर निकाल रहा है।

यह मैं क्या उम्मीद करूँगा - सिवाय Apple के शातिर बुरा कदम के चुपचाप "Default.png" को "LaunchImage.png" नाम देने के अलावा :)


एक और बात पर ध्यान दिया जाना चाहिए। इन छवियों का आकार बिल्कुल Apple जैसा होना चाहिए (iOS के लिए LaunchImage के लिए 320x480 उदाहरण के लिए 5-6 iPhone 3GS), अन्यथा यह होगाnil दी गई जानकारी के बाद
अलेक्जेंडर कोस्टिएव

3

में प्रलेखन वहाँ स्पष्ट रूप से कहा गया है:

"एसेट कैटलॉग में प्रत्येक सेट का एक नाम होता हैआप उस नाम का उपयोग प्रोग्राम में किसी भी व्यक्तिगत छवि को लोड करने के लिए कर सकते हैं। एक छवि को लोड करने के लिए, UIImage: ImageNamed को कॉल करें : पद्धति को , उस सेट के नाम को पास करना जिसमें छवि शामिल है। । "

पिचिरिची की सूची का उपयोग इस असंगतता को हल करने में मदद करता है।


1
"सेट का नाम" भाग पर ध्यान दें। मेरी संपत्ति सूची को देखते हुए, मेरे पास एक सेट है जिसे "लॉन्चआईमेज" कहा जाता है। लॉन्च छवि को लोड करने के लिए, फिर, मैंने कहा: UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];महान काम करता है!
लीनन

1
पिचिरिची की सूची का उपयोग करने की आवश्यकता नहीं है (सोचा कि यह अभी भी जानने के लिए भयानक जानकारी है) - बस संपत्ति सूची के "सेट" के नाम का उपयोग करें।
लीनने

2
खैर, मेरे लिए यह Xcode 6.0.1 और iOS 8 पर लॉन्च इमेज के लिए काम नहीं करता है। LaunchImage विशेष रूप से ऐसा प्रतीत होता है कि यह इमेज व्यक्तिगत रूप से संकलित ऐप बंडल में समाप्त हो जाती है और xcasset बंडल फ़ोल्डर के अंदर नहीं रहती है।
औको

क्या होगा यदि दो अलग-अलग संपत्ति कैटलॉग हों जिनमें पहचान नाम के सेट हों? कैसे [UIImage imageNamed:..]पता चलेगा कि कौन सा चुनना है?
कार्लोस पी

मेरे लिए यह काम नहीं करता है, XCode 6.0.1 iOS 7 iPod टच
dev

3

कोड की एक लाइन द्वारा लॉन्च इमेज को आसानी से एक्सेस किया जा सकता है।

 UIImage *myAppsLaunchImage = [UIImage launchImage];

कृपया ऊपर दिए गए कार्यक्षमता को प्राप्त करने के लिए नीचे दिए गए चरणों का पालन करें।

चरण 1.UIImage एक श्रेणी बनाकर कक्षा काविस्तार करेंऔर इसमें निम्न विधि जोड़ें।

+ (UIImage *)launchImage {
    NSDictionary *dOfLaunchImage = [NSDictionary dictionaryWithObjectsAndKeys:
                                    @"LaunchImage-568h@2x.png",@"568,320,2,8,p", // ios 8 - iphone 5 - portrait
                                    @"LaunchImage-568h@2x.png",@"568,320,2,8,l", // ios 8 - iphone 5 - landscape
                                    @"LaunchImage-700-568h@2x.png",@"568,320,2,7,p", // ios 7 - iphone 5 - portrait
                                    @"LaunchImage-700-568h@2x.png",@"568,320,2,7,l", // ios 7 - iphone 5 - landscape
                                    @"LaunchImage-700-Landscape@2x~ipad.png",@"1024,768,2,7,l", // ios 7 - ipad retina - landscape
                                    @"LaunchImage-700-Landscape~ipad.png",@"1024,768,1,7,l", // ios 7 - ipad regular - landscape
                                    @"LaunchImage-700-Portrait@2x~ipad.png",@"1024,768,2,7,p", // ios 7 - ipad retina - portrait
                                    @"LaunchImage-700-Portrait~ipad.png",@"1024,768,1,7,p", // ios 7 - ipad regular - portrait
                                    @"LaunchImage-700@2x.png",@"480,320,2,7,p", // ios 7 - iphone 4/4s retina - portrait
                                    @"LaunchImage-700@2x.png",@"480,320,2,7,l", // ios 7 - iphone 4/4s retina - landscape
                                    @"LaunchImage-Landscape@2x~ipad.png",@"1024,768,2,8,l", // ios 8 - ipad retina - landscape
                                    @"LaunchImage-Landscape~ipad.png",@"1024,768,1,8,l", // ios 8 - ipad regular - landscape
                                    @"LaunchImage-Portrait@2x~ipad.png",@"1024,768,2,8,p", // ios 8 - ipad retina - portrait
                                    @"LaunchImage-Portrait~ipad.png",@"1024,768,1,8,l", // ios 8 - ipad regular - portrait
                                    @"LaunchImage.png",@"480,320,1,7,p", // ios 6 - iphone 3g/3gs - portrait
                                    @"LaunchImage.png",@"480,320,1,7,l", // ios 6 - iphone 3g/3gs - landscape
                                    @"LaunchImage@2x.png",@"480,320,2,8,p", // ios 6,7,8 - iphone 4/4s - portrait
                                    @"LaunchImage@2x.png",@"480,320,2,8,l", // ios 6,7,8 - iphone 4/4s - landscape
                                    @"LaunchImage-800-667h@2x.png",@"667,375,2,8,p", // ios 8 - iphone 6 - portrait
                                    @"LaunchImage-800-667h@2x.png",@"667,375,2,8,l", // ios 8 - iphone 6 - landscape
                                    @"LaunchImage-800-Portrait-736h@3x.png",@"736,414,3,8,p", // ios 8 - iphone 6 plus - portrait
                                    @"LaunchImage-800-Landscape-736h@3x.png",@"736,414,3,8,l", // ios 8 - iphone 6 plus - landscape
                                    nil];
    NSInteger width = ([UIScreen mainScreen].bounds.size.width>[UIScreen mainScreen].bounds.size.height)?[UIScreen mainScreen].bounds.size.width:[UIScreen mainScreen].bounds.size.height;
    NSInteger height = ([UIScreen mainScreen].bounds.size.width>[UIScreen mainScreen].bounds.size.height)?[UIScreen mainScreen].bounds.size.height:[UIScreen mainScreen].bounds.size.width;
    NSInteger os = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] integerValue];
    NSString *strOrientation = UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])?@"l":@"p";
    NSString *strImageName = [NSString stringWithFormat:@"%li,%li,%li,%li,%@",width,height,(NSInteger)[UIScreen mainScreen].scale,os,strOrientation];
    UIImage *imageToReturn = [UIImage imageNamed:[dOfLaunchImage valueForKey:strImageName]];
    if([strOrientation isEqualToString:@"l"] && [strImageName rangeOfString:@"Landscape"].length==0) {
        imageToReturn = [UIImage rotate:imageToReturn orientation:UIImageOrientationRight];
    }
    return imageToReturn;
}

चरण 2. उपरोक्त विधि निम्नलिखित कोड को भी उसी श्रेणी में जोड़कर काम करना चाहिएUIImage

static inline double radians (double degrees) {return degrees * M_PI/180;}

+ (UIImage *)rotate:(UIImage*)src orientation:(UIImageOrientation) orientation {
    UIGraphicsBeginImageContext(src.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    if (orientation == UIImageOrientationRight) {
        CGContextRotateCTM (context, radians(90));
    } else if (orientation == UIImageOrientationLeft) {
        CGContextRotateCTM (context, radians(-90));
    } else if (orientation == UIImageOrientationDown) {
        // NOTHING
    } else if (orientation == UIImageOrientationUp) {
        CGContextRotateCTM (context, radians(90));
    }
    [src drawAtPoint:CGPointMake(0, 0)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

बहुत बढ़िया जवाब, धन्यवाद!
डॉर्ट्ज़ुर

1
अब iPhone X लॉन्च की छवि के लिए नाम क्या है?
आरपीएम

2

मुझे लगता है कि यह आवश्यक रूप से सभी के लिए सबसे अच्छा समाधान नहीं है, लेकिन यह करने के लिए सबसे आसान (और कम से कम त्रुटि-प्रवण, IMHO) तरीका यह है कि आपके Images.xcassets कैटलॉग में एक अलग प्रविष्टि बनाकर। मैंने उसे फोन किया SplashImage

जब आप एक नई प्रविष्टि जोड़ने के लिए जाते हैं, तो सुनिश्चित करें कि विकल्प के रूप में "नई लॉन्च छवि" का चयन करें। इसके बजाय, जेनेरिक "न्यू इमेज सेट" चुनें। इसके बाद, निरीक्षक खोलें और संबंधित विकल्पों का चयन करें। यदि आप केवल रेटिना उपकरणों के लिए निर्माण कर रहे हैं, जैसा कि मैं था, तो आप निम्नलिखित का चयन कर सकते हैं:

छवि निरीक्षक

यह आपको चार प्रविष्टियों (iPhone 4S, iPhone 5 (s, c), iPhone 6 और iPhone 6 Plus) के साथ छोड़ देगा।

इमेजिस

छवियों के अनुरूप फाइलें इस प्रकार हैं:

| Resolution (Xcode entry) | Launch Image name   |   Device         |
|--------------------------|---------------------|------------------|
| 1x                       | Default-750.png     | iPhone 6         |
| 2x                       | Default@2x.png      | iPhone 4S        |
| Retina 4 2x              | Default-568h@2x.png | iPhone 5, 5s, 5c |
| 3x                       | Default-1242.png    | iPhone 6 Plus    |

बेशक, आपके द्वारा यह करने के बाद आप बस उपयोग कर सकते हैं [UIImage imageNamed:@"SplashImage"]


1
दिलचस्प विचार है, लेकिन यह iPhone 6 पर काम नहीं करता है। यह अभी भी iPhone 6 सिम्युलेटर पर Default@2x.png छवि को लोड करता है।
गैर-

इस दृष्टिकोण का उपयोग करते हुए आपको लैंडस्केप ओरिएंटेशन के लिए लॉन्च छवियों के सेट के बारे में भी ध्यान रखना चाहिए।
बेर्क

2

पिचिरिची के जवाब की मदद से मैंने निम्नलिखित श्रेणी (iOS 7+) लागू की है: UIImage + AssetLahaIIage

यह वास्तव में मक्खी पर नाम पैदा करने से बहुत कम है, लेकिन शायद मददगार होगा।


0

नवीनतम स्विफ्ट सिंटैक्स (5 स्विफ्ट) को अपडेट किया गया

   func splashImageForOrientation(orientation: UIInterfaceOrientation) -> String? {

    var viewSize = screenSize
    var viewOrientation = "Portrait"
    if orientation.isLandscape {
        viewSize = CGSize(width: viewSize.height, height: viewSize.width)
        viewOrientation = "Landscape"
    }
    if let infoDict = Bundle.main.infoDictionary, let launchImagesArray = infoDict["UILaunchImages"] as? [Any] {
        for launchImage in launchImagesArray {
            if let launchImage = launchImage as? [String: Any], let nameString = launchImage["UILaunchImageName"] as? String, let sizeString = launchImage["UILaunchImageSize"] as? String, let orientationString = launchImage["UILaunchImageOrientation"] as? String {
                let imageSize = NSCoder.cgSize(for: sizeString)
                if imageSize.equalTo(viewSize) && viewOrientation == orientationString {
                    return nameString
                }
            }
        }
    }
    return nil
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.