developer tip

사용 가능한 모든 iPhone 해상도에서 이미지 스케일을 처리하는 방법은 무엇입니까?

copycodes 2020. 8. 22. 09:06
반응형

사용 가능한 모든 iPhone 해상도에서 이미지 스케일을 처리하는 방법은 무엇입니까?


예를 들어 모든 해상도에서 화면의 전체 너비와 절반 높이를 덮기 위해이 이미지를 사용하려는 경우 background.png, background@2x.png 및 background@3x.png 이미지에 가장 적합한 크기는 무엇입니까? iPhone 세로 앱?

이것이 우리가 지금 가지고있는 것입니다 :

Device          Points    Pixels     Scale  Physical Pixels   Physical PPI  Size
iPhone X        812x375   2436x1125  3x     2436x1125         458           5.8"
iPhone 6 Plus   736x414   2208x1242  3x     1920x1080         401           5.5"
iPhone 6        667x375   1334x750   2x     1334x750          326           4.7"
iPhone 5        568x320   1136x640   2x     1136x640          326           4.0"
iPhone 4        480x320   960x640    2x     960x640           326           3.5"
iPhone 3GS      480x320   480x320    1x     480x320           163           3.5"

iPhone 해상도

어떤 사람들은 iPhone 6 Plus의 경우 가장자리에서 가장자리까지의 이미지 (화면의 왼쪽에서 오른쪽 가장자리까지의 배너와 같은)의 경우 너비가 1242 인 back@3x.png를 준비하고 iPhone 6의 경우 back@2x.png를 준비한다고 말합니다. 너비 750을 iPhone 6 화면 크기와 일치 시키려고하지만 1242/3 = 414 및 750/2 = 375이므로 @ 2x 및 @ 3x로 이름을 지정하는 것은 의미가 없기 때문에 이것이 좋은 생각이라고 생각하지 않습니다. 그리고 back.png-375 또는 414의 너비는 얼마입니까?

그래픽 이름은 @ 2x 및 @ 3x 접미사를 사용하므로 예를 들어 image@3x.png의 해상도가 30x30이면 논리적으로 image@2x.png의 해상도는 20x20이고 image.png는 10x10이어야합니다. 즉, 각 화면에 대해 선명한 전체 너비 이미지를 원하면 너비가 414 * 3 = 1242px 인 back@3x.png, 너비가 414 * 2 = 828px 인 back@2x.png, 너비 414px. 그러나 이것은 iPhone 6 Plus를 제외한 모든 iPhone에서 예를 들어 aspect fit 콘텐츠 모드를 사용하기 위해 uiimages를 설정해야하며 이러한 이미지가 호출 될 것이므로 이것은 다시 perferct 솔루션이 아니며 아마도 실제로 응용 프로그램을 느리게 할 것입니다. 우리는 구형 장치에서 많은 호출을 사용합니다.

그렇다면이 문제를 해결하기위한 최선의 해결책은 무엇이라고 생각하십니까?


사용하지 않을 경우 각 이미지를 모든 크기로 가질 필요는 없습니다. 필요한 크기 만 만들고 너비에 따라 이름을 지정합니다. 세로 전체 기기 너비 이미지의 경우 1x 및 2x에서 320px, 2x에서 375px, 3x에서 414px가 필요합니다.

4 "장치는 시작 이미지의 이름을 지정하는 데"-568h "접미사를 사용 했으므로 비슷한 이름 지정 체계를 권장합니다.

  • ImageName-320w (@ 1x 및 @ 2x)
  • ImageName-375w (@ 2x)
  • ImageName-414w (@ 3x)

그런 다음 런타임에 필요한 이미지를 파악합니다.

NSNumber *screenWidth = @([UIScreen mainScreen].bounds.size.width);
NSString *imageName = [NSString stringWithFormat:@"name-%@w", screenWidth];
UIImage *image = [UIImage imageNamed:imageName];

앞으로 다른 너비가 추가되면 깨질 수 있지만 지금까지 Apple은 항상 새로운 디스플레이를 지원하기 위해 앱을 다시 빌드해야했기 때문에 계속 그렇게 할 것이라고 가정하는 것이 다소 안전하다고 생각합니다.


