旋转NSImageView的CALayer 90度

5
我正在尝试旋转NSImageView的CALayer。问题在于,锚点似乎默认为(0.0, 0.0),但我想让它成为图像的中心(Apple的文档指示默认应该是中心点(0.5, 0.5),但在我的系统OS X 10.7上不是这样)。当我修改锚点时,图像中心原点会移动到左下角。
以下是我正在使用的代码来旋转图层:
CALayer *myLayer = [imageView layer];
CGFloat myRotationAngle = -M_PI_2;

NSNumber *rotationAtStart = [myLayer valueForKeyPath:@"transform.rotation"];
CATransform3D myRotationTransform = CATransform3DRotate(myLayer.transform, myRotationAngle, 0.0, 0.0, 1.0);
myLayer.transform = myRotationTransform;        
CABasicAnimation *myAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
myAnimation.duration = 1.0;
myAnimation.fromValue = rotationAtStart;
myAnimation.toValue = [NSNumber numberWithFloat:([rotationAtStart floatValue] + myRotationAngle)];
[myLayer addAnimation:myAnimation forKey:@"transform.rotation"];

myLayer.anchorPoint = CGPointMake(0.5, 0.5);
[myLayer addAnimation:myAnimation forKey:@"transform.rotation"];  

看起来如果我将anchorPoint代码移到awakeFromNib中,那么原点似乎不会改变...我认为在理解CoreAnimation方面有一些我所忽略的东西。 - Cayden
你的代码清单不完整(特别是因为你提到了将东西移动到-awakeFromNib)。请发布所有相关的代码,包括所有这些被调用的确切位置。还要解释一下承载此层树的视图是如何创建的(从nib、从-initWithFrame:还是其他方式?)。 - Joshua Nozzi
1个回答

6

似乎改变某物的锚点也会改变它的位置。下面的代码片段可以解决这个问题:

  CGPoint anchorPoint = CGPointMake(0.5, 0.5);
  CGPoint newPoint = CGPointMake(disclosureTriangle.bounds.size.width * anchorPoint.x, 
                                 disclosureTriangle.bounds.size.height * anchorPoint.y);
  CGPoint oldPoint = CGPointMake(disclosureTriangle.bounds.size.width * disclosureTriangle.layer.anchorPoint.x, 
                                 disclosureTriangle.bounds.size.height * disclosureTriangle.layer.anchorPoint.y);

  newPoint = CGPointApplyAffineTransform(newPoint, 
                                         [disclosureTriangle.layer affineTransform]);
  oldPoint = CGPointApplyAffineTransform(oldPoint,
                                         [disclosureTriangle.layer affineTransform]);

  CGPoint position = disclosureTriangle.layer.position;

  position.x -= oldPoint.x;
  position.x += newPoint.x;

  position.y -= oldPoint.y;
  position.y += newPoint.y;

  disclosureTriangle.layer.position = position;
  disclosureTriangle.layer.anchorPoint = anchorPoint;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接