Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 自动布局约束动画从错误的点缩放_Ios_Swift_Animation_Autolayout_Constraints - Fatal编程技术网

Ios 自动布局约束动画从错误的点缩放

Ios 自动布局约束动画从错误的点缩放,ios,swift,animation,autolayout,constraints,Ios,Swift,Animation,Autolayout,Constraints,我正在尝试使用autolayout约束与UIStackView一起实现动画。有一个动画我被卡住了 我有一个UIImageView(绿色)嵌套在UIView(橙色)中,它依次由UIStackView处理。当只有这些图元保持可见时,视图应缩小。我正在尝试更改以下约束条件: 通常宽度和高度为64,前导/尾随/顶部/底部约束为10,我使用以下方法将它们分别更改为46和7: private func setImageShrunk() { imageWidth.constant = 46

我正在尝试使用autolayout约束与UIStackView一起实现动画。有一个动画我被卡住了

我有一个UIImageView(绿色)嵌套在UIView(橙色)中,它依次由UIStackView处理。当只有这些图元保持可见时,视图应缩小。我正在尝试更改以下约束条件:

通常宽度和高度为64,前导/尾随/顶部/底部约束为10,我使用以下方法将它们分别更改为46和7:

private func setImageShrunk() {
    imageWidth.constant = 46
    imageHeight.constant = 46
    imageTopMargin.constant = 7
    imageBottomMargin.constant = 7
    imageRightMargin.constant = 7
    imageLeftMargin.constant = 7
}
此函数由另一个函数调用:

func shrinkImage(animated: Bool) {
    if(animated) {
        UIView.animate(withDuration: 1) {
            self.setImageShrunk()
            self.layoutIfNeeded()
        }
    } else {
        setImageShrunk()
    }
}
当然,在没有动画的情况下收缩图像会突然返回预期结果。但是,尝试设置动画时,我得到了以下结果:


我希望视图向左上角收缩,而不是从中心收缩。它不应该“先移动,后缩放”。有人知道如何在iOS 11中使用AutoLayout来实现这一点吗?

如果设置宽度和高度,则不需要右和底部约束,如将高度从64更改为46,则底部距离应为28(10+18),并且由于将其设置为7,则会出现冲突,右侧也一样,因此请删除它们,或者降低他们的优先级


顺便说一句,只有当橙色视图的宽度和高度有其他约束时,所有这些才有效。是否设置了UIView的定位点?它现在在中心点而不是左上角收缩。您还应该创建一个自定义动画来定义这两个动画,并将它们链接在一起。你可以在网上找到很多解决方案,但这里有一个例子。这是雪碧套件,但想法是一样的

        #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])
实际上,在这里,分组产生了魔力

以下是苹果文档中的核心动画解决方案

let fadeOut = CABasicAnimation(keyPath: "opacity")
fadeOut.fromValue = 1
fadeOut.toValue = 0
fadeOut.duration = 1

let expandScale = CABasicAnimation()
expandScale.keyPath = "transform"
expandScale.valueFunction = CAValueFunction(name: kCAValueFunctionScale)
expandScale.fromValue = [1, 1, 1]
expandScale.toValue = [3, 3, 3]

let fadeAndScale = CAAnimationGroup()
fadeAndScale.animations = [fadeOut, expandScale]
fadeAndScale.duration = 1

所以我想出了一个小项目来重现错误时发生的事情

在第二个项目中,设置是相同的,但动画的工作方式与我预期的一样。经过一番思考,我意识到在这个新项目中,我调用了
UIViewController
中包含
UIStackView
的动画

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


我通过将要执行的动画传输到包含
UIStackView

UIViewController
解决了这个问题。如果将0而不是7用于上页边距和左页边距,会发生什么?抱歉,我以为页边距用于橙色视图及其超级视图。可以将橙色视图顶部和左侧的约束设置为其超级视图,并在shrinkImage中将其设置为0method@AliMoazenzadeh顶部和左侧的约束已设置为0,这就是为什么发生这种情况让我如此困惑的原因。您可以尝试将顶部和左侧的边距约束优先级设置为低于1000的值吗?990美元example@AliMoazenzadeh我已经尝试过使用优先级,结果是…谢谢,在我的例子中,我只需要在父视图上调用
layoutifneed()
,而不是动画视图本身