web-dev-qa-db-fra.com

iOS différentes contraintes pour différents appareils

J'ai un ViewController conçu pour iPhone SE

 enter image description here

Comme vous pouvez le constater, j'ai aussi une contrainte Align Top to: Safe Area Equals 75

La question est, est-il possible de changer cette valeur pour iPhone 8 et iPhone 8 Plus? Par exemple:

  • SE = 75 
  • 8 = 85 
  • 8 plus = 105
6
xskit

nous étions confrontés à un problème similaire. Nous avons résolu avec la classe d'assistance appelée scaled. Ce qui fondamentalement ne fait que multiplier la taille de quelque chose, ce qui devrait paraître plus gros sur un appareil plus grand.

extension CGFloat {
    public var scaled: CGFloat {
        switch UIDevice.type.getResolutionGroup()! {
        case .lr320x568:
            return self
        case .lr375x667:
            return self * 1.1
        case .lr414x736:
            return self * 1.2
        case .lr768x1024:
            return self * 1.3
        // For iPads
        case .lr1024x1366:
            return self * 1.3
        }
    }
}

Et mise en place du groupe de résolution

public func getResolutionGroup() -> ResolutionGroup? {
        switch self {
        case .iPhone5, .iPhone5C, .iPhone5S, .iPhoneSE, .iPodTouch5, .iPodTouch6:
            return .lr320x568
        case .iPhone6, .iPhone6S, .iPhone7:
            return .lr375x667
        case .iPhone6Plus, .iPhone6SPlus, .iPhone7Plus:
            return .lr414x736
        case .iPadMini, .iPadMini2, .iPadMini3, .iPadMini4:
            return .lr768x1024
        case .iPad2, .iPad3, .iPad4, .iPadAir, .iPadAir2:
            return .lr768x1024
        case .iPadPro:
            return .lr1024x1366
        case .simulator:
            return isiPhone() ? .lr320x568 : .lr768x1024
        default:
            return .lr320x568
        }
    }

Et l'utilisation dans l'application

fileprivate let footerHeight = CGFloat(180).scaled
3
Jakub Průša

Ne pas utiliser Interface Builder, no. Contraintes, vous ne pouvez cibler que les tailles Compacte, Normale ou N'importe quelle taille et tous les modèles d'iPhone ont une largeur et une hauteur régulières en mode Portrait.

Si vous voulez ce type de granularité, vous devez plutôt le faire avec du code.

6
andlin

Ceci n'est pas applicable dans IB, vous pouvez essayer dans le code en associant la contrainte supérieure de la vue en tant qu'IBOutlet et dans viewDidLayoutSubviews

override func viewDidLayoutSubviews()
{

   if(deviceWidthSE)
   {      
      self.viewTopCon.constant = 75
   }
   else
   if(deviceWidth8)
   {
      self.viewTopCon.constant = 85
   }
   else
   if(deviceWidth8Plus)
   {
      self.viewTopCon.constant = 105
   }

}
1
Sh_Khan