【问题标题】:Rotating CALayer of NSImageView 90 degrees将 NSImageView 的 CALayer 旋转 90 度
【发布时间】:2011-10-02 04:23:04
【问题描述】:

我正在尝试旋转 NSImageView 的 CALayer。我的问题是默认情况下anchorPoint似乎是(0.0,0.0),但我希望它成为图像的中心(Apple的文档表明默认应该是中心(0.5,0.5),但它不在我的系统操作系统上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 的理解而言,我缺少一些东西
  • 您的代码清单不完整(特别是因为您提到将内容移至 -awakeFromNib)。请发布所有相关代码,包括调用所有这些代码的确切位置。还要解释托管此层树的视图是如何创建的(来自 nib,来自 -initWithFrame:,如何创建?)。

标签: macos cocoa core-animation


【解决方案1】:

似乎改变某物的锚点也会改变它的位置。下面的 sn -p 解决了这个问题:

  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;

【讨论】:

    猜你喜欢
    • 2011-03-22
    • 2015-03-22
    • 2022-01-13
    • 2011-09-24
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    相关资源
    最近更新 更多