Echelle de transformation affine mise à l'échelle différemment sur iOS7 et iOS8 / iOS9 dans Swift

J'utilise des transformations affines d'échelle dans Swift et j'ai remarqué que CGAffineTransformMakeScale ne fonctionne pas de la même manière sur toutes les versions d'iOS. Pour démontrer les différences, j'ai créé un nouveau projet Xcode 7, mis en place trois boîtes de test sur le Storyboard Xcode fonctionnant sur un appareil iOS7, un simulateur iOS8 et un simulateur iOS9.

Case A – n'a aucune contrainte appliquée et est positionnée au centre du dessus du Storyboard

Case B – a une hauteur et une largeur définies avec les contraintes d'alignment central horizontal et vertical.

Encadré C – la hauteur et la largeur sont définies en même time que les contraintes d'alignment du bas et du centre horizontal.

Les boîtes sont ensuite redimensionnées à 0,5 en utilisant le code ci-dessous.

Remarque: les zones roses ne sont pas des boîtes ou des conteneurs, mais sont utilisées pour mettre en évidence la position des cases bleues après une transformation affine d'échelle.

Résultats:

iOS7 il y a des problèmes – alors que toutes les boîtes réduisent de moitié leur taille, deux boîtes, A et C, ne restnt pas cinputs en place.

iOS8 / iOS9 fonctionne comme prévu – toutes les boîtes réduisent de moitié leur taille et restnt cinputs en place, que des contraintes soient appliquées ou non.

Des questions:

Quelle est la cause de ce problème et comment peut-il être le mieux corrigé et résolu de sorte que toutes les versions iOS7 / 8/9 fonctionnent de manière identique?


CGAffineTransformMakeScale sur iOS7 – ne change pas comme prévu 🙁

entrez la description de l'image ici

CGAffineTransformMakeScale sur iOS8 / iOS9 – évolue comme prévu 🙂

entrez la description de l'image ici


Code:

 import UIKit class ViewController: UIViewController { @IBOutlet weak var ButtonA: UIButton! @IBOutlet weak var ButtonB: UIButton! @IBOutlet weak var ButtonC: UIButton! @IBAction func ButtonScale(sender: AnyObject) { self.ButtonA.transform = CGAffineTransformMakeScale(0.5, 0.5) self.ButtonB.transform = CGAffineTransformMakeScale(0.5, 0.5) self.ButtonC.transform = CGAffineTransformMakeScale(0.5, 0.5) } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } 

Ceci est décrit par Constraints & transformations – Comment Auto Layout est devenu tranquillement transform-friendly dans iOS 8 .

Fondamentalement, dans iOS7 et plus, vous ne devez pas définir des contraintes sur les valeurs qui sont sur les côtés d'une transformation.