动画UIImage或UIImageView?

时间:2011-01-23 07:21:06

标签: iphone ios uiimageview

我正在尝试为图像的高度设置动画(从0像素到480像素的高度),以创建从上到下渲染图像的效果。

使用UIImageView我注意到它在Interface Builder中显示正确。但是当它在模拟器中运行时,大小(宽度和高度)总是设置为图像的大小;意思是,如果我将图像视图的高度设置为原始高度的50%,则图像仍然以全高渲染。

我也试过用UIImage做这个效果。但是,虽然图像的大小看起来是正确的,但图像会缩放以反映尺寸/宽高比。

问题: 如何在不缩放图像的同时实现这种动态尺寸调整(即图像尺寸的动画)?我想过使用CGImageCreateWithMask,但我很确定这会造成巨大的性能打嗝。

*更新*

我正在寻找的效果是这样的: 通过使图像从高到高(从一个窗口拉出一组百叶窗)的高度增长来为图像设置动画。此图像无法缩放(因为它会失去看起来像“盲目”的视觉效果)。此图像还必须呈现在另一个图像的顶部。总共有2张图片。

*答案*

对于最顶层的imageview,我将内容模式设置为Top(因此它不会缩放)。然后在代码中,我将clipsToBounds设置为True。现在我能够为最顶层的imageview高度设置动画,从而为我提供我想要的效果。

6 个答案:

答案 0 :(得分: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];

答案 1 :(得分:2)

您可能想要查看动画块。他们在这里记录得很彻底:

http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html

那里的所有代码都是相关的,因为UIImageView是UIView的子类。

快乐的编码。

答案 2 :(得分:2)

只是一个建议,假设你有两个图像:A和X(X射线图像):

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

动态地你可以创建一个像素高的图像(临时),从X部分复制内容,把它放在A:

之上
+-------+   +-------+   +-------+
|       |   | temp1 | < |       |
|       |   +-------+   |       |
|   A   |               |   X   |
|       |               |       |
|       |               |       |
+-------+               +-------+

在循环中,动态创建/调整临时图像的大小,并从X复制更多内容:

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

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

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

答案 3 :(得分:2)

正如原帖中提到的,这是我似乎偶然发现的答案:

对于最顶层的imageview,我将内容模式设置为Top(因此它不会缩放)。然后在代码中,我将clipsToBounds设置为True。现在我能够为最顶层的imageview高度设置动画,从而为我提供我想要的效果。

答案 4 :(得分: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;

答案 5 :(得分:0)

您应该查看Flip Clock的iPad教程。它是核心动画,因此有性能奖励。

相关问题