为UIView实例设置semanticContentAttribute不会将布局应用于所有子视图

时间:2017-01-24 13:26:06

标签: ios iphone swift uiview

我有一个名为parentView的UIView实例,parentView有两个子视图:

1-名为label1的标签

2- anther UIView名为childView,其标签名为label2。

致电:

self.parentView.semanticContentAttribute = .forceRightToLeft

只有label1从左向右翻转,为什么childView没有翻转,不应该让parentView被所有孩子翻过来?

注意:所有视图都受到前导和尾随约束的约束。

我知道有一种可能的解决方案,即迭代所有子视图并设置它semanticContentAttribute,还有其他解决方案吗?

5 个答案:

答案 0 :(得分:0)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>属性不会传播到子视图。它旨在成为一个独立的用例,您必须在每个视图上更改属性。

如果您不得不对孩子进行迭代,可能会有更好的解决方案来解决您所面临的问题。你究竟想做什么?

答案 1 :(得分:0)

您可以使用它来翻转所有视图。希望这会有所帮助。基本上你需要应用阿拉伯语和英语的检查并翻转它

if UserDefaults.standard.value(forKey: "language") as? String == "ar" {
            UIView.appearance().semanticContentAttribute = .forceRightToLeft
        } else UserDefaults.standard.value(forKey: "language") as? String == "en" {
            UIView.appearance().semanticContentAttribute = .forceLeftToRight
        }

答案 2 :(得分:0)

您可以尝试以下方法:

func deactivateRTL(of view: UIView) {
    // 1. code here do something with view
    for subview in view.subviews {
        subview.semanticContentAttribute = .forceLeftToRight
        deactivateRTL(of: subview)
    }
}

答案 3 :(得分:0)

根据 Shairjeel 的回答,您可以使用以下功能

func switchDirection(view: UIView, newDirection: String) {
    if (newDirection == "ltr") {
        view.semanticContentAttribute = .forceLeftToRight
    } else {
        view.semanticContentAttribute = .forceRightToLeft
    }
    
    for subview in view.subviews {
        switchDirection(view: subview, newDirection: newDirection)
    }
}

你可以在 cellForRowAt 中这样调用它:

switchDirection(view: tableCell, newDirection: "ltr")

或整个 UIView

switchDirection(view: view, newDirection: "rtl")

答案 4 :(得分:-1)

尝试

yourView.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)

这将像镜像一样反转视图,因此您需要对subView进行相同操作

像这样:

subView.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)