繁体   English   中英

动画UIImage或UIImageView?

[英]Animating a UIImage or UIImageView?

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

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

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

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

*更新*

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

*答案*

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

像这样使用动画块:

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];

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

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

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

快乐的编码。

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

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

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

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

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

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

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

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

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

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

尝试将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;

你应该看看Flip Clock for iPad教程。 它具有核心动画,因此具有性能加值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM