2012-11-15 101 views
3

我有這樣的代碼可以在iPad2上完美工作,但它在Retina iPad上的尺寸錯誤。convertRect:toView:在iPad視網膜和iPad上的工作方式不同

我執行的應用程序沒有改變兩個iPad和行爲是完全不同的。 在Retina iPad上,圖像回到原始位置,變形不會發生。

該代碼需要一組視圖,將它們添加到臨時視圖,調整臨時視圖的大小並將它們添加回來,以便我可以同時調整它們的大小。

- (IBAction)scaleParts:(UIPinchGestureRecognizer *)sender { 
if (sender.state == UIGestureRecognizerStateBegan) { 
    self.tempCanvasView = [[UIView alloc] initWithFrame:self.canvas.bounds]; 
    self.tempCanvasView.backgroundColor = [UIColor redColor]; 
    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; 
} 
} 

回答

0

也許你需要檢測應用程序正在使用哪種屏幕類型(scale = 1 for iPad和2 for iPadRetina)。

CGFloat scale = [[UIScreen mainScreen] scale]; 

後..

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

這裏是做一個正確的方法:

SWIFT:

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 
     } 
    } 
} 
相關問題