Анимация UIImage или UIImageView? - PullRequest
7 голосов
/ 23 января 2011

Я пытаюсь анимировать высоту изображения (от высоты 0 до 480 пикселей), чтобы создать эффект рендеринга изображения сверху вниз.

С UIImageView я заметил, что оно выглядит правильнов Интерфейсном Разработчике.Но когда он запускается в симуляторе, размер (ширина и высота) всегда устанавливается равным размеру изображения;это означает, что если я установлю высоту вида изображения на 50% от первоначальной высоты, изображение все равно будет отрисовано во всю высоту.

Я также попытался сделать этот эффект с помощью UIImage.Однако, хотя размер изображения выглядит правильным, изображение масштабируется для отражения размера / формата изображения.

Вопрос: Как я могу добиться такого динамического изменения размера (то есть анимации размера изображения), не масштабируяизображение?Я думал об использовании CGImageCreateWithMask, но я почти уверен, что это приведет к огромному снижению производительностизаставляя его расти в высоту, сверху вниз (как на жалюзи на окне).Это изображение не может быть масштабировано (так как оно потеряло бы визуальный эффект выглядеть как «слепой»).Это изображение также должно быть отображено поверх другого изображения.Таким образом, всего есть 2 изображения.

* ОТВЕТ *

Для самого верхнего изображения я установил режим контента на Верх (чтобы он не масштабировался).Затем в коде я установил для clipsToBounds значение True.Теперь я могу анимировать самую высокую высоту изображения, что дает мне эффект, который я ищу.

Ответы [ 6 ]

8 голосов
/ 23 января 2011

Используйте анимационный блок примерно так:

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 голосов
/ 26 января 2011

Как упоминалось в оригинальном сообщении, вот ответ, на который я, кажется, наткнулся:

Для самого верхнего изображения я установил режим контента на Верх (чтобы он не масштабировался). Затем в коде я установил для clipsToBounds значение True. Теперь я могу анимировать самую высокую высоту изображения, что дает мне эффект, который я ищу.

2 голосов
/ 26 января 2011

Просто предложение, предположим, что у вас есть два изображения: A и X (рентгеновское изображение):

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

Динамически вы можете создать изображение высотой в один пиксель (темп), скопировать содержимоечастично из X, поместите его поверх A:

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

В цикле динамически создайте / измените размер временного изображения и скопируйте больше содержимого из X:

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

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

+-------+   +-------+   +-------+
|       |   | tempX | < |       |
|       |   |       |   |       |
|   A   |   |       |   |   X   |
|       |   |       |   |       |
|       |   |       |   |       |
+-------+   +-------+   +-------+
2 голосов
/ 23 января 2011

Вы можете проверить блоки анимации.Здесь они довольно подробно документированы:

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

Весь код здесь релевантен, потому что UIImageView является подклассом UIView.

Счастливое кодирование.

0 голосов
/ 28 января 2011

Вам стоит взглянуть на Flip Clock для iPad.Это с основной анимацией, следовательно, имеет бонус производительности.

0 голосов
/ 23 января 2011

Попробуйте установить в свойстве 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...