呈现SKStoreProductViewController会重新激活非活动约束

时间:2017-11-08 00:00:34

标签: ios nslayoutconstraint presentviewcontroller

我正在展示一个SKStoreProductViewController,并且遇到一些约束冲突。我可以验证是否正在重新激活先前的 de 激活的约束。我不明白为什么会发生这种情况。

请参阅下文,标有*** ———> <———— ***,以方便您阅读。

我能想到的唯一可能的问题是:我的应用程序仅支持横向,因此我必须继承SKStoreProductViewController.shouldAutorotate以返回false。

class MyProductViewController : SKStoreProductViewController {
    override var shouldAutorotate: Bool {
        return false
    }
}

func openStoreProduct(identifier: String) {
    let storeViewController = MyProductViewController()
    storeViewController.delegate = self

    let parameters = [ SKStoreProductParameterITunesItemIdentifier : identifier]
    storeViewController.loadProduct(withParameters: parameters) { [weak self] (loaded, error)  in
        if loaded {
            print("In: \(self?.myConstraint.isActive)")
            // *** ———> Prints "In: false". <——— ***

            self?.present(storeViewController, animated: true) {
        }
    }
}

func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) {
    print("Out: \(self.myConstraint.isActive)")
    // *** ———> prints "Out: true" <——— ***

    viewController.dismiss(animated: true, completion: nil)
}

1 个答案:

答案 0 :(得分:1)

问题在于,当从呈现StoreProduct控制器返回时,一些布局值已经恢复到它们的IB值,丢失了以编程方式设置的值,例如, isHiddenisActive

在这种情况下,我在某些情况下更换约束,但在不需要更改时将原始IB保持活动状态。从商店返回后,原始约束被重新 - 激活,但它们的替换仍然有效。当然他们有冲突。

解决方案是取消选中IB中约束的“已安装”复选框,并替换(并激活)每个所需案例的代码中的约束。

。而不是在你不想改变它时保持不变。

对于可能搞砸的其他UI内容,您可以在productViewControllerDidFinish()中设置一个标记,并在布局代码中对其进行测试。

此行为可能与问题中提到的格局问题相关。在iPhone上,StoreProductViewController以纵向模式显示 。当应用程序处于横向状态,并且当前ViewController呈现StoreProduct时,操作系统显示强制旋转应用程序为纵向,然后呈现商店。您可以简单地看到这种情况。 (这在iPad上不是问题,因为商店以任一方向呈现为弹出窗口。)