Как я могу заставить OpenFlow корректно работать в iOS 5.0?

#ios #core-animation #ios5 #coverflow

#iOS #ядро-анимация #ios5 #coverflow

Вопрос:

Недавно я обновил свое приложение, чтобы использовать iOS 5.0 SDK. В нем я использую реализацию OpenFlow cover flow от Алекса Файовски.

Я обнаружил, что при запуске приложения в iOS 5.0 OpenFlow выполняет неправильное преобразование или перемещение Z при пролистывании изображений.

Могу ли я что-нибудь сделать, чтобы OpenFlow корректно работал в iOS 5.0 SDK?

Комментарии:

1. Пожалуйста, опубликуйте изображение грубой трансформации 🙂

2. да, я тоже сталкиваюсь с такой же проблемой, это похоже на переворот изображения в 3D-эффекте. Предоставьте какое-нибудь решение, если у кого-нибудь есть.

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

4. Вы используете эту библиотеку только для эффекта Coverflow? Если я предложу вам любую другую библиотеку для того же эффекта, хотите ли вы попробовать это?

5. Как вы можете видеть, я уже опубликовал решение этой проблемы. Спасибо.

Ответ №1:

Я улучшил то, что у вас есть здесь, и это, безусловно, позволяет ему работать плавно (так, как это было раньше в iOS 4).

В AfOpenFlowView.m вместо того, что вы указали выше (in -setUpInitialState):

 leftTransform = CATransform3DTranslate(CATransform3DIdentity, 0, 0, SIDE_COVER_ZPOSITION / 2.0);
leftTransform = CATransform3DRotate(leftTransform, SIDE_COVER_ANGLE, 0.0f, 1.0f, 0.0f);
rightTransform = CATransform3DTranslate(CATransform3DIdentity, 0, 0, SIDE_COVER_ZPOSITION / 2.0);
rightTransform = CATransform3DRotate(rightTransform, SIDE_COVER_ANGLE, 0.0f, -1.0f, 0.0f);
  

Внутри -layoutCover:selectedCover:анимированный, поместите следующий код:

 CGFloat newZPosition = SIDE_COVER_ZPOSITION / 2.0;
  

 CABasicAnimation *zPositionAnimation = [CABasicAnimation animationWithKeyPath:@"zPosition"];
[zPositionAnimation setToValue:[NSNumber numberWithFloat:newZPosition]];
[zPositionAnimation setDuration:(animated ? .3 : 0.0)];
[zPositionAnimation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[zPositionAnimation setRemovedOnCompletion:NO];
[zPositionAnimation setFillMode:kCAFillModeForwards];
  

Теперь вместо того, чтобы делать:

 aCover.layer.zPosition = newZPosition;
  

Замените его на:

 [aCover.layer addAnimation:zPositionAnimation forKey:nil];
  

Вы можете условно включить любой из них в зависимости от того, работает ли он на iOS 4 или 5.

Лучшие,

Комментарии:

1. Да, это сработало, но все еще не хватало некоторой «плавности» анимации, которую я исправил, добавив то, что я только что опубликовал (что, конечно, основано на том, что вы изначально прокомментировали).

Ответ №2:

Сегодня я наконец нашел решение этой проблемы. По-видимому, в iOS 5 zPosition больше не анимируется (жаль, потому что в документации так сказано). Вот почему эту ошибку можно исправить, включив правильный переход в CATransform3D.

Ранее:

     leftTransform = CATransform3DIdentity;
    leftTransform = CATransform3DRotate(leftTransform, SIDE_COVER_ANGLE, 0.0f, 1.0f, 0.0f);
    rightTransform = CATransform3DIdentity;
    rightTransform = CATransform3DRotate(rightTransform, SIDE_COVER_ANGLE, 0.0f, -1.0f, 0.0f);
  

Теперь это выглядит так:

     leftTransform = CATransform3DTranslate(CATransform3DIdentity, 0, 0, SIDE_COVER_ZPOSITION);
    leftTransform = CATransform3DRotate(leftTransform, SIDE_COVER_ANGLE, 0.0f, 1.0f, 0.0f);
    rightTransform = CATransform3DTranslate(CATransform3DIdentity, 0, 0, SIDE_COVER_ZPOSITION);
    rightTransform = CATransform3DRotate(rightTransform, SIDE_COVER_ANGLE, 0.0f, -1.0f, 0.0f);
  

Надеюсь, это поможет вам, ребята, так же, как и мне.

Комментарии:

1. Приятно, спасибо! Вам обязательно следует отправить исправление через github и закрыть проблему ( github.com/thefaj/OpenFlow/issues/21 ), Я думаю, это вы сами его выложили?

2. Хорошо, это определенно обеспечивает улучшение, но анимация по-прежнему идет не так гладко, как раньше…