【问题标题】:Stackview exchange or change order of viewsStackview 交换或更改视图顺序
【发布时间】:2017-05-10 15:21:46
【问题描述】:

包含文本字段数组的 Stackview 嵌入在滚动视图中。我想更改某些操作的文本字段的顺序。删除和添加文本字段的方式会导致视图失真。我还通过从滚动视图中删除进行了测试。正常的 stackview 也没有正确显示交换。我正在使用索引进行更改:


stackView.removeArrangedSubview(localityTF) stackView.insertArrangedSubview(localityTF, at: 2)

【问题讨论】:

    标签: ios uiview autolayout uistackview stackview


    【解决方案1】:

    这是一种奇怪的行为,但自动布局系统存在问题,应该先更新它,然后才能重新添加 localityTF。也不要忘记removeArrangedSubview 不会从子视图数组中删除视图:

    [self.stackView removeArrangedSubview:_label1];
    [self.stackView setNeedsLayout];
    [self.stackView layoutIfNeeded];
    
    [self.stackView insertArrangedSubview:_label1 atIndex:2];   
    [self.stackView setNeedsLayout];
    

    【讨论】:

    • 非常感谢。效果很好。在好奇之间,你是如何想出这个解决方案的。 @安德鲁
    • 然后我尝试删除并附加子视图,我看到有关约束的异常(然后我将视图附加回来)。我知道如果您更改约束,自动布局引擎需要布局。之后我尝试添加布局调用,一切都已修复。
    • 我认为您不需要先将其删除...[ insertArrangedSubview:atIndex:] 将自动重新排列视图,如果它已经在其中。
    【解决方案2】:

    这是我在 Swift 3 中的解决方案。也可以使用它无需在stackview中定义视图。

    这里我用两个视图来改变 Stackview 的视图位置:

    if let myView = stackView.subviews.first {
        stackView.removeArrangedSubview(myView)
        stackView.setNeedsLayout()
        stackView.layoutIfNeeded()
    
        stackView.insertArrangedSubview(myView, at: 1)
        stackView.setNeedsLayout()
    }
    

    【讨论】:

      【解决方案3】:

      尝试使用这组代码替换 UIStackView 中的视图,而不刷新任何布局。

      if let objView = stackView.arrangedSubviews.first {
              objView.removeFromSuperview()
      }
      stackView.insertArrangedSubview(yourView, at: 0)
      

      【讨论】:

        【解决方案4】:

        这个解决方案非常有效。 每次调用它,它都会将第一个堆栈元素视图更改为最后一个,反之亦然。

          if let first = stackView.subviews.first, let last = stackView.subviews.last {
            stackView.subviews.forEach { $0.removeFromSuperview() }
            stackView.insertArrangedSubview(last, at: 0)
            stackView.insertArrangedSubview(first, at: 1)
            stackView.setNeedsLayout()
            stackView.layoutIfNeeded()
          }
        

        【讨论】:

          【解决方案5】:

          如果您使用水平轴:

          stackView.semanticContentAttribute = .forceRightToLeft
          

          如果您使用垂直轴:

          import UIKit
          
          enum VerticalSemanticContentAttribute {
              case forceTopToBottom, forceBottomToTop
          }
          
          final class VerticalStackView: UIStackView {
               var verticalSemanticContentAttribute:  VerticalSemanticContentAttribute = .forceTopToBottom {
                  didSet {
                       guard oldValue != verticalSemanticContentAttribute else { return }
                  
                       reverseArrangedSubviews()
                  }
              }
          
              override init(frame: CGRect) {
                  super.init(frame: frame)
              
                  axis = .vertical
              }
          
              required init(coder: NSCoder) {
                  super.init(coder: coder)
              
                  axis = .vertical
              }
          }
          
          // MARK: - Private functions
          private extension VerticalStackView {
              func reverseArrangedSubviews() {
                  let totalCount = arrangedSubviews.count
              
                  for (index, view) in arrangedSubviews.enumerated().reversed() where index != 0 { // we don't need to reposition the last item. It's already in the right position
                      removeArrangedSubview(view)
                      view.removeFromSuperview()
                      setNeedsLayout()
                      layoutIfNeeded()
                  
                      let insertIndex = totalCount - index - 1
                      insertArrangedSubview(view, at: insertIndex)
                      setNeedsLayout()
                      layoutIfNeeded()
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-03-23
            • 2015-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多