У меня есть прецедент, который, кажется, попадает в трещины между каталогами активов и классами размеров. Моему универсальному приложению требуется полноэкранное фоновое изображение, которое отличается в ориентации на пейзаж и портрет, а Landscape поддерживается только для iPad. & iPhone 6.Пейзаж против портрета фонового изображения в каталоге активов
Поскольку я не могу добавить ландшафтные изображения в каталог активов для нового изображения набор, мое текущее решение выглядит следующим образом (поддерживает IOS 7 & 8):
// permit landscape mode only for iPads & iPhone 6 (would prefer to use size classes, but...?)
override func shouldAutorotate() -> Bool {
let size = view.frame.size
let maxv = max(size.width, size.height)
return ((maxv > 700.0) || (maxv == 512.0)) ? true : false
}
// this will be triggered only for iOS 7, as long as viewWillTransitionToSize:withTransitionCoordinator: is also implemented!
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
adjustToOrientation(toInterfaceOrientation)
}
// this will be triggered only for iOS 8
override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
let orientation = UIApplication.sharedApplication().statusBarOrientation
// need to reverse the sense of the orientation here; Application still has the previous orientation
switch orientation {
case .Portrait, .PortraitUpsideDown:
adjustToOrientation(.LandscapeLeft)
case .LandscapeLeft, .LandscapeRight:
adjustToOrientation(.Portrait)
default:
adjustToOrientation(.Portrait)
}
}
func adjustToOrientation(newInterfaceOrientation: UIInterfaceOrientation) {
let size = view.frame.size
// rotation already permitted only for iPad & iPhone 6, but need to know which one (size classes useless here?)
switch (max(size.width, size.height)) {
case 1024.0:
if UIInterfaceOrientationIsLandscape(newInterfaceOrientation) {
backgroundImage.image = UIImage(named: "[email protected]~ipad.png")
} else {
backgroundImage.image = UIImage(named: "[email protected]~ipad.png")
}
case 736.0:
if UIInterfaceOrientationIsLandscape(newInterfaceOrientation) {
backgroundImage.image = UIImage(named: "[email protected]~iphone.png")
} else {
backgroundImage.image = UIImage(named: "[email protected]~iphone.png")
}
case 512.0:
if UIInterfaceOrientationIsLandscape(newInterfaceOrientation) {
backgroundImage.image = UIImage(named: "Background-Landscape~ipad.png")
} else {
backgroundImage.image = UIImage(named: "Background~ipad.png")
}
default:
break
}
}
Это работает, но кажется хрупким. Есть ли более правильный способ идентифицировать устройство как нечто, поддерживающее обычный размерный класс в ландшафте, до того, как он действительно находится в ландшафтном режиме? Или каким-то образом, что я пропустил, чтобы указать эквиваленты ландшафта для набора изображений?
Спасибо, Виталий ... Фактически, я удалил большую часть кода после просмотра WWDC14, посвященного коллекциям черт (Building Adaptive Apps With UIKit). UIImage распознает эти дополнительные классы размера в наборе изображений и автоматически настраивается по мере изменения коллекции признаков. Я установил свойство Width в ресурсе изображения Any + Regular и добавил несколько пейзажных изображений, и все. –
Итак, нет способа добавить ландшафтные изображения в каталог активов для нового набора изображений? – arh
@arh Извините за поздний ответ. Вы можете добавлять разные изображения для разных классов размеров. Итак, если ваши ландшафтные и портретные режимы имеют разные классы размеров, вы получите разные изображения, но когда пейзажные и портретные режимы используют одинаковые классы размера (например, на iPad), вы не сможете использовать разные изображения для таких режимов, используя классы размера. Если вам действительно нужно использовать разные изображения для пейзажных и портретных режимов, вам нужно подумать об использовании разных наборов изображений для таких режимов или вообще не использовать наборы изображений для таких изображений. – Vitaly