Используйте разные разрешения изображений для разных устройств iOS

У меня есть изображение, которое я хотел бы отобразить в своем приложении для iOS. Для экономии памяти я хотел бы отображать минимально возможное разрешение, которое по-прежнему соответствует количеству физических пикселей на устройстве.

Например, может отображаться в виде квадрата размером 1/4 высоты устройства. Таким образом, размеры будут следующими

iPhone 4s        240 x 240 пикс.

iPhone 5/5s     284 x 284 пикс.

iPhone 6          334 x 334 пикс.

iPhone 6+        480 x 480 пикс.

Я просматривал каталоги активов, но не вижу способа создать другое изображение для iPhone 4s, iPhone 5/5s и iPhone 6 (они @2x). Разница только в iPhone 6+ (@3x).

Я также пытался добавить опцию Retina 4 2x, но это дало только другой значок для iPhone 5/5s — по-прежнему невозможно различить 4s и 6.

введите здесь описание изображения

Я понимаю, что я мог бы выбрать изображение программно на основе устройства, но каталоги ресурсов загружают только необходимые изображения на устройство пользователя (не уверен, что это правда, хотя я помню, что кое-что об этом читал), что позволяет приложению меньше занимать место хранения. Было бы неэффективно включать четыре изображения, если будет использоваться только одно.

Есть ли способ использовать другое разрешение изображения для каждого устройства iOS с разным количеством физических пикселей?

Обратите внимание, что я не спрашиваю о масштабировании изображения, а о том, чтобы использовать правильное разрешение (разное изображение для каждого устройства), поэтому при его использовании будет занимать меньше оперативной памяти. отображается.


person Jojodmo    schedule 10.09.2015    source источник
comment
Downvoter, не могли бы вы объяснить, почему этот вопрос не очень хорош?   -  person Jojodmo    schedule 11.09.2015


Ответы (2)


В итоге я просто создал разные файлы для каждого устройства и назвал их imageName@size, поэтому для изображения собаки 128x128 файл будет называться dog@128.

Вот код, который я использовал для этого

func getPNGImageForSize(size: Float, named: String) -> UIImage?{
    //the image size will be measured in points, which is the unit that is used
    //when setting the frames of UIViews. To turn this into pixels, it must be
    //multiplied by the screen's render scale (on an iPhone 6+, 1 point is equal
    //to 3 pixels, or 9 pixels in 2 dimensions (3^2).
    let scaled: Int = Int(ceil(size * Float(UIScreen.mainScreen().scale))
    let imageName: String = "\(named)@\(scaled)"

    //ofType set to png, because this image is a PNG
    let path = NSBundle.mainBundle().pathForResource(imageName, ofType: "png")

    return UIImage(contentsOfFile: (path ?? ""))
}

И чтобы назвать это, я просто использую

getPNGImageForSize(Float(self.view.frame.height / 4), named: "dog")

что приведет к следующим изображениям, в зависимости от устройства

iPhone 4s           [email protected]

iPhone 5/5s        [email protected]

iPhone 6             [email protected]

iPhone 6+           [email protected]

Это также можно изменить для работы с неквадратными изображениями с именем imageName@width-height.

func getPNGImageForSize(width: Float, height: Float, named: String) -> UIImage?{  
    let scaledWidth: Int = Int(ceil(width * Float(UIScreen.mainScreen().scale))
    let scaledHeight: Int = Int(ceil(height * Float(UIScreen.mainScreen().scale))
    let imageName: String = "\(named)@\(width)-\(height)"

    let path = NSBundle.mainBundle().pathForResource(imageName, ofType: "png")

    return UIImage(contentsOfFile: (path ?? ""))
}
person Jojodmo    schedule 14.09.2015

Вам нужно настроить изображение в соответствии с тем, как оно может выглядеть на iPhone6+, который будет использовать изображения @3x, затем уменьшить размер изображения @2x, который будет использоваться устройствами iPhone4S и iPhone6, а затем дополнительно масштабировать изображение до @1x. которые используются в более ранних версиях устройств iPad.

Создайте 3 разных изображения с 3 масштабами @1x @2x и @3x.

есть только 3, старые iPhone - 3S, 4, iPad без сетчатки потребляют изображения @1x, тогда как iPad Air, iPad retina, iPhone 4S - iPhone 6 использует @2x, а iPhone 6+ использует @3x К вашему сведению, я уже отвечал на этот вопрос раньше вот ссылка

Здесь еще один хороший блог о масштабировании изображений на устройствах IOS (все они)

РЕДАКТИРОВАТЬ

и об устранении ваших сомнений по поводу того, почему iPhone 5 и 6 используют изображения @2x. Что ж, iPhone5 использует то же изображение, что и для iPhone6, то есть изображения @2x, несмотря на высоту, поскольку iPhone5 масштабирует @2x до своего предела, поэтому об этом не о чем беспокоиться. Xcode позаботится об этом достаточно эффективно.

person Saheb Roy    schedule 10.09.2015
comment
Это не отвечает на вопрос, как сделать разные изображения для КАЖДОГО устройства iOS. - person Jojodmo; 10.09.2015
comment
отредактировали ответ, если он все еще вас смущает, то, пожалуйста, прокомментируйте, будем рады устранить путаницу - person Saheb Roy; 10.09.2015
comment
Тем не менее, есть только 3 варианта (один из которых только для старых айфонов, так что на самом деле 2) мест для хранения изображений - чтобы иметь разные изображения для каждого устройства, их должно быть 4, потому что, хотя некоторые устройства имеют одинаковые коэффициент масштабирования, каждое устройство имеет разное количество пикселей - person Jojodmo; 10.09.2015
comment
С этим ничего не поделать, если вы хотите использовать ресурсы изображения, вы должны позволить xcode выбрать устройство и выбрать правильное изображение для вас. ИЛИ вы можете выбрать отдельные раскадровки, чтобы загрузить каждую раскадровку с каждым уникальным набором изображений для разных устройств. Я еще раз отредактировал ответ для вашего понимания. - person Saheb Roy; 10.09.2015
comment
именно - суть вопроса в том, как это обойти - person Jojodmo; 10.09.2015