나는 개인적으로 할 것이다 :

ImageName @ 2x iPhone 4 / 4s
ImageName-568h @ 2x iPhone 5 / 5s
ImageName-667h @ 2x iPhone 6
ImageName-736h @ 3x iPhone 6Plus

이것의 논리는 모든 장치 간의 차이를 보여주는 반면 너비는 iPhone 5s 및 iPhone 4s에서 동일한 값을 공유한다는 것입니다.

편집하다:

이것은 전체 화면을 차지하는 배경 이미지와 같이 장치에 따라 달라지는 리소스에 사용하는 명명 규칙입니다. 대부분의 경우 원하는 것은 다음과 같습니다.

ImageName @ 2x iPhone 4 / 4s / 5 / 5s / 6
ImageName @ 3x iPhone 6Plus / 줌 모드


@ 2x 및 @ 3x 토론의 경우 실제로 신경 쓸 필요가 없습니다. 화면의 포인트 크기에 신경을 쓰고 포인트 크기가 두 배인 @ 2x 애셋과 픽셀 단위로 포인트 크기가 세 배인 @ 3x 애셋이 있는지 확인합니다. 장치가 자동으로 올바른 것을 선택합니다. 그러나 귀하의 게시물을 읽고 나는 이미 이것을 알고 있다고 생각합니다.

For edge-to-edge images, then unfortunately you have to make it for all screen resolutions. So, for a portrait iPhone, it would be 320 points, 375 points and 414 points, where the 414 points one would have to be @3x. A better solution may be to make your images scalable by setting up the slicing in interface builder (if you use image catalogs, that is). But, depending on the image this may or may not be an option, depending whether the image has a repeatable or stretchable part. Scalable images set up like this have very little performance impact.


the @2 and @3 is not the real image scaling, but only represent how much real pixel represent one virtual pixel on screen, some sort of hdpi/xhdpi/xxhdpi/blabla from android universe. it only show to system what image should be used for some device screen.

so if you need to use whole screen image - prepare it dependently of real screen size.


Depending on the graphics in some cases it might work fine when we use just a single image for example a banner with size 414 points width x 100 points height (largest possible width and some fixed height) and put it in a UIImageView that is pinned to the left and right edge of the screen, has fixed height 100 and set aspect fill mode for that UIImageView. Then on smaller devices left and right side of the image will be cut and we will see only the center part of the image.


I've created category for this:

+ (UIImage *)sizedImageWithName:(NSString *)name {
    UIImage *image;
    if (IS_IPHONE_5) {
        image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-568h",name]];
        if (!image) {
            image = [UIImage imageNamed:name];
        }
    }
    else if (IS_IPHONE_6) {
        image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-750w",name]];
    }
    else {
        image = [UIImage imageNamed:name];
    }
    return image;
}

you can take full code here: https://gist.github.com/YGeorge/e0a7fbb479f572b64ba5


I think the best solution for edge to edge or full screen images, is to care about the real screen size in pixel (not in point), and you must check at runtime the model of the device and choose the appropriate image i.e:

image-iphone4-4s.png (640x960/2) for 1/2 screen height, image-iphone5-5c-5s.png (640x1136/2) for 1/2 screen height, image-iphone6-6s.png (750x1334/2) for 1/2 screen height, image-iphone6plus-6splus.png (1242x2208/2) for 1/2 screen height,

there is no need for @?x in this situation of the asker.


i think we should use different size of background images for different devices. Just use @3x scale images for background.

You can detect device with below lines.

#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)

#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))

#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0) 

I personally will be doing :

ImageName@2x iPhone 4/4s
ImageName-568h@2x iPhone 5/5s
ImageName-667h@2x iPhone 6
ImageName-736h@3x iPhone 6Plus

The logic behind this is that it shows a difference between all devices, whereas width shares the same value on the iPhone 5s and iPhone 4s.

This is just the naming convention I am using for resources that are device dependant, such as a background image taking the whole screen, most of the time all you want is:

ImageName@2x iPhone 4/4s/5/5s/6
ImageName@3x iPhone 6Plus/Zoom mode

참고 URL : https://stackoverflow.com/questions/25969533/how-to-handle-image-scale-on-all-the-available-iphone-resolutions

반응형