AutoLayout约束动画从错误的点缩放

时间:2018-08-22 14:29:40

标签: ios swift animation autolayout constraints

我正在尝试使用自动布局约束与UIStackViews一起制作动画。有一种动画我很喜欢。

我有一个嵌套在UIView(橙色)中的UIImageView(绿色),然后由UIStackView处理。当仅保留那些元素可见时,视图应缩小。我正在尝试更改以下约束:

The constraints of the Views

通常宽度和高度为64,前/后/上/下约束为10,我正在使用以下方法将它们分别更改为46和7:

<label id="label" value="${name}" />

此函数由另一个函数调用:

private func setImageShrunk() {
    imageWidth.constant = 46
    imageHeight.constant = 46
    imageTopMargin.constant = 7
    imageBottomMargin.constant = 7
    imageRightMargin.constant = 7
    imageLeftMargin.constant = 7
}

缩小图像而不显示动画会突然返回预期结果。但是,尝试制作动画,我得到以下结果:

Animation mishap

我希望视图朝左上角缩小,而不是从中心缩小。它不应该“先移动,后扩展”。有谁知道如何在iOS 11中使用AutoLayout实现此目的?

3 个答案:

答案 0 :(得分:1)

所以我想出了一个小项目来重新创建错误的过程。

在第二个项目中,设置是相同的,但是动画按预期运行。经过一番思考,我意识到在这个新项目中,我从UIViewController 包含 UIStackView的动画中调用了动画。

在最初的问题中,我忽略了提及我是从扩展了UIStackView的类中调用动画的,因此视图本身也要动画。尽管View从外部引用了约束,但它不知道其环境和嵌入View。这就是为什么它会跳跃然后缩放的原因。

我通过将要完成的动画转移到包含UIViewController的{​​{1}}来解决了这个问题。

答案 1 :(得分:0)

如果您设置width和height,则不需要左右限制,例如将高度从64更改为46时,底部距离应为28(10 + 18),并且将其设置为7,那么就会有冲突,对于权利也是如此,因此要么删除它们,要么降低其优先级

顺便说一句,只有在橙色视图对宽度和高度有其他限制的情况下,所有这一切才有效

答案 2 :(得分:0)

您是否设置了UIView的锚点?现在它在中心点而不是左上角收缩。另外,您应该创建一个自定义动画,定义这两个动画并将它们链接在一起。您可以在网上找到很多解决方案,但这是一个示例。它是用于精灵工具包,但想法是相同的。

Query<A> query = await Query<A>(context)
    ..join(set: (a) => a.ab);

实际上,分组使神奇。

这是Apple文档中针对核心动画的解决方案。

        #if os(iOS)
    let transform:SKAction = SKAction.move(to: CGPoint(x: -40, y: -45), duration: 0.3)
    let rotateAction:SKAction = SKAction.rotate(toAngle: degree(-20), duration: 0.3)
        #else
        let transform:SKAction = SKAction.move(to: CGPoint(x: -40, y: 60), duration: 0.3)
        let rotateAction:SKAction = SKAction.rotate(toAngle: degree(-20), duration: 0.3)
        #endif
    let endAction:SKAction = SKAction.perform(#selector(GameScene.animateToTableEnded), onTarget: self)
    let combineAction:SKAction = SKAction.sequence([SKAction.group([transform, rotateAction]), endAction])