2014-09-24 3 views
1

У меня есть прецедент, который, кажется, попадает в трещины между каталогами активов и классами размеров. Моему универсальному приложению требуется полноэкранное фоновое изображение, которое отличается в ориентации на пейзаж и портрет, а 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 
    } 

} 

Это работает, но кажется хрупким. Есть ли более правильный способ идентифицировать устройство как нечто, поддерживающее обычный размерный класс в ландшафте, до того, как он действительно находится в ландшафтном режиме? Или каким-то образом, что я пропустил, чтобы указать эквиваленты ландшафта для набора изображений?

ответ

0

Вы можете использовать классы размеров в каталоге активов или у вас могут быть два набора изображений: один для портретного и один для режима ландшафта. Затем вы можете получить доступ к изображениям по названию актива. Это немного уменьшит ваш код. Но я бы порекомендовал, чтобы везде, где это возможно, использовали классы размера.

+0

Спасибо, Виталий ... Фактически, я удалил большую часть кода после просмотра WWDC14, посвященного коллекциям черт (Building Adaptive Apps With UIKit). UIImage распознает эти дополнительные классы размера в наборе изображений и автоматически настраивается по мере изменения коллекции признаков. Я установил свойство Width в ресурсе изображения Any + Regular и добавил несколько пейзажных изображений, и все. –

+0

Итак, нет способа добавить ландшафтные изображения в каталог активов для нового набора изображений? – arh

+2

@arh Извините за поздний ответ. Вы можете добавлять разные изображения для разных классов размеров. Итак, если ваши ландшафтные и портретные режимы имеют разные классы размеров, вы получите разные изображения, но когда пейзажные и портретные режимы используют одинаковые классы размера (например, на iPad), вы не сможете использовать разные изображения для таких режимов, используя классы размера. Если вам действительно нужно использовать разные изображения для пейзажных и портретных режимов, вам нужно подумать об использовании разных наборов изображений для таких режимов или вообще не использовать наборы изображений для таких изображений. – Vitaly

0

Так что окончательное решение было:

-Установить Ширин объект на активе изображения по любому + Регулярным и добавили пару ландшафтных изображений для iPhone 6+ и IPad, и UIImage автоматически делает

остального

-A более элегантный способ, чтобы обеспечить вращение только для этих двух устройств, в оба прошивке 7 & IOS 8:

override func shouldAutorotate() -> Bool { 
    let scale = UIScreen.mainScreen().scale 
    let idiom = UIDevice.currentDevice().userInterfaceIdiom 
    return ((idiom == .Pad) || (scale > 2.0)) ? true : false 
} 

Таким образом, все вышеперечисленные до 5 строк коды!

+0

Увы, не идеальное решение в конце концов; похоже, поддержка коллекции изображений UIImage не может отличить iPad от ландшафтного и портретного режима; скриншоты симулятора показывают, что ландшафтное изображение используется для iOS 8 в обеих ориентациях, а портретное изображение для iOS 7!?! –

Смежные вопросы