Как рассчитать положение вида, анимированного с трехмерной карусели? - PullRequest
0 голосов
/ 13 декабря 2011

Я разработал 3D-карусель psuedo для iPhone, которая очень похожа на изображение ниже: enter image description here

Я в основном создаю массив 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.

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

  1. Нажмите на вид вне основного фокуса, т.е. не спереди, например, фиолетовый вид на изображении
  2. Повернуть пурпурный вид в фокус, т. Е. Вперед
  3. Загрузка нового контроллера вида после завершения вращения

Я понимаю, что мне нужно вычислить угол между видом в его текущем положении и запланированным пунктом назначения, чтобы сделать вращение, но я не могу на всю жизнь понять это.

Извиняюсь за предыдущую путаницу - я так долго искал эту проблему, что начинаю терять сюжет.

Спасибо

1 Ответ

0 голосов
/ 14 декабря 2011

Наконец-то .... Мне удалось взломать его.

Я действовал невероятно глупо и не думал логически.Я в основном перезапустил NSTimer, вызывая метод, который выполняет следующие вычисления для свойства currentAngle (в коде psuedo):

CGFloat currentLocation;
CGFloat nextLocation;
CGFloat destinationLocation;

currentLocation = viewImInterestedIn.frame.origin.x;
nextLocation = currentLocation - 1; //or + 1 if the selected view is to the left of centre

destinationLocation = 115.0f //set this to a default value
currentAngle += (currentLocation - nextLocation ) * 180.0f / self.bounds.size.width;

// and update the view positions
[self setCarouselAngle:currentAngle];

Et voila!

Удивительно просто - мне нужно научитьсяпросто сделать шаг назад и вернуться к проблеме с ясной головой.

Спасибо всем

...