Im Moment bin ich einige Übergänge erstellen und transformieren über CGAffineTransform
für eine Schwenkansicht und ich laufe in Schwierigkeiten wegen der Transformationsleistung unter iOS 7
und iPhone 4
.CGAffineTransforms Leistung ist wirklich langsam auf iOS 7
Ich tauchte in Istruments und protokollierte das Zeug und das schwere Heben ist getan, wenn ich meine Transformationen auf die Ansicht anwende.
aktuelle Implementierung
func handlePan(recognizer : UIPanGestureRecognizer) {
let drawerLocation = recognizer.locationInView(drawerView!)
let locationInView = recognizer.locationInView(containerView!)
let progressMax = containerView!.frame.height - 40 - 20
if(recognizer.state == .Changed) {
let offsetDrag = dragStartPosition.y - locationInView.y
let progress = Float(offsetDrag/progressMax)
if(offsetDrag >= 0) {
let positionTransform = CGAffineTransformMakeTranslation(0, -((containerView!.bounds.height - 40 - 20) * CGFloat(normalizedProgress)))
viewWithTransform.transform = positionTransform // really bad performance here
} else {
// reset the transition
}
}
}
Abhilfe für iOS 7
func handlePan(recognizer : UIPanGestureRecognizer) {
let drawerLocation = recognizer.locationInView(drawerView!)
let locationInView = recognizer.locationInView(containerView!)
let progressMax = containerView!.frame.height - 40 - 20
if(recognizer.state == .Changed) {
let offsetDrag = dragStartPosition.y - locationInView.y
let progress = Float(offsetDrag/progressMax)
if(offsetDrag >= 0) {
if UIDevice.currentDevice().systemMajorVersion() > 7 {
let positionTransform = CGAffineTransformMakeTranslation(0, -((containerView!.bounds.height - 40 - 20) * CGFloat(progress)))
viewWithTransform.transform = positionTransform // really bad performance here
} else {
viewWithTransform.frame = CGRectMake(0, -((containerView!.bounds.height - 40 - 20) * CGFloat(progress)), drawerView!.frame.size.width, drawerView!.frame.size.height); // works like a charm on iOS 7
}
} else {
// reset the transition
}
}
}
Frage
Warum ist die Leistung so schlecht auf iOS 7 und mein iPhone 4 mit CGAffineTransforms
? Weil es die gleiche Sache mit dem Offset tut, dann die Rahmeneinstellung in der Problemumgehung. Wenn ich UIView.animateWithDuration()
mit transformiere, läuft es auf 60fps. Was kann ich nicht tun, um die gesamte Implementierung auf meiner iOS 7-Basis neu zu schreiben?
UPDATE 28. Juli herausgefunden, dass AutoLayout möglicherweise in diesem Problem beteiligt ist. Hier ist ein TimeProfiler Stapel von meinen aktuellen Anrufen:
Jetzt bin ich ein großes Problem in meiner aktuellen Implementierung konfrontiert, weil ich auf Automatisches Layout verlassen. Was ist die einfachste Lösung, um dieses Problem auf iOS 7 zu lösen?
Ist 'viewWithTransform.translate =' etwas Brauchbares oder soll es 'viewWithTransform.transform =' sein? Verwenden Sie (absichtlich oder unabsichtlich) Auto Layout? Profilieren Sie mit Release-Builds? –