#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. Хорошо, это определенно обеспечивает улучшение, но анимация по-прежнему идет не так гладко, как раньше…