UIImageView отлично подходит для анимации отображения (UIViews - это легкие обёртки вокруг CALayers, которые являются просто текстурами, хранящимися на видеокарте), но вам нужно использовать блок анимации begin / commit для получения плавной анимации. Используя это, вы можете получить текущую позицию представления, получив доступ к базовому слою UIView и получив его уровень представления. У Дастина Бахраха есть пост , в котором описывается, как это сделать. По сути, уровень представления - это самое близкое приближение Core Animation к тому месту, где фактически находится слой в любой момент времени, поэтому его кадр - это кадр вашего UIView в этот момент.
Я не уверен, что сенсорные события найдут свой путь к представлению при его перемещении по экрану, поэтому, если вам нужно, чтобы UIImageView реагировал на прикосновения, вам может понадобиться заменить его на CALayer, вставьте его как подслой вашего основного слоя UIView и вызовите метод hitTest для presentationLayer этого основного слоя. Это должно вернуть presentationLayer вашего движущегося слоя, если на него щелкнули, или фоновый слой, если нет.
Честно говоря, я бы не стал использовать OpenGL, если бы вам не пришлось этого делать из соображений производительности, потому что код намного сложнее, чем то, что Core Animation предоставляет вам UIViews и CALayers. Мне удалось анимировать 50 движущихся полупрозрачных слоев со скоростью 60 кадров в секунду (100 при 30 кадрах в секунду), используя только UIViews и CALayers.