使用CGAffineTransform缩放并设置锚点

hpi*_*que 30 iphone scaling cgaffinetransform ios

如果我理解正确的缩放UIViewCGAffineTransform锚改造中心.

特别是:

self.frame = CGRectMake(0,0,100,100);
self.transform = CGAffineTransformMakeScale(2, 2);
NSLog(@"%f;%f;%f;%f", self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height); 
Run Code Online (Sandbox Code Playgroud)

打印:

-50;-50;200;200
Run Code Online (Sandbox Code Playgroud)

如何创建使用特定锚点(例如0; 0)的CGAffineTransform比例?

dea*_*rne 68

(一个)

缩放然后翻译?

就像是 :

CGAffineTransform t = CGAffineTransformMakeScale(2, 2);
t = CGAffineTransformTranslate(t, width/2, height/2);
self.transform = t;
Run Code Online (Sandbox Code Playgroud)

(b)中

设置锚点(这可能是你想要的)

[self layer].anchorPoint = CGPointMake(0.0f, 0.0f);
self.transform = CGAffineTransformMakeScale(2, 2);
Run Code Online (Sandbox Code Playgroud)

(C)

再次设置中心以确保它在同一个地方?

CGPoint center = self.center;
self.transform = CGAffineTransformMakeScale(2, 2);
self.center = center;
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记,如果你翻译100px,但你的变换已经达到2,那么你实际上翻译了200px - 当你决定翻译多远时,你必须补偿你的比例因子! (4认同)
  • 看看这篇文章:http://iphonedevelopment.blogspot.com/2008/10/demystifying-cgaffinetransform.html - 我发现它非常有用! (2认同)
  • 经过几次测试后,看起来(0,0)锚点的变换是:double scale = 2; double translateX = self.frame.size.width*(scale-1)/ 2/scale; double translateY = self.frame.size.height*(scale-1)/ 2/scale; CGAffineTransform t = CGAffineTransformMakeScale(比例,比例); t = CGAffineTransformTranslate(t,translateX,translateY); self.transform = t; (2认同)

小智 5

这是我在Swift5中找到缩放视图同时保持其原点在适当位置 (0,0) 的方法

func animate() {
    myView.setAnchorPoint(CGPoint(x: 0, y: 0))
    myView.transform = CGAffineTransform(translationX: -0.5, y: -0.5)
    let animator = UIViewPropertyAnimator(duration: 0.3, curve: .easeOut) {
        self.myView.transform = CGAffineTransform(scaleX: 0.25, y: 0.25)
    }
}

extension UIView {
func setAnchorPoint(_ point: CGPoint) {
    var newPoint = CGPoint(x: bounds.size.width * point.x, y: bounds.size.height * point.y)
    var oldPoint = CGPoint(x: bounds.size.width * layer.anchorPoint.x, y: bounds.size.height * layer.anchorPoint.y);

    newPoint = newPoint.applying(transform)
    oldPoint = oldPoint.applying(transform)

    var position = layer.position

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

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

    layer.position = position
    layer.anchorPoint = point
}
}
Run Code Online (Sandbox Code Playgroud)

归功于使用 Swift 进行黑客攻击