2011-01-23 356 views
7

我試圖給圖像的高度(從0像素到480像素的高度)設置動畫效果,以創建自上而下呈現圖像的效果。動畫UIImage或UIImageView?

使用UIImageView我注意到它在界面生成器中顯示正確。但是當它在模擬器中運行時,尺寸(寬度和高度)總是設置爲圖像的大小;意思是說,如果我將圖像視圖的高度設置爲原始高度的50%,則圖像仍然呈現爲全高。

我也試過用UIImage做這個效果。但是,雖然圖像的大小看起來正確,但圖像的大小和縱橫比都會反映出來。

問題: 如何在不縮放圖像的情況下實現這種動態調整大小(即圖像大小的動畫)?我想過使用CGImageCreateWithMask,但我很確定這會造成巨大的性能問題。

*更新*

,即時通訊尋找的大意是這樣的: 通過使它成長的高度,從自頂向下(就像一組百葉窗被拉到一個窗口)動畫圖像。該圖像不能縮放(因爲它會失去看起來像「盲目」的視覺效果)。此圖片還必須呈現在另一張圖片的頂部。所以共有2張圖片。

*答案*

對於最頂層的ImageView,我設置了內容模式頂部(所以它不規模)。然後在代碼中,我將clipsToBounds設置爲True。現在,我可以爲最頂級的imageview高度設置動畫效果,從而爲我提供所需的效果。

回答

2

正如原帖子中提到,這裏是我似乎在已經迷迷糊糊的回答:

對於最頂級的imageview,我設置內容模式爲Top(所以它不縮放)。然後在代碼中,我將clipsToBounds設置爲True。現在,我可以爲最頂級的imageview高度設置動畫效果,從而爲我提供所需的效果。

0

嘗試將您的UIImageView的contentMode屬性設置爲以下值之一。我想你需要的是UIViewContentModeScaleAspectFit

typedef enum { 
    UIViewContentModeScaleToFill, 
    UIViewContentModeScaleAspectFit,  // contents scaled to fit with fixed aspect. remainder is transparent 
    UIViewContentModeScaleAspectFill,  // contents scaled to fill with fixed aspect. some portion of content may be clipped. 
    UIViewContentModeRedraw,    // redraw on bounds change (calls -setNeedsDisplay) 
    UIViewContentModeCenter,    // contents remain same size. positioned adjusted. 
    UIViewContentModeTop, 
    UIViewContentModeBottom, 
    UIViewContentModeLeft, 
    UIViewContentModeRight, 
    UIViewContentModeTopLeft, 
    UIViewContentModeTopRight, 
    UIViewContentModeBottomLeft, 
    UIViewContentModeBottomRight, 
} UIViewContentMode; 
+0

我可以達到即時通訊使用UIViewContentModeTop即時通訊的效果。再次,這種效應在IB中看起來是正確的。但是當我在模擬器中運行時,圖像始終顯示爲圖像的實際尺寸(而不是我在IB中指定的尺寸)。 – AlvinfromDiaspar 2011-01-23 07:45:23

+0

我對你的描述感到困惑。 1)你可以發佈一些屏幕截圖嗎? 2)雖然在IB中有一組設置,但您的代碼可能在運行時修改/覆蓋了它們。 3)模擬器可能不準確,請嘗試在真正的iPhone上進行測試。 – 2011-01-23 07:55:28

+0

想象一下,在非常慢的連接上呈現網頁。你基本上看到的頁面是從上到下繪製的。基本上我想通過緩慢地將圖像的高度從y = 0增加到y = 480來創建這種效果,其中圖像是320x480圖像(UIImage或UIImageView)。內容模式被定義爲Top(以便圖像邊界被調整大小時,圖像不會縮放)。 – AlvinfromDiaspar 2011-01-23 08:12:16

8

使用動畫塊,像這樣:

imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 0)]; 
imageView.image = ...; 
[imageView setClipsToBounds:YES]; 
[imageView setContentMode:UIViewContentModeTop]; 

[self.view addSubview:imageView]; 
[imageView release]; 

[UIView animateWithDuration:4.0f 
         delay:1.0f 
        options:UIViewAnimationOptionCurveEaseIn 
       animations:^(void) { 
        imageView.frame = CGRectMake(0, 0, 320, 480); 
       } 
       completion:NULL]; 
2

只是一個建議,假設你有兩個圖像:A和X(X射線圖像):

+-------+    +-------+ 
|  |    |  | 
|  |    |  | 
| A |    | X | 
|  |    |  | 
|  |    |  | 
+-------+    +-------+ 

動態則可以創建一個像素高的圖像(TEMP),部分複製從X的內容,把它放在A的頂部:

+-------+ +-------+ +-------+ 
|  | | temp1 | < |  | 
|  | +-------+ |  | 
| A |    | X | 
|  |    |  | 
|  |    |  | 
+-------+    +-------+ 

在一個循環中,動態創建/調整溫度圖像,並從X複製更多的內容:

+-------+ +-------+ +-------+ 
|  | | temp2 | < |  | 
|  | |  | |  | 
| A | +-------+ | X | 
|  |    |  | 
|  |    |  | 
+-------+    +-------+ 

+-------+ +-------+ +-------+ 
|  | | temp3 | < |  | 
|  | |  | |  | 
| A | |  | | X | 
|  | +-------+ |  | 
|  |    |  | 
+-------+    +-------+ 
+-------+ +-------+ +-------+ 
|  | | temp4 | < |  | 
|  | |  | |  | 
| A | |  | | X | 
|  | |  | |  | 
|  | +-------+ |  | 
+-------+    +-------+ 

+-------+ +-------+ +-------+ 
|  | | tempX | < |  | 
|  | |  | |  | 
| A | |  | | X | 
|  | |  | |  | 
|  | |  | |  | 
+-------+ +-------+ +-------+ 
0

你應該看看Flip Clock的iPad教程。這是與核心動畫,因此有一個性能獎金。