2012-05-10 32 views
1

我想縮放上下文基於捏和進出的繪圖。這是完美的工作,但它會始終從原點放大(左上角)。這不會給你在其他應用程序中獲得的好效果,而且真的很煩人。舊的縮放方法如下:使用縮放但不使用變換方法縮放

- (IBAction)handlePinchGesture:(UIGestureRecognizer *)sender { 
    UIPinchGestureRecognizer *pinch = (UIPinchGestureRecognizer *)sender; 

    if ([pinch scale] > zoomLevel + MAX_ZOOM_PER_CALL) { 
     [pinch setScale: zoomLevel + MAX_ZOOM_PER_CALL]; 
    } 

    if ([pinch scale] < zoomLevel - MAX_ZOOM_PER_CALL) { 
     [pinch setScale:zoomLevel - MAX_ZOOM_PER_CALL]; 
    } 

    float prevZoomLevel = zoomLevel; 
    CGFloat factor = [pinch scale]; 
    zoomLevel = factor; 

    if (zoomLevel < MIN_ZOOM_LEVEL) { 
     zoomLevel = MIN_ZOOM_LEVEL; 
    } 

    if (zoomLevel > MAX_ZOOM_LEVEL) { 
     zoomLevel = MAX_ZOOM_LEVEL; 
    } 

    //The next piece of code is added here 

    [self setNeedsDisplay]; 
} 

實際縮放是在上下文中顯示的零件的繪製方法中完成的。我正在考慮改變屏幕的原點(即要繪製的項目的相對原點),以便模擬這一點。但它不工作,這就是我現在所擁有的:

float dZoomLevel = zoomLevel - prevZoomLevel; 

if (dZoomLevel != 0) { 
    CGPoint touchLocation = [pinch locationInView:self]; 
    CGPoint zoomedTouchLocation = CGPointMake(touchLocation.x * prevZoomLevel, touchLocation.y * prevZoomLevel); 
    CGPoint newLocation = CGPointMake(touchLocation.x * zoomLevel, touchLocation.y * zoomLevel); 

    float dX = (newLocation.x - zoomedTouchLocation.x); 
    float dY = (newLocation.y - zoomedTouchLocation.y); 

    _originX += roundf(dX); 
    _originY += roundf(dY); 
} 

原點是從XML(所有元素的最小x和y)拍攝。它通常會介於12000和20000之間,但理論上可能介於0和100000之間。

我不確定自己是否清楚自己,但如果您需要任何信息或不明白某些事情,只需詢問我和我會嘗試儘快回覆。提前致謝!

+0

你有使用手勢的原因,而不僅僅是使用scrollview縮放嗎? – Jaybit

+0

沒有滾動視圖,繪圖繪製在視圖(CGContextRef)上。 – Manuel

+0

您是否在縮放視圖(我正在閱讀的內容)方面遇到問題,或者您在縮放到觸摸位置時出現問題(附帶的代碼是什麼)? –

回答

0

我自己找到了答案。人們需要放大我的情況的方法是從觸摸點放大。所以當x和y座標得到放大做到這一點:

x -= pinchLocation.x; 
y -= pinchLocation.y; 

x *= zoomLevel; 
y *= zoomLevel; 

x += pinchLocation.x; 
y += pinchLocation.y; 

或簡稱:

x = (x - pinchLocation.x) * zoomLocation + pinchLocation.x; 
y = (y - pinchLocation.y) * zoomLocation + pinchLocation.y; 

現在x和y是在正確的位置!