开发中有这样的需求:
最终动画.gif
这是围绕右下角转动的动画
1.点击按钮围绕锚点转动:
- (void)buttondddd:(UIButton *)sender {
sender.selected = !sender.selected;
self.veiew.layer.anchorPoint = CGPointMake(1, 1);
self.veiew.transform = CGAffineTransformMakeRotation(M_PI * 0.15 * sender.selected);
}
效果如下:
未计算锚点.gif
2.发现改变了锚点,frame也变了,在网上找了篇文章,(这里)找到了计算公式
更改代码
- (void)buttondddd:(UIButton *)sender {
sender.selected = !sender.selected;
CGPoint oldOrigin = self.veiew.frame.origin;
self.veiew.layer.anchorPoint = CGPointMake(1, 1);
CGPoint newOrigin = self.veiew.frame.origin;
CGPoint transition;
transition.x = newOrigin.x - oldOrigin.x;
transition.y = newOrigin.y - oldOrigin.y;
self.veiew.center = CGPointMake (self.veiew.center.x - transition.x, self.veiew.center.y - transition.y);
self.veiew.transform = CGAffineTransformMakeRotation(M_PI * 0.15 * sender.selected);
}
效果如下
中间动画.gif
发现动画很生硬
3.加个动画过程
- (void)buttondddd:(UIButton *)sender {
sender.selected = !sender.selected;
CGPoint oldOrigin = self.veiew.frame.origin;
self.veiew.layer.anchorPoint = CGPointMake(1, 1);
CGPoint newOrigin = self.veiew.frame.origin;
CGPoint transition;
transition.x = newOrigin.x - oldOrigin.x;
transition.y = newOrigin.y - oldOrigin.y;
self.veiew.center = CGPointMake (self.veiew.center.transition.x, slf.veiew.center.y - transition.y);
[UIView animateWithDuration:.3 animations:^{
self.veiew.transform = CGAffineTransformMakeRotation(M_PI * 0.15 * sender.selected);
}];
}
最终效果
最终动画.gif