我在内部切换应用程序语言(LTR-RTL),然后重新初始化故事板。
这是一段代码:
let semanticContentAttribute: UISemanticContentAttribute = language == .Arabic ? .ForceRightToLeft : .ForceLeftToRight
UIView.appearance().semanticContentAttribute = semanticContentAttribute
UINavigationBar.appearance().semanticContentAttribute = semanticContentAttribute
问题是,所有呈现的视图控制器在解除它时冻结3-6秒。
造成这种情况的原因是什么?
答案 0 :(得分:0)
不支持在semanticContentAttribute
代理上设置appearance()
。您会遇到许多其他问题和错误,因为该应用仍然认为它使用的语言并不是您所覆盖的语言。
为您的应用添加语言切换器只会让它更加混乱;用户希望他们的应用遵循其设备设置的语言。
答案 1 :(得分:0)
经过长时间的搜寻,我找到了解决方案。
UI冻结/挂起的原因是因为在根视图上执行手势时,UINavigationController缺少对根视图控制器的检查。有几种方法可以解决此问题,以下是我的工作。
您应该继承UINavigationController的子类,这是添加工具的正确方法,如下所示:
class RTLNavController: UINavigationController, UINavigationControllerDelegate, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Adding swipe to pop viewController
self.interactivePopGestureRecognizer?.isEnabled = true
self.interactivePopGestureRecognizer?.delegate = self
// UINavigationControllerDelegate
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
navigationController.view.semanticContentAttribute = UIView.isRightToLeft() ? .forceRightToLeft : .forceLeftToRight
navigationController.navigationBar.semanticContentAttribute = UIView.isRightToLeft() ? .forceRightToLeft : .forceLeftToRight
}
// Checking if the viewController is last, if not disable the gesture
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if self.viewControllers.count > 1 {
return true
}
return false
}
}
extension UIView {
static func isRightToLeft() -> Bool {
return UIView.appearance().semanticContentAttribute == .forceRightToLeft
}
}
资源:
原始问题:
答案用于解决方案:
可能更有效的其他解决方案(但在Objective-C中)