Как мне панорамировать изображение внутри 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
также предоставляет функцию масштабирования пинч-масштабирования, которая может быть полезной для вас.