【问题标题】:How do you apply a transform to a UILabel before animating in Swift?在 Swift 中制作动画之前,如何对 UILabel 应用变换?
【发布时间】:2018-12-13 16:54:03
【问题描述】:

我希望在视图动画比例之前旋转视图而不进行动画。如果我之后有动画,我现在拥有它的方式会忽略我的初始视图旋转。

label.transform = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))

animateLabel(label:label)

func animateLabel(label:UILabel) {

    label.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)

    UIView.animate(withDuration: 0.2, animations: {
        label.transform = CGAffineTransform(scaleX: 1.1, y: 1.1)
    },
    completion: { _ in
        UIView.animate(withDuration: 0.1) {
            label.transform = CGAffineTransform(scaleX: 1.0, y: 1.0)

        }
    })

}

更新:我如何使用 Matt 的答案更新我的代码,使其正确动画:

我首先将初始旋转设置为一个变换变量,然后在我调用 animateLabel 时发送它:

var transforms: CGAffineTransform = .identity

transforms = transforms.concatenating(CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180)))

animateLabel(label:label, transforms:transforms)

我连接比例并将变换设置为修改后的变换。然后我可以使用 scale by 来制作实际的动画:

func animateLabel(label:UILabel, transforms:CGAffineTransform) {

    transforms.concatenating(CGAffineTransform(scaleX: 0.6, y: 0.6))

    label.transform = transforms

    UIView.animate(withDuration: 0.2, animations: {
        label.transform = transforms.scaledBy(x: 1.1, y: 1.1)
    },
    completion: { _ in
        UIView.animate(withDuration: 0.1) {
            label.transform = transforms.scaledBy(x: 1.0, y: 1.0)
        }
    })

}

【问题讨论】:

  • 是的,因为您在 animateLabel 函数的开头应用了新的转换。
  • 我明白了,但是如何使这种轮换永久化?我什至尝试重新定义身份。
  • 您需要创建结合旋转和缩放的新变换。您可以查看CGAffineTransform.scaledBy 来修改现有的变换,或者查看CGAffineTransform.concatenating 来组合2 个变换。
  • 实际上 scaleBy 不会为视图设置动画。没关系

标签: swift rotation uilabel transform


【解决方案1】:

如果我之后有动画,我现在的方式会忽略我的初始视图旋转。

很容易看出原因。一个视图只有一个变换。您的第二个转换替换第一个:

label.transform = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))
label.transform = CGAffineTransform(scaleX: 0.6, y: 0.6)

这就是你正在做的事情。相反,您需要应用第二个转换第一个。查看将第二个转换与第一个转换相结合的方法,而不是完全替换第一个。例如https://developer.apple.com/documentation/coregraphics/cgaffinetransform/1455882-scaledby

因此我很容易得到这个,这似乎是你想要的粗略近似:

为此,我准备了两个变换,旋转,加上旋转加缩放:

    let rot = CGAffineTransform(rotationAngle: CGFloat(90.0 * .pi / 180))
    let scale = rot.scaledBy(x: 1.5, y: 1.5)

【讨论】:

  • 是的,我告诉你为什么你现在拥有的东西是错的!
  • 我从来没有真正理解过 Apple 文档。
  • 您介意发布答案而不是链接到文档吗?我知道我所做的没有用,但我仍然不明白如何使它工作,或找到任何例子。使用 scaleBy 也不会为视图设置动画。
  • 我需要更好地描述您想要达到的效果。是不是视图应该跳转到一个旋转的角度,然后用动画摆动它的比例,然后保持旋转?
  • 嗨,马特,没错 - 视图应该已经旋转,然后以相同的旋转为比例设置动画。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多