使用 CGAffineTransformScale 自定义 UIView 缩放

Posted

技术标签:

【中文标题】使用 CGAffineTransformScale 自定义 UIView 缩放【英文标题】:Custom UIView scaling using CGAffineTransformScale 【发布时间】:2014-03-01 22:25:24 【问题描述】:

我正在学习为 ios 开发,作为教育过程的一部分,我创建了自定义 UIView,它使用 drawRect 绘制其内容(基于核心图形 + UIBezierPath)。一切都按预期工作,视图是动态的,并根据其宽度/高度呈现其内容。现在我想添加溶解动画,看起来应该从 100% 缩放到 0%。我已经写了这段代码来做到这一点:

[UIView animateWithDuration:1 delay:0
                options: UIViewAnimationOptionBeginFromCurrentState
             animations: ^
     for (CardView *cardView in self.cardsViews) 
         cardView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.01, 0.01);

      completion:nil];

但是,此代码不会将我的视图从 100% 缩放到 0%。它只会让卡片消失(最多)。我尝试了很多缩放方法,但到目前为止我达到的唯一效果是从 0% 缩放到 100%。这是我的观点完美,但不是反向缩放......此外,即使我尝试应用非动画转换,它也不会放大/缩小,例如:

cardView.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.5, 0.5);

我看到我的视图外观发生了一点变化,但没有缩放到 50%,这是肯定的。当我尝试将完全相同的动画逻辑应用于 UILabel 时,它可以完美运行!开发自定义 UIView 我错过了什么?为什么缩放视图可能会出现故障? 提前非常感谢!

更新 #1 此代码使我的视图正好大两倍,然后将其缩放回原始大小:

[UIView animateWithDuration:5 delay:0
                    options: UIViewAnimationOptionBeginFromCurrentState
                 animations: ^
         for (CardView *cardView in self.cardsViews) 
             cardView.transform = CGAffineTransformMakeScale(0.5, 0.5);
         
     completion:nil];

【问题讨论】:

您是否尝试过添加动画选项UIViewAnimationOptionAllowAnimatedContent 谢谢。是的,我试过了。没运气。此外,即使没有动画,我的自定义视图也不会缩放... @Serzhas 你用这个有什么收获吗? 是的,我记得我以某种方式解决了这个问题,但那是很久以前的事了,我不再从事那个项目了,所以我无法检查代码......抱歉。 ?????? 【参考方案1】:

使用 CGAffineTransformScale 很简单 100% 到 0%:

cardView.view.transform =CGAffineTransformScale(CGAffineTransformIdentity, 1.1, 1.1);

[UIView animateWithDuration:0.3/1.5 animations:^
        cardView.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, 0.1, 0.1);
     completion:^(BOOL finished)
    
              NSLog(@" Animation complet Block");
    ];

【讨论】:

【参考方案2】:

您可以尝试将视图的contentMode 设置为UIViewContentModeRedraw 并在animateWithDuration 方法中添加另一个动画选项 - UIViewAnimationOptionAllowAnimatedContent

【讨论】:

谢谢!我会尝试并报告。 不,不幸的是,这无济于事......我的视图已经有适当的 contentMode,添加动画选项没有任何区别。请注意,即使没有动画,我的视图也不会缩放。只是试图使它成为原始的 50% 不会做任何事情......:/【参考方案3】:

从 120% 快速缩放到 100%:

logoView.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
UIView.animate(withDuration: 0.55, delay: 0.1, options: [.curveEaseOut], animations: 
    self.logoView.transform = .identity
    self.view.layoutIfNeeded()
, completion:  _ in
)

【讨论】:

以上是关于使用 CGAffineTransformScale 自定义 UIView 缩放的主要内容,如果未能解决你的问题,请参考以下文章

使用 CGAffineTransformScale 自定义 UIView 缩放

通过 CGAffineTransformScale 计算的 bounds、frame 和 frame 之间的差异

求解答CGAffineTransformScale造成字体模糊的问题

求解答CGAffineTransformScale造成字体模糊的问题

如何使用 CGAffineTransform Scale 从右到左添加动画和放大动画

捏手势IOS的手势绑定限制