Я согласен с Yun CHEN, так как я думаю, что наиболее надежное решение — иметь набор изображений для каждого разрешения, что позволяет избежать масштабирования изображения, выполняемого на устройстве.
Также правильно, что на основе коэффициента рендеринга (2x, 3x и т. д.) устройства (например, 2x на 4,7-дюймовых iPhone, как iPhone 8) вам нужно только поместить изображение соответствующего размера в соответствующий Например, для наборов изображений для iPhone 8 требуется только изображение 2x.
Однако имейте в виду следующее:
UIScreen.main.bounds.height возвращает высоту логического разрешения, т. е. точек, в отличие от UIScreen.main.nativeBounds.height, который возвращает высоту фактическое разрешение, т.е. пиксели (на самом деле, UIScreen.main.nativeBounds.height всегда возвращает высоту пикселя устройства в портретном режиме, даже если вы находитесь в ландшафтном режиме). Всегда следует использовать изображения, соответствующие фактическому разрешению, т. е. пикселям, даже если вы проверяете точки.
Начиная с iOS 8 и более поздних версий UIScreen.main.bounds.height будет возвращать разные значения, независимо от того, находится ли ваше устройство в портретном или ландшафтном режиме. Поэтому, если вы хотите использовать его для различения устройств, вы должны проверить все значения, которые может использовать ваше приложение, и у вас должен быть отдельный набор изображений для каждого.
Например, для приложений, которые работают как в портретном, так и в альбомном режимах:
var backgroundImageName = ""
if UIDevice().userInterfaceIdiom == .phone
{
switch UIScreen.main.bounds.height
{
case 812: // 5.8" (iPhone X) (3x) (Portrait)
backgroundImageName = "background_1125x2436"
case 736: // 5.5" (iPhone 8+, 7+, 6s+, 6+) (3x) (Portrait)
backgroundImageName = "background_1242x2208"
case 414: // 5.5" (iPhone 8+, 7+, 6s+, 6+) (3x) (Landscape)
backgroundImageName = "background_2208x1242"
case 667: // 4.7" (iPhone 8, 7, 6s, 6) (2x) (Portrait)
backgroundImageName = "background_750x1334"
case 375:
// 5.8" (iPhone X) (3x) (Landscape)
if (UIScreen.main.bounds.width == 812) {
backgroundImageName = "background_2436x1125"
}
// 4.7" (iPhone 8, 7, 6s, 6) (2x) (Landscape)
else if (UIScreen.main.bounds.width == 667) {
backgroundImageName = "background_1334x750"
}
case 568: // 4.0" (iPhone SE, 5s, 5c, 5) (2x) (Portrait)
backgroundImageName = "background_640x1136"
case 320: // 4.0" (iPhone SE, 5s, 5c, 5) (2x) (Landscape)
backgroundImageName = "background_1136x640"
default:
break
}
}
else if UIDevice().userInterfaceIdiom == .pad
{
switch UIScreen.main.bounds.height
{
case 1366: // 12.9" (iPad Pro 12.9) (2x) (Portrait)
backgroundImageName = "background_2048x2732"
case 1112: // 10.5" (iPad Pro 10.5) (2x) (Portrait)
backgroundImageName = "background_1668x2224"
case 834: // 10.5" (iPad Pro 10.5) (2x) (Landscape)
backgroundImageName = "background_2224x1668"
case 1024:
// 12.9" (iPad Pro 12.9) (2x) (Landscape)
if (UIScreen.main.bounds.width == 1366) {
backgroundImageName = "background_2732x2048"
}
// 9.7" & 7.9" (iPad Pro 9.7, iPad Air 2, iPad Air, iPad 4, iPad 3, iPad Mini 4, iPad Mini 3, iPad Mini 2) (2x) (Portrait)
else if (UIScreen.main.bounds.width == 1366) {
backgroundImageName = "background_1536x2048"
}
case 768: // 9.7" & 7.9" (iPad Pro 9.7, iPad Air 2, iPad Air, iPad 4, iPad 3, iPad Mini 4, iPad Mini 3, iPad Mini 2) (2x) (Landscape)
backgroundImageName = "background_2048x1536"
default:
break
}
}
self.backgroundImageView.image = UIImage(named: backgroundImageName)
и так далее, если необходимо включить другие устройства (например, Apple Watch).
person
Martin
schedule
07.03.2018