convertRect: toView: funciona diferente en iPad retina y iPad 2

Tengo este código que funciona perfectamente en un iPad2, pero se escala mal en un iPad Retina.

Ejecuté la aplicación sin cambios en ambos iPads y el comportamiento es totalmente diferente. En el iPad Retina, las imágenes vuelven a su position original y la transformación no tiene lugar.

El código toma un grupo de vistas, las agrega a una vista temporal, cambia el tamaño de la vista temporal y las vuelve a agregar, por lo que puedo cambiar el tamaño de todas ellas al mismo time.

- (IBAction)scaleParts:(UIPinchGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateBegan) { self.tempCanvasView = [[UIView alloc] initWithFrame:self.canvas.bounds]; self.tempCanvasView.backgroundColor = [UIColor networkingColor]; for (UIView *view in [self.canvas subviews]) { CGRect currentFrame = view.bounds; CGRect newFrame = [view convertRect:currentFrame toView:self.tempCanvasView]; view.bounds = newFrame; [self.tempCanvasView addSubview:view]; } [self.canvas addSubview:self.tempCanvasView]; } else if (sender.state == UIGestureRecognizerStateChanged) { self.tempCanvasView.transform = CGAffineTransformScale(self.tempCanvasView.transform, sender.scale, sender.scale); sender.scale = 1.0; } else if (sender.state == UIGestureRecognizerStateEnded) { for (UIView *view in [self.tempCanvasView subviews]) { CGRect currentFrame = view.bounds; CGRect newFrame = [view convertRect:currentFrame toView:self.canvas]; view.frame = newFrame; [self.canvas addSubview:view]; } [self.tempCanvasView removeFromSuperview]; self.tempCanvasView = nil; } } 

Tal vez necesite detectar qué tipo de pantalla está usando la aplicación (escala = 1 para iPad y 2 para iPadRetina).

 CGFloat scale = [[UIScreen mainScreen] scale]; 

después de esto..

  if (scale==1) { //code from above } else { //code from above with small modification } 

Aquí hay un método correcto para hacerlo:

RÁPIDO:

 extension UIView { func convertRectCorrectly(rect: CGRect, toView view: UIView) -> CGRect { if UIScreen.mainScreen().scale == 1 { return self.convertRect(rect, toView: view) } else if self == view { return rect } else { var rectInParent = self.convertRect(rect, toView: self.superview) rectInParent.origin.x /= UIScreen.mainScreen().scale rectInParent.origin.y /= UIScreen.mainScreen().scale let superViewRect = self.superview!.convertRectCorrectly(self.superview!.frame, toView: view) rectInParent.origin.x += superViewRect.origin.x rectInParent.origin.y += superViewRect.origin.y return rectInParent } } }