呈现 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 值,丢失了以编程方式设置的值,例如isHidden
、isActive
等
在这种情况下,我在某些情况下替换了约束,但在不需要更改时让原始 IB 处于活动状态。从商店 return 开始,原始约束被 重新 激活,但它们的替换 也 仍然有效。当然他们有冲突。
解决方案是在 IB 中取消选中约束的 "Installed" 复选框,并在 每个 所需情况的代码中替换(并激活)约束。而不是当你不想改变它时让它保持原样。
对于其他 UI 可能会弄乱的东西,您可以在 productViewControllerDidFinish()
中设置一个标志并在您的布局代码中对其进行测试。
此行为可能与问题中提到的景观问题有关。在 iPhone 上,StoreProductViewController 仅 以纵向模式显示。当应用程序处于横向状态时,当前 ViewController 显示 StoreProduct 一个,OS 显然 force-rotates 应用程序为纵向,然后显示商店。您可以看到这种情况短暂发生。 (这在 iPad 上不是问题,因为商店在任一方向上都显示为弹出窗口。)
我正在展示一个 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 值,丢失了以编程方式设置的值,例如isHidden
、isActive
等
在这种情况下,我在某些情况下替换了约束,但在不需要更改时让原始 IB 处于活动状态。从商店 return 开始,原始约束被 重新 激活,但它们的替换 也 仍然有效。当然他们有冲突。
解决方案是在 IB 中取消选中约束的 "Installed" 复选框,并在 每个 所需情况的代码中替换(并激活)约束。而不是当你不想改变它时让它保持原样。
对于其他 UI 可能会弄乱的东西,您可以在 productViewControllerDidFinish()
中设置一个标志并在您的布局代码中对其进行测试。
此行为可能与问题中提到的景观问题有关。在 iPhone 上,StoreProductViewController 仅 以纵向模式显示。当应用程序处于横向状态时,当前 ViewController 显示 StoreProduct 一个,OS 显然 force-rotates 应用程序为纵向,然后显示商店。您可以看到这种情况短暂发生。 (这在 iPad 上不是问题,因为商店在任一方向上都显示为弹出窗口。)