我在UIView
內有多個UIImageView's
。這些UIImageViews
已被轉換。轉換後檢查重疊視圖
當手勢被施加到應該以這樣的方式使得UIImageView's
幀外的移動得到偏移的UIImageView's
重疊imageViews中的任何一個,我們得到的圖像的全視圖(所有的,這將在完成動畫方式)。
另外請注意,圖像將被轉換,所以我不能夠使用框架屬性。
現在我正在使用CGRectIntersectsRect
但它沒有給我想要的效果。
我在UIView
內有多個UIImageView's
。這些UIImageViews
已被轉換。轉換後檢查重疊視圖
當手勢被施加到應該以這樣的方式使得UIImageView's
幀外的移動得到偏移的UIImageView's
重疊imageViews中的任何一個,我們得到的圖像的全視圖(所有的,這將在完成動畫方式)。
另外請注意,圖像將被轉換,所以我不能夠使用框架屬性。
現在我正在使用CGRectIntersectsRect
但它沒有給我想要的效果。
掙扎了很多之後,最終我用這個算法達到了預期的效果。
我計算重疊列表UIImageView's
並將其存儲在一個數組中。 我爲此使用了CGRectIntersectsRect
。
注意:這還包括應用手勢的UIImageView
(如目標ImageView)。
對於每個這些重疊的UIImageView的,我執行以下步驟:
1)計算重疊的ImageView之間的角度和目標 ImageView的。這將給我轉移重疊ImageView的方向。
2)現在將重疊的ImageView移動一定的距離(比如len),使它保持相同的角度。方向應該是遠離目標ImageView。
3)您可以使用正弦/餘弦函數計算新的x,y座標。
x = start_x + len * cos(angle); y = start_y + len * sin(angle);
注意:對於其中心小於目標ImageView中心的ImageView,您需要減去該值。
4)現在將重疊的ImageView切換到新計算的中心。
5)繼續移動它直到視圖不再相交。
我附上我的代碼。我希望它有幫助。
- (無效)moveImage:(的UIImageView *)viewToMove fromView:(UIImageView的 *)imageToSendBack
{CGFloat angle = angleBetweenLines(viewToMove.center, imageToSendBack.center); CGFloat extraSpace = 50; CGRect oldBounds = viewToMove.bounds; CGPoint oldCenter = viewToMove.center; CGPoint shiftedCenter; while(CGRectIntersectsRect(viewToMove.frame,imageToSendBack.frame)) { CGPoint startPoint = viewToMove.center; shiftedCenter.x = startPoint.x - (extraSpace * cos(angle)); if(imageToSendBack.center.y < viewToMove.center.y) shiftedCenter.y = startPoint.y + extraSpace * sin(angle); else shiftedCenter.y = startPoint.y - extraSpace * sin(angle); viewToMove.center = shiftedCenter; } viewToMove.bounds = oldBounds; viewToMove.center = oldCenter; [self moveImageAnimationBegin:viewToMove toNewCenter:shiftedCenter]; }
我沒有嘗試,但我會做這樣的:
從CGRectIntersectsRect得到布爾後,寬度和高度也乘這個重疊的UIImageView x和y。
而且由於您在更改轉換後無法使用frame屬性,因此您需要將寬度和高度乘以1.5以獲得最大旋轉量。
警告:如果transform屬性不是標識轉換,則此屬性的值 未定義,因此應予以忽略。
這可能會移動一些視圖的父親比其他,但你會確定所有的意見將被移到UIImageView的框架之外。
如果您嘗試它並且不起作用,請發佈一些代碼,我會爲您提供幫助。
編輯:對於他們的x,y小於你的UIImageView的x,y的視圖,你需要減去偏移量。
由於@iBasel。我不會嘗試它,但即使這似乎是這樣工作。我通過使用另一種算法實現了結果。已經在下面發佈它以及代碼。 –