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-Landscape ~ ipad.png
  • LaunchImage-700-Portrait@2x~ipad.png
  • LaunchImage-700-Portrait ~ ipad.png
  • LaunchImage-700@2x.png
  • LaunchImage-Landscape@2x~ipad.png
  • LaunchImage-Landscape ~ ipad.png
  • LaunchImage-Portrait@2x~ipad.png
  • LaunchImage-Portrait ~ ipad.png
  • LaunchImage.png
  • LaunchImage@2x.png
  • LaunchImage-800-667h@2x.png (iPhone 6)
  • LaunchImage-800-Portrait-736h@3x.png (iPhone 6 Plus Portrait)
  • LaunchImage-800-Landscape-736h@3x.png (iPhone 6 Plus Landscape)
  • LaunchImage-1100-Portrait-2436h@3x.png (iPhone X 세로)
  • LaunchImage-1100-Landscape-2436h@3x.png (iPhone X Landscape)

상태 표시 줄이없는 iPad 이미지를 아는 사람이 있습니까?
Mohamed Hafez 2014 년

1
@Mohamed Hafez : Pichirichi는 실제로 그의 목록에 포함되어 있습니다. LaunchImage-Portrait ~ ipad.png, LaunchImage-Portrait@2x~ipad.png, LaunchImage-Landscape ~ ipad.png 및 LaunchImage-Landscape@2x~ipad.png입니다.
John Jacecko 2014 년

700과 800은 무엇을 의미합니까?
Sound Blaster

2
나는 그것을 잡았다 : 그것은 iOS 7 & 8을 의미한다
Sound Blaster

4
그것은 엑스 코드가 자동으로 이러한 이미지 자산의 파일 이름을 생성하고 직접 ...에 액세스하는 방법을 알아 내기 위해 남이 만들 것입니다 매우 짜증나
미스터 T

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
이것은 Apple이 info.plist의 구조를 변경하지 않는 한 내 것보다 낫고 미래에도 좋은 아이디어입니다.
nonamelive

1
이것은 매우 영리한 솔루션입니다. 내 Xcode 프로젝트에 여러 대상이 있고 LaunchImage 문자열을 사용하는 것만으로 항상 올바른 이미지가 반환되는 것은 아닙니다. 감사합니다.
Enrico Susatyo 2015

3
그래도 훌륭한 아이디어. 그러나 불투명 한 상태 표시 줄이있는 화면에서는 작동하지 않습니다. 그래서 .bounds.size [UIScreen mainScreen]로 변경 self.view.bounds.size에 필요
라마 크리시나 Chunduri

1
훌륭한 솔루션. 작은 편집 필요 : UIInterfaceOrientation에서 UIDeviceOrientation으로의 암시 적 변환이 있습니다. UIInterfaceOrientationIsLandscape()대신 사용하십시오 .
Almog C

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]];

나는 이것을 viewDidLoad에 넣었습니다.

이것은 정말 이상적이지는 않습니다. Apple이이를 수행 할 수있는 멋진 API를 제공한다면 좋을 것입니다.


2
이것은 나를 위해 일했지만 시작 이미지를 참조하는 더 간단한 방법이 정말로 있었으면합니다.
Zorayr

Xcode 5.0.2에서 수정되었을 수 있습니다. 아래를 참조하십시오. "LaunchImage.png"를 참조하기 위해 간단히 작동하는 것 같습니다
Adam

1
@Adam 그게 사실이라면 사랑할 것입니다! 방금 iphone5s / xcode5.0.2 / ios7.0.4에서 시도했습니다. [UIImage imageNamed : @ "LaunchImage.png"]는 나에게 아무것도 제공하지 않습니다.
JosephH 2011

@JosephH 흠. 새로 만든 프로젝트가 필요할까요? 이것은 Xcode 5.0.2에서 생성 된 프로젝트이며, 기본값으로 만 변경된 것은 "disabled ARC"였습니다. 잘 작동하고 있습니다 :). 내가 무엇을 찾을 수 있는지 볼 수 있습니다,하지만 난이 변경 될 수 있습니다 밖의 무엇을 생각할 수 없다
아담

비슷한 코드를 시도했지만 "Default"및 "Default-568h"(원래 리소스 파일 이름)를 사용했습니다. 내 보낸 App Bundle을 살펴본 결과 Xcode가 이름을 "LaunchImage-700 *"으로 변경한다는 것을 깨달았습니다.
Nicolas Miari 2014-06-12

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
Jean Regisser 2014 년

1
감사합니다. 정확히 제가 찾던 것입니다!
Joseph Paterson 2014

htis에 감사드립니다. 앱 아이콘에 액세스하는 방법이 있습니까?
AsifHabib

10

위의 Cherpak Evgeny가 제공 한 솔루션을 기반으로 한 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하지만 캐시를 플러시 때까지 메모리에, 그래서 시작 이미지는 때때로 매우 크다
이고르 Palaguta

9

@codeman의 답변이 Swift 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 (Landscape, Portrait)의 스플래시 이미지 이름을 가져 오는 일반적인 방법을 작성했습니다. 저에게 효과적이었습니다. Hope It도 도움이됩니다. 나는 다른 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;
}

[[UIScreen mainScreen] 경계] 이제 아이폰 OS 8에서 명시 적으로 같은 일을하고 세로 경계로 변환해야합니다에 어떤 방향에 따라 변경 : isDeviceiPhone4이 코드에 약간의 버그가 실제로있다 [screen.coordinateSpace convertRect:screen.bounds toCoordinateSpace:screen.fixedCoordinateSpace],하지만 메이크업은 먼저 iOS 8에 있는지 테스트하십시오. 그렇지 않으면 충돌이 발생합니다.
Mohamed Hafez 2014 년

지적 해 주신 @Hafez에게 감사드립니다. iOS 8에서 테스트하고 곧 답변을 업데이트하겠습니다.
는 Zaheer

7

Cherpak Evgeny의 답변의 신속한 버전 :

    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

@Pichirich의 답변에 따라 InterfaceBuilder의 launchimage를 다음과 같이 참조했습니다.

"LaunchImage.png"

... Xcode 5.0.2에서는 자산 카탈로그에서 바로 적절한 이미지를 자동으로 가져옵니다.

이것이 내가 기대했던 것입니다. 애플이 "Default.png"이름을 "LaunchImage.png"로 조용히 바꾸는 사악한 움직임을 제외하면 :)


한 가지 더 주목해야합니다. 애플은 (예를 들어 아이폰 OS 5-6 아이폰 3GS에 대한 LaunchImage에 대한 320 × 480)를 권장합니다 같은 이러한 이미지 '크기 그렇지 않으면이 될 정확히해야 nil후 초기화 주어진
알렉산더 Kostiev

3

에서 문서를 명확이 적혀있다 :

"자산 카탈로그의 각 세트에는 이름이 있습니다. 해당 이름사용 하여 세트에 포함 된 개별 이미지를 프로그래밍 방식으로로드 할 수 있습니다 . 이미지를로드하려면 UIImage : ImageNamed : 메소드를 호출 하여 이미지가 포함 된 세트의 이름을 전달하십시오. . "

Pichirichi의 ​​목록을 사용하면 이러한 불일치를 해결하는 데 도움이됩니다.


1
"세트 이름"부분에 유의하십시오. 내 자산 카탈로그를 보면 "LaunchImage"라는 세트가 있습니다. 시작 이미지를로드하기 위해 저는 다음과 같이 호출했습니다. 잘 UIImageView *myView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"LaunchImage"]];작동합니다!
leanne

1
Pichirichi의 ​​목록을 사용할 필요가 없습니다 (아직도 알아두면 좋은 정보입니다). 자산 카탈로그의 "세트"이름 만 사용하면됩니다.
leanne 2014-07-03

2
글쎄, 이것은 Xcode 6.0.1 및 iOS 8의 Launch Image에서 작동하지 않습니다. LaunchImage는 이미지가 컴파일 된 앱 번들에서 개별적으로 끝나고 xcasset 번들 폴더 안에 남아 있지 않기 때문에 특별 해 보입니다.
auco

동일한 이름의 세트를 포함하는 두 개의 서로 다른 자산 카탈로그가있는 경우 어떻게됩니까? [UIImage imageNamed:..]어느 것을 고를 지 어떻게 알 수 있습니까?
Carlos P

나를 위해 이것은 작동하지 않습니다, XCode 6.0.1 iOS 7 iPod Touch
dev

3

한 줄의 코드로 Launch 이미지에 쉽게 액세스 할 수 있습니다.

 UIImage *myAppsLaunchImage = [UIImage launchImage];

위에 설명 된 기능을 사용하려면 아래 단계를 따르십시오.

Step 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;
}

Step 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;
}

훌륭한 답변입니다, 감사합니다!
dortzur 2015

1
이제 iPhone X 실행 이미지의 이름은 무엇입니까?
RPM

2

이것이 모든 사람에게 반드시 최선의 해결책은 아니지만이를 수행하는 가장 쉬운 (그리고 오류 발생 가능성이 가장 적은 IMHO) 방법은 Images.xcassets 카탈로그에 별도의 항목을 만드는 것입니다. 나는 그것을 불렀다 SplashImage.

새 항목을 추가 할 때 "새 시작 이미지"를 옵션으로 선택 하지 않도록하십시오. 대신 일반 "새 이미지 세트"를 선택하십시오. 그런 다음 인스펙터를 열고 관련 옵션을 선택하십시오. 저처럼 레티 나 장치 전용으로 구축하는 경우 다음을 선택할 수 있습니다.

이미지 검사기

그러면 4 개의 항목 (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 이미지를로드합니다.
nonamelive

이 접근 방식을 사용하면 가로 방향에 대한 시작 이미지 세트에 대해서도주의해야합니다.
berec 2014


0

최신 Swift 구문으로 업데이트 됨 (Swift 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
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.