Если ваш CALayer находится внутри другого CALayer, вам может понадобиться применить affineTransform родительского CALayer, чтобы получить позицию дочернего CALayer, например:
// Create your layers
CALayer *child = CALayer.layer;
CALayer *parent = self.view.layer;
[parent addSubLayer:child];
// Apply animations, transforms etc...
// Child center relative to parent
CGPoint childPosition = ((CALayer *)child.presentationLayer).position;
// Parent center relative to UIView
CGPoint parentPosition = ((CALayer *)parent.presentationLayer).position;
CGPoint parentCenter = CGPointMake(parent.bounds.size.width/2.0, parent.bounds.size.height /2.0);
// Child center relative to parent center
CGPoint relativePos = CGPointMake(childPosition.x - parentCenter.x, childPosition.y - parentCenter.y);
// Transformed child position based on parent's transform (rotations, scale etc)
CGPoint transformedChildPos = CGPointApplyAffineTransform(relativePos, ((CALayer *)parent.presentationLayer).affineTransform);
// And finally...
CGPoint positionInView = CGPointMake(parentPosition.x +transformedChildPos.x, parentPosition.y + transformedChildPos.y);
Этот код основан на только что написанном коде, в котором родительский CALayer вращался, и позиция менялась, и я хотел получить позицию дочернего CALayer относительно позиции касания в UIView, к которому принадлежал родитель. Так что это основная идея, но я не запускал эту версию псевдокода.