2011-01-23 197 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教程。这是与核心动画,因此有一个性能奖金。