簡體   English   中英

具有新框架的轉換后的UIView的新中心點

[英]New center point for transformed UIView with new frame

我正在開發應顯示室內設計圖的iOS應用程序。 您應該能夠在樓層之間切換,並且每個樓層圖像都由手勢識別器控制以處理平移,旋轉和縮放。

我一直在為手勢識別器使用此示例: https : //github.com/GreenvilleCocoa/UIGestures/blob/master/UIGestures/RPSimultaneousViewController.m

所以現在要解決問題。 每當用戶切換地板時,我都希望保持圖像的變換以及相應的中心經度/緯度。 但是,新圖像可以具有另一個旋轉偏移和寬高比。

我已經能夠以新的尺寸更新圖像的新框架,並以新的旋轉偏移量更新變換並進行驗證。 當我嘗試計算新的中心點時,我無法使其正常工作。 以下代碼是我當前的操作方式,只要視圖未旋轉,它就可以工作:

-(void)changeFromFloor:(int)oldFloorNr toFloor:(int)newFloorNr
{
    CGPoint centerPoint = CGPointMake(self.frame.size.width/2, self.frame.size.height/2);

    // This is the old non transformed center point.
    CGPoint oldCenterOnImage = [self.layer convertPoint:centerPoint toLayer:self.mapOverlayView.layer]; // Actual non transformed point

    // This point is verified to be the corresponding non transformed center point
    CGPoint newCenterOnImage = [self calculateNewCenterFor:oldCenterOnImage fromFloor:oldFloorNr toFloor:newFloorNr];

    // Change image, sets a new image and change the fram of mapOverlayView
    [self changeImageFromFloor:oldFloorNr toFloor:newFloorNr]

    // Adjust transformed rotation on map if new map have different rotation
    [self adjustRotationFromFloorNr:oldFloorNr toFloorNr:newFloorNr];

    CGPoint centerOfMapOverlay = CGPointMake((self.mapOverlayView.frame.size.width / 2), (self.mapOverlayView.frame.size.height / 2));

    CGPoint newCenterOnImageTransformed = CGPointApplyAffineTransform(newCenterOnImage, self.mapOverlayView.transform);

    CGFloat newCenterX = centerPoint.x + centerOfMapOverlay.x - newCenterOnImageTransformed.x;
    CGFloat newCenterY = centerPoint.y + centerOfMapOverlay.y - newCenterOnImageTransformed.y;

    // This only works without any rotation
    self.mapOverlayView.center = CGPointMake(newCenterX, newCenterY);
}

知道我哪里出錯了嗎? 我幾天來一直在處理這個問題,但似乎無法解決。

請讓我知道我是否需要添加某些內容或不清楚的內容。

謝謝!

提供幫助后添加的代碼:

CGPoint centerOfMapOverlay = CGPointMake(
    (self.mapOverlayView.bounds.size.width / 2,
    (self.mapOverlayView.bounds.size.height / 2)
);

centerOfMapOverlay = CGPointApplyAffineTransform(
    centerOfMapOverlay,
    self.mapOverlayView.transform
);

如果更改視圖的變換,則frame屬性將變為未定義。 您應該改為使用center屬性來更改視圖的位置,並使用bounds.size來更改視圖的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM