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

Presenting SKStoreProductViewController re-activates inactive constraint

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

见下文,为方便阅读,标有*** ———> <———— ***

我能想到的唯一可能的陷阱是:我的应用程序是横向的,所以我必须将 SKStoreProductViewController.shouldAutorotate 子类化为 return 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)
}

问题是当 return显示 StoreProduct 控制器时,一些布局值已恢复为它们的 IB 值,丢失了以编程方式设置的值,例如isHiddenisActive

在这种情况下,我在某些情况下替换了约束,但在不需要更改时让原始 IB 处于活动状态。从商店 return 开始,原始约束被 重新 激活,但它们的替换 仍然有效。当然他们有冲突。

解决方案是在 IB 中取消选中约束的 "Installed" 复选框,并在 每个 所需情况的代码中替换(并激活)约束。而不是当你不想改变它时让它保持原样。

对于其他 UI 可能会弄乱的东西,您可以在 productViewControllerDidFinish() 中设置一个标志并在您的布局代码中对其进行测试。

此行为可能与问题中提到的景观问题有关。在 iPhone 上,StoreProductViewController 以纵向模式显示。当应用程序处于横向状态时,当前 ViewController 显示 StoreProduct 一个,OS 显然 force-rotates 应用程序为纵向,然后显示商店。您可以看到这种情况短暂发生。 (这在 iPad 上不是问题,因为商店在任一方向上都显示为弹出窗口。)