Al momento sto creando alcune transizioni e trasformo tramite CGAffineTransform
per una panoramica panoramica e sono in esecuzione nei guai a causa delle prestazioni di trasformazione sotto iOS 7
e iPhone 4
.Le prestazioni di CGAffineTransforms sono molto lente su iOS 7
Mi sono tuffato in Istrument e ho registrato la roba e il sollevamento pesante è stato fatto quando ho applicato le mie trasformazioni alla vista.
implementazione corrente
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
}
}
}
Soluzione per 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
}
}
}
Domanda
Perché le prestazioni così male su iOS 7 e il mio iPhone 4 con CGAffineTransforms
? Perché sta facendo la stessa cosa con l'offset, quindi l'impostazione del frame nella soluzione alternativa. Quando uso lo UIView.animateWithDuration()
con la trasformazione, si sta eseguendo su 60fps. Cosa posso fare per non riscrivere l'intera implementazione sulla base di iOS 7?
UPDATE 28 luglio Scoperto che AutoLayout è possibile partecipare a questo problema. Ecco un TimeProfiler Pila dalle mie chiamate correnti:
Ora sto di fronte a un grosso problema nel mio attuale implementazione, perché mi baso su layout automatico. Qual è la soluzione più semplice per risolvere questo problema su iOS 7?
'viewWithTransform.translate =' qualcosa di personalizzato o si suppone che sia 'viewWithTransform.transform ='? Stai (intenzionalmente o meno intenzionalmente) usando Auto Layout? Stai profilando usando build di rilascio? –