I am using Nick Lockwood carousel and type is Wheel Carousel. I am using the images as items in carousel. The problem is when I rotate the carousel the image also rotates, i.e. consider a person image, then the person image gets tilted, which I don't want, i.e. I don't want to rotate that particular image while rotating whole carousel. Can anyone please help?
4 に答える
andブロックの- (CATransform3D)transformForItemView:(UIView *)view withOffset:(CGFloat)offset;
Findの実装を見てください。case iCarouselTypeWheel:
case iCarouselTypeInvertedWheel:
最終的な変換を生成するコードを変更して (垂直と水平の両方の場合)、適用された回転を逆にします。
transform = CATransform3DTranslate(transform, 0.0f, radius, 0.0f);
transform = CATransform3DRotate(transform, angle * offset, 0.0f, 0.0f, 1.0f);
// this is the transform the existing code returns...
transform = CATransform3DTranslate(transform, 0.0f, -radius, offset * 0.01f);
// instead you reverse the rotation before returning...
return CATransform3DRotate(transform, -(angle * offset), 0.0f, 0.0f, 1.0f);
それが役立つことを願っています。
ファイル iCarousel.m を見て、- (CATransform3D)transformForItemView:(UIView *)view withOffset:(CGFloat)offset
メソッドを見つけてください。その中に次のブロックがあります。
case iCarouselTypeWheel:
case iCarouselTypeInvertedWheel:
{
NSInteger count = [self valueForTransformOption:iCarouselTranformOptionCount withDefault:
MIN(numberOfVisibleItems, numberOfItems + numberOfPlaceholdersToShow)];
CGFloat arc = [self valueForTransformOption:iCarouselTranformOptionArc withDefault:M_PI * 2.0f];
CGFloat radius = [self valueForTransformOption:iCarouselTranformOptionRadius withDefault:itemWidth * (CGFloat)count / arc];
CGFloat angle = [self valueForTransformOption:iCarouselTranformOptionAngle withDefault:arc / (CGFloat)count];
if (type == iCarouselTypeInvertedWheel)
{
radius = -radius;
angle = -angle;
}
if (vertical)
{
transform = CATransform3DTranslate(transform, -radius, 0.0f, 0.0f);
/* this */ transform = CATransform3DRotate(transform, angle * offset, 0.0f, 0.0f, 1.0f);
return CATransform3DTranslate(transform, radius, 0.0f, offset * 0.01f);
}
else
{
transform = CATransform3DTranslate(transform, 0.0f, radius, 0.0f);
/* this */ transform = CATransform3DRotate(transform, angle * offset, 0.0f, 0.0f, 1.0f);
return CATransform3DTranslate(transform, 0.0f, -radius, offset * 0.01f);
}
}
次の 2 行をコメントアウトしてみてください。
transform = CATransform3DRotate(transform, angle * offset, 0.0f, 0.0f, 1.0f);
そして何が起こるか見てください。顔は回転しないと思いますが、移動を調整する必要があるかもしれません...
デバイスの向きに応じて、画像を条件付きで回転させてみてください。
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view;
デリゲート メソッド。
上記の回答のコードを使用しても、問題を実際に修正することはできませんでした。コメントの一部を再利用しましたが、コードは再利用しませんでした。私にとってうまくいったのはこれでした。
if (_vertical)
{
transform = CATransform3DTranslate(transform, -radius, 0.0, 0.0);
transform = CATransform3DRotate(transform, angle * offset, 0.0, 0.0, 1.0);
transform = CATransform3DTranslate(transform, radius, 0.0, offset * 0.01);
return CATransform3DRotate(transform, -(angle * offset), 0.0, 0.0, 1.0);
}
else
{
transform = CATransform3DTranslate(transform, 0.0, radius, 0.0);
transform = CATransform3DRotate(transform, angle * offset, 0.0, 0.0, 1.0);
transform = CATransform3DTranslate(transform, 0.0, -radius, offset * 0.01);
return CATransform3DRotate(transform, -(angle * offset), 0.0, 0.0, 1.0);
}