【问题标题】:Position subviews on superview based on subview count根据子视图计数在超级视图上定位子视图
【发布时间】:2016-06-29 16:32:42
【问题描述】:

需要根据子视图计数从超级视图的中心放置子视图。 如果子视图计数是奇数,则中间视图将位于超级视图的中心,其余视图将相对于它以项目间距放置。

如果子视图计数是偶数,则子视图将以偏移量放置。

是否有任何通用的解决方案可以在没有太多条件和使用自动布局计算的情况下解决这个问题?

所有子视图的大小相同

【问题讨论】:

  • 你可以引入另一个 uiview 来包含所有这些子视图,然后简单地在初始父视图中居中该视图。
  • 为什么不使用 UICollectionView 并调整项目大小以适应子视图?如果您觉得这太过分了,您可以使用堆栈视图来获得相同的结果。

标签: ios swift uiview autolayout alignment


【解决方案1】:

您必须在主视图中再查看 1 个视图,其中包括您的奇数或偶数 subviews。然后你需要在它们之间设置等宽和等高约束。因此,根据您的subviews 数量和屏幕大小,它们都会自动定位。

【讨论】:

    【解决方案2】:

    解决方案 1:UIStackView

        let totalSubviews = 4
        let stackView = UIStackView()
        view.addSubview(stackView)
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .Horizontal
        stackView.distribution = .EqualSpacing
        stackView.alignment = .Center
        stackView.spacing = 10
        stackView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor, constant: 0).active = true
        stackView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor, constant: 0).active = true
        stackView.backgroundColor = UIColor.greenColor()
    
        for _ in 0 ..< totalSubviews {
            let subview = UIView()
            stackView.addArrangedSubview(subview)
            subview.translatesAutoresizingMaskIntoConstraints = false
            subview.backgroundColor = UIColor.redColor()
            subview.heightAnchor.constraintEqualToConstant(50).active = true
            subview.widthAnchor.constraintEqualToConstant(50).active = true
        }
    

    解决方案 2:自动布局

    您通常可以使用 AutoLayout 来做到这一点。

    totalSubviews = 4

    totalSubviews = 5

    代码

        let totalSubviews = 4
        let spacing = CGFloat(20)
        var subviews = [UIView]()
    
        var previousSubview: UIView?
        for i in 0 ..< totalSubviews {
            let subview = UIView()
            subviews.append(subview)
            view.addSubview(subview)
            subview.translatesAutoresizingMaskIntoConstraints = false
            subview.backgroundColor = UIColor.redColor()
    
            view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1, constant: spacing))
    
            if i == 0 {
                view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Left, relatedBy: .Equal, toItem: view, attribute: .Left, multiplier: 1, constant: spacing))
            }
            else if i < totalSubviews {
                view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Left, relatedBy: .Equal, toItem: previousSubview, attribute: .Right, multiplier: 1, constant: spacing))
            }
            if i == totalSubviews - 1 {
                view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Right, relatedBy: .Equal, toItem: view, attribute: .Right, multiplier: 1, constant: -spacing))
            }
    
            if i != 0 {
                view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Width, relatedBy: .Equal, toItem: previousSubview!, attribute: .Width, multiplier: 1, constant: 0))
            }
    
    
            view.addConstraint(NSLayoutConstraint(item: subview, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: 100))
    
            previousSubview = subview
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多