[英]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.