Как мне панорамировать изображение внутри UIImageView?

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

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

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

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

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

2 ответа

Решение

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

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

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

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

[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, но другие приложения могут захотеть использовать другое значение.

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

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

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

Другие вопросы по тегам