2009-01-07 33 views
24

我有一個UIImageView顯示的圖像比UIImageView更寬,更高。我想使用動畫在視圖內平移圖像(以便平移平滑)。如何平移UIImageView中的圖像?

在我看來,我應該能夠僅僅調整UIImageViewbounds.origin,圖像應移動(因爲形象應該與爲起源視圖內作畫,對吧?),但沒有按似乎沒有用。 bounds.origin更改,但圖像繪製在相同的位置。

幾乎可行的是改變視圖層的contentsRect。但是,儘管圖像的可視區域不是整個圖像,但它始於單位正方形。所以我不確定我會如何檢測圖像的邊緣被拉入可視區域(我需要避免這一點,因爲它通過將邊緣伸展到無窮大來顯示,這看起來好,低於標準)。

我的看法目前通過Interface Builder將其contentsGravity設置爲kCAGravityTopLeft,如果這樣做有區別(是否導致圖像移動?)。雖然沒有其他選擇似乎更好。

更新:要清楚,我想將中的圖像移動到的視圖中,同時將視圖保留在同一位置。

回答

37

布拉德拉森指出我在正確的道路與他的建議把UIImageViewUIScrollView

最後,我把UIImageView一個UIScrollView的內部,設置了滾動的contentSizeimageView的界限是大小相同的UIImage的圖像:

UIImage* image = imageView.image; 
imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height); 
scrollView.contentSize = image.size; 

然後,我可以動畫滾動視圖的contentOffset實現一個不錯的平移效果:

[UIView beginAnimations:@"pan" context:nil]; 
[UIView setAnimationDuration:animationDuration]; 
scrollView.contentOffset = newRect.origin; 
[UIView commitAnimations]; 

在我的具體情況,我向平移一個隨機的空間,我在圖像中。爲了找到一個妥善的矩形平移和適當的時間,以獲得一個不錯的恆定的速度,我使用以下命令:

UIImage* image = imageView.image; 

float xNewOrigin = [TCBRandom randomIntLessThan:image.size.width - scrollView.bounds.size.width]; 
float yNewOrigin = [TCBRandom randomIntLessThan:image.size.height - scrollView.bounds.size.height]; 

CGRect oldRect = scrollView.bounds; 
CGRect newRect = CGRectMake(
    xNewOrigin, 
    yNewOrigin, 
    scrollView.bounds.size.width, 
    scrollView.bounds.size.height); 

float xDistance = fabs(xNewOrigin - oldRect.origin.x); 
float yDistance = fabs(yNewOrigin - oldRect.origin.y); 
float hDistance = sqrtf(powf(xDistance, 2) + powf(yDistance, 2)); 
float hDistanceInPixels = hDistance; 

float animationDuration = hDistanceInPixels/speedInPixelsPerSecond; 

我使用的10.0fspeedInPixelsPerSecond,但其他應用程序可能要使用不同的值。

44

我強烈建議把你的UIImageView放在UIScrollView。讓UIImageView顯示完整圖像,並將UIScrollView上的contentSize設置爲與UIImageView's大小相同。您的window放入圖像的尺寸將爲UIScrollView,並且通過使用scrollRectToVisible:animated:,您可以以動畫方式平移到圖像上的特定區域。

如果您不想滾動條出現,您可以將showsHorizontalScrollIndicatorshowsVerticalScrollIndicator屬性設置爲NO

UIScrollView還提供了縮放縮放功能,這對您可能有用或可能沒有用。

+0

但在這種情況下的動畫是如此之快,你永遠不會看到圖像,只是目的地。 – TALlama 2009-01-07 22:28:05

+1

在UIView的beginAnimations/commitAnimations塊中放入scrollRectToVisible:animated:方法調用,並在該塊的開始處使用UIView的setAnimationDuration:。這會覆蓋默認的動畫持續時間。您可以使滾動視圖儘可能慢地平移。 – 2009-01-07 23:14:12