使用UIView.transition(from,to)和autoLayout约束

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用UIView.transition(from,to)和autoLayout约束相关的知识,希望对你有一定的参考价值。

我正试图显示一张卡片并轻轻翻转该卡片。

为此我有一个UIView,它充当两个独立的UIViews(frontView,backView)的容器视图。我已将tapGestureRecognizer附加到容器视图,并调用下面的函数。

@objc func flipCard() {
    print("Flipping card")

    if showingBack == true {
        UIView.transition(from: backView, to: frontView, duration: 0.3, options: .transitionFlipFromLeft, completion: nil)
        showingBack = false
    } else {
        UIView.transition(from: frontView, to: backView, duration: 0.3, options: .transitionFlipFromRight, completion: nil)
        showingBack = true
    }
}

第一次翻转工作,翻转不起作用 - 卡片只是消失了。我能够弄清楚,只要我将这两个子视图的AutoresizingMaskIntoConstraints设置为true,翻转就可以正常工作,如下所示:

@objc func flipCard() {
    print("Flipping card")
    frontView.translatesAutoresizingMaskIntoConstraints = true
    backView.translatesAutoresizingMaskIntoConstraints = true

    if showingBack == true {
        UIView.transition(from: backView, to: frontView, duration: 0.3, options: .transitionFlipFromLeft, completion: nil)
        showingBack = false
    } else {
        UIView.transition(from: frontView, to: backView, duration: 0.3, options: .transitionFlipFromRight, completion: nil)
        showingBack = true
    }
}

但是,将AutoresizingMaskIntoConstraints设置为true会在我的视图中导致一些UI冲突,这就是为什么我要避免这种情况。我很感激有关如何解决这个问题的提示。并且有人可以解释为什么这首先发生了这种情况吗?

非常感激!

答案

如果translatesAutoresizingMaskIntoConstraints给你带来问题,试试这个:

@objc func flipCard() {
    print("Flipping card")
    frontView.translatesAutoresizingMaskIntoConstraints = true
    backView.translatesAutoresizingMaskIntoConstraints = true

    if showingBack == true {
        UIView.transition(from: backView, to: frontView, duration: 0.3, options: .transitionFlipFromLeft) { (success) in
            frontView.translatesAutoresizingMaskIntoConstraints = false
            backView.translatesAutoresizingMaskIntoConstraints = false
            showingBack = false
        }
    } else {
        UIView.transition(from: frontView, to: backView, duration: 0.3, options: .transitionFlipFromRight) { (success) in
            frontView.translatesAutoresizingMaskIntoConstraints = false
            backView.translatesAutoresizingMaskIntoConstraints = false
            showingBack = true
        }
    }
}

if translatesAutoresizingMaskIntoConstraints = true表示系统创建一组约束,复制视图的自动调整掩码指定的行为。当它为假时,意味着正在使用纯约束(NSLayoutConstraint)。

此外,请注意:

默认情况下,对于以编程方式创建的任何视图,该属性都设置为true。如果在Interface Builder中添加视图,系统会自动将此属性设置为false。

另一答案

我有一个不断翻转的UIView容器,使用false。我所做的是以不同方式处理options参数,将.showHideTransitionViews添加到翻转方向。没有这个,我只是翻了一下然后......没事。

这有点奇怪,因为你不能“只是”添加它(至少在Swift 3 ios 10天内),但这是你可能尝试的:

let flipFromLeftOptions: UIViewAnimationOptions = [.transitionFlipFromLeft, .showHideTransitionViews]
let flipFromRightOptions: UIViewAnimationOptions = [.transitionFlipFromRight, .showHideTransitionViews]

并在转换代码中:

if showingBack == true {
    UIView.transition(from: backView, to: frontView, duration: 0.3, options: flipFromLeftOptions, completion: nil)
    showingBack = false
} else {
    UIView.transition(from: frontView, to: backView, duration: 0.3, options: flipFromRightOptions, completion: nil)
    showingBack = true
}

以上是关于使用UIView.transition(from,to)和autoLayout约束的主要内容,如果未能解决你的问题,请参考以下文章

点击按钮,使按钮进行左右翻转动画

无法使用 UIViewPropertyAnimator.fractionComplete 驱动 UIView.transition

UIView.transition 后单元格的结构被破坏

为什么我的UIView.transition动画代码不会影响显示?

如何在 Swift 中多次为 UIView 的翻转设置动画

如何在 Swift 中缩放卡片时翻转卡片