我正在展示一个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)
}
答案 0 :(得分:1)
问题在于,当从呈现StoreProduct控制器返回时,一些布局值已经恢复到它们的IB值,丢失了以编程方式设置的值,例如, isHidden
,isActive
等
在这种情况下,我在某些情况下更换约束,但在不需要更改时将原始IB保持活动状态。从商店返回后,原始约束被重新 - 激活,但它们的替换也仍然有效。当然他们有冲突。
解决方案是取消选中IB中约束的“已安装”复选框,并替换(并激活)每个所需案例的代码中的约束。
。而不是在你不想改变它时保持不变。对于可能搞砸的其他UI内容,您可以在productViewControllerDidFinish()
中设置一个标记,并在布局代码中对其进行测试。
此行为可能与问题中提到的格局问题相关。在iPhone上,StoreProductViewController以纵向模式显示 。当应用程序处于横向状态,并且当前ViewController呈现StoreProduct时,操作系统显示强制旋转应用程序为纵向,然后呈现商店。您可以简单地看到这种情况。 (这在iPad上不是问题,因为商店以任一方向呈现为弹出窗口。)