悬挂(冻结)问题UISemanticContentAttribute = .ForceRightToLeft

时间:2017-01-10 09:29:43

标签: ios iphone swift localization ios9

我在内部切换应用程序语言(LTR-RTL),然后重新初始化故事板。

这是一段代码:

let semanticContentAttribute: UISemanticContentAttribute = language == .Arabic ? .ForceRightToLeft : .ForceLeftToRight

UIView.appearance().semanticContentAttribute = semanticContentAttribute
UINavigationBar.appearance().semanticContentAttribute = semanticContentAttribute

问题是,所有呈现的视图控制器在解除它时冻结3-6秒。

造成这种情况的原因是什么?

2 个答案:

答案 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中)