Как мне панорамировать изображение внутри UIImageView? - PullRequest
26 голосов
/ 07 января 2009

У меня есть UIImageView, который отображает изображение, которое шире и выше, чем UIImageView. Я хотел бы панорамировать изображение в представлении, используя анимацию (чтобы панорамирование было приятным и плавным).

Мне кажется, что я должен иметь возможность просто отрегулировать bounds.origin из UIImageView, и изображение должно переместиться (потому что изображение должно закрашиваться внутри вида таким образом, как его происхождение да?) но это не похоже на работу. bounds.origin изменяется, но изображение отображается в том же месте.

Что почти работает, так это изменить contentsRect слоя вида. Но это начинается как единичный квадрат, хотя видимая область изображения не является целым изображением. Так что я не уверен, как бы я обнаружил, что дальний край изображения вытягивается в видимую область (чего мне следует избегать, поскольку он отображается путем растягивания края до бесконечности, что выглядит, ну, как минимум ).

Мое представление в настоящее время имеет contentsGravity, установленное на kCAGravityTopLeft через Интерфейсный Разработчик, если это имеет значение (Это заставляет изображение перемещаться?). Однако, другие варианты не были бы лучше.

ОБНОВЛЕНИЕ: для ясности, я хочу переместить изображение в вид, сохраняя вид в том же месте.

Ответы [ 2 ]

47 голосов
/ 07 января 2009

Я бы настоятельно рекомендовал заключить ваше UIImageView в UIScrollView. Пусть UIImageView отобразит полное изображение, и задайте для contentSize для UIScrollView тот же размер, что и для вашего UIImageView's. Ваш window в изображении будет размером UIScrollView, а с помощью scrollRectToVisible:animated: вы можете перемещаться по определенным областям изображения в анимационном режиме.

Если вы не хотите, чтобы появлялись полосы прокрутки, вы можете установить свойства showsHorizontalScrollIndicator и showsVerticalScrollIndicator на NO.

UIScrollView также предоставляет функцию масштабирования пинча, которая может быть полезной для вас.

39 голосов
/ 08 января 2009

Брэд Ларсон указал мне на правильную дорогу своим предложением поместить UIImageView внутрь UIScrollView.

В конце я помещаю UIImageView внутрь UIScrollView и устанавливаю contentSize и границ imageView для scrollView равными размеру изображения на UIImage:

UIImage* image = imageView.image;
imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
scrollView.contentSize = image.size;

Затем я могу анимировать contentOffset scrollView для достижения хорошего эффекта панорамирования:

[UIView beginAnimations:@"pan" context:nil];
[UIView setAnimationDuration:animationDuration];
scrollView.contentOffset = newRect.origin;
[UIView commitAnimations];

В моем конкретном случае я панорамирую случайное пространство на изображении. Чтобы найти правильный прямоугольник панорамирования от до и подходящую длительность для получения хорошей постоянной скорости, я использую следующее:

UIImage* image = imageView.image;

float xNewOrigin = [TCBRandom randomIntLessThan:image.size.width - scrollView.bounds.size.width];
float yNewOrigin = [TCBRandom randomIntLessThan:image.size.height - scrollView.bounds.size.height];

CGRect oldRect = scrollView.bounds;
CGRect newRect = CGRectMake(
    xNewOrigin,
    yNewOrigin, 
    scrollView.bounds.size.width,
    scrollView.bounds.size.height);

float xDistance = fabs(xNewOrigin - oldRect.origin.x);
float yDistance = fabs(yNewOrigin - oldRect.origin.y);
float hDistance = sqrtf(powf(xDistance, 2) + powf(yDistance, 2));
float hDistanceInPixels = hDistance;

float animationDuration = hDistanceInPixels / speedInPixelsPerSecond;

Я использую speedInPixelsPerSecond из 10.0f, но другие приложения могут захотеть использовать другое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...