2012-06-15 115 views
1

我正在使用尼克洛克伍德传送带,类型是轮转盘。我将图片用作旋转木马中的项目。问题是,当我旋转传送带时,图像也旋转,即考虑人物图像,然后人物图像倾斜,这是我不想要的,即我不想在旋转整个传送带时旋转该特定图像。任何人都可以帮忙吗?不想旋转传送带上的图像旋转传送带

+0

你的意思是你想让人的脸部始终保持垂直? – sergio

+0

是的,人的脸应该保持垂直 –

回答

0

尝试有条件地旋转取决于设备定向在图像中的

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view; 

委托方法。

+0

我不是旋转设备,旋转木马只能旋转,但其中的图像应保持原样,他们的位置应该只是改变 –

1

查看文件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); 
     } 
    } 

尝试简单地注释掉两行:

 transform = CATransform3DRotate(transform, angle * offset, 0.0f, 0.0f, 1.0f); 

,并看看会发生什么;我猜这个脸不会被旋转,但那么你可能需要调整翻译...

+0

感谢您的答案,我只为此尝试,但还没有找到解决方案,我正在尝试,并会发布如果发现它,如果其他人已经发现,那么请帮助 –

4

看执行- (CATransform3D)transformForItemView:(UIView *)view withOffset:(CGFloat)offset;找到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); 

我希望帮助。

+0

这绝对有帮助!感谢发布这:)。 – kajham

+0

帮助我,这应该验证。 – darksider

+0

感谢你拯救了我的生命:) – iphonic

0

使用上述答案中的代码,我无法真正解决这个问题。我重用了部分评论,但没有使用代码。这对我有效。

 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); 
     } 
相关问题