我不了解转化的东西.我想放大一下UIView的右上角(主视图).我使用CGAffineTransformScale并试过设置center/anchorPoint以及CGAffineTransformMakeTranslation无效.
我无法弄清楚如何正确设置翻译,以便放大这一点.
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, 2, 2);
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
self.view.transform = tr;
self.view.center = CGPointMake(480,0);
} completion:^(BOOL finished) {}];
Run Code Online (Sandbox Code Playgroud) 我花了很多时间试图找到一种方法来使用CGAffineScale将视图转换为给定点,包括弄乱锚点,在转换之前和之后移动视图的中心以及全面的Google搜索.我知道使用UIScrollview会更简单; 但是我知道技术上可以不用一个,而且它在我脑海里成了一个分裂.
这个答案非常接近我想要实现的目标,但答案只提供了如何通过巧妙地将中心移动到与要放大的角相对的角落来放大到给定角(而不是给定点)的细节. .
如何修改mvds的代码以将UIView扩展到UIView中的任何给定点?
CGFloat s = 3;
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s);
CGFloat h = self.view.frame.size.height;
CGFloat w = self.view.frame.size.width;
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{
self.view.transform = tr;
self.view.center = CGPointMake(w-w*s/2,h*s/2);
} completion:^(BOOL finished) {}];
Run Code Online (Sandbox Code Playgroud) 我正在尝试使恒星“呼吸”在一个循环中。变大然后变小,然后重复。我希望在我的应用程序仍在运行并响应时继续执行此操作。当我在应用程序中转到另一个视图时,我希望动画停止播放。
这就是我得到的
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.async {
self.animateStars()
}
}
func animateStars() {
UIView.animate(withDuration: 4, animations : {
self.star.transform = CGAffineTransform(scaleX: 2.5, y: 2.5)
}) { finished in
NSLog("Star is big. Finished = \(finished)")
}
UIView.animate(withDuration: 4, animations : {
self.star.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
}) { finished in
NSLog("Star is small. Finished = \(finished)")
}
}
Run Code Online (Sandbox Code Playgroud)
这并不困难。而且,我不知道如何在用户单击带有segue的按钮时不让它在后台疯狂运行的情况下使其循环。
我在Objective C中找到了一种解决方案,但是我似乎无法理解如何将其转换为Swift 3.0。此处的示例:https : //stackoverflow.com/a/31978173/5385322
[UIView animateWithDuration:1
delay:0
options:UIViewKeyframeAnimationOptionAutoreverse | UIViewKeyframeAnimationOptionRepeat
animations:^{
yourView.transform = CGAffineTransformMakeScale(1.5, 1.5);
}
completion:nil]; …Run Code Online (Sandbox Code Playgroud)