Я разработал 3D-карусель psuedo для iPhone, которая очень похожа на изображение ниже:
Я в основном создаю массив UIViews, а затем регистрируюсь для сенсорных событий:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// if we're not already tracking a touch then...
if(!trackingTouch)
{
// ... track any of the new touches, we don't care which ...
trackingTouch = [touches anyObject];
}
}
Пока движение еще регистрируется, я делаю следующее:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// if our touch moved then...
if([touches containsObject:trackingTouch])
{
// use the movement of the touch to decide
// how much to rotate the carousel
CGPoint locationNow = [trackingTouch locationInView:self];
CGPoint locationThen = [trackingTouch previousLocationInView:self];
lastAngle = currentAngle;
currentAngle += (locationNow.x - locationThen.x) * 180.0f / self.bounds.size.width;
// and update the view positions
[self setCarouselAngle:currentAngle];
}
}
Я тогда звоню, когда касания заканчиваются:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
// if our touch ended then...
if([touches containsObject:trackingTouch])
{
// make sure we're no longer tracking it
trackingTouch = nil;
// and kick off the inertial animation
animationTimer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(animateAngle) userInfo:nil repeats:YES];
}
}
Затем метод animageAngle в основном вызывает другой метод, который эффективно делит 360 градусов на количество представлений в массиве и использует функции косинуса и синуса для генерации координат x и y.
Все вышеперечисленное работает хорошо, но мне трудно понять математику, необходимую для выполнения следующего:
- Нажмите на вид вне основного фокуса, т.е. не спереди, например, фиолетовый вид на изображении
- Повернуть пурпурный вид в фокус, т. Е. Вперед
- Загрузка нового контроллера вида после завершения вращения
Я понимаю, что мне нужно вычислить угол между видом в его текущем положении и запланированным пунктом назначения, чтобы сделать вращение, но я не могу на всю жизнь понять это.
Извиняюсь за предыдущую путаницу - я так долго искал эту проблему, что начинаю терять сюжет.
Спасибо