【发布时间】:2014-06-18 22:16:24
【问题描述】:
我需要将 UIView 从屏幕中心平移和缩放到右上角。
_____________________________
| |
| |
| _________ |
| | | | START
| | | |
| |_________| |
| |
| |
|____________________________|
_____________________________
| __ |
| |__| |
| |
| | END
| |
| |
| |
| |
|____________________________|
我验证了我对比例和平移的个人计算是准确的。但是一旦它们放在一起,它们就会相互冲突。以下代码使视图最终离中心太近。
CGFloat finalPadding = 10.0f;
CGFloat finalScale = 46.0f / 170.0f;
CGFloat finalX = self.view.frame.size.width
- self.platformProgressView.frame.size.width * finalScale
- finalPadding;
CGFloat finalY = finalPadding;
CGFloat deltaX = finalX - self.platformProgressView.frame.origin.x;
CGFloat deltaY = finalY - self.platformProgressView.frame.origin.y;
[UIView
animateWithDuration:1.0
delay:1.0
options:UIViewAnimationOptionCurveEaseOut
animations:^(void){
self.platformProgressView.transform = CGAffineTransformConcat(
CGAffineTransformMakeTranslation(deltaX, deltaY),
CGAffineTransformMakeScale(finalScale, finalScale)
);
}
completion:^(BOOL finished) {
}
];
最终效果:
_____________________________
| |
| |
| __ |
| |__| |
| |
| |
| |
| |
|____________________________|
更改乘法的顺序会导致视图偏离屏幕的右边缘。
self.platformProgressView.transform = CGAffineTransformConcat(
CGAffineTransformMakeScale(finalScale, finalScale),
CGAffineTransformMakeTranslation(deltaX, deltaY)
);
最终效果(预计):
_____________________________
| |
| | __
| | |__|
| |
| |
| |
| |
| |
|____________________________|
单独应用它们会导致突然跳跃,最终位置更糟。
self.platformProgressView.transform = CGAffineTransformMakeTranslation(deltaX, deltaY);
self.platformProgressView.transform = CGAffineTransformMakeScale(finalScale, finalScale);
最终效果:
_____________________________
| |
| |
| |
| |
| __ |
| |__| |
| |
| |
|____________________________|
【问题讨论】:
-
我更新了我的答案。我不确定系统是否会通知你,所以我写这篇评论是为了确保你得到一个 ping。
标签: ios cocoa-touch matrix linear-algebra