【问题标题】:iOS : how to programmatically auto layout a horizontal table view?iOS:如何以编程方式自动布局水平表格视图?
【发布时间】:2015-04-12 13:51:31
【问题描述】:

我正在尝试编写自己的 iOS 菜单,并且我有一个水平 UITableView 作为我的自定义 UIView(我的菜单视图)的子视图。现在在 layoutSubviews() 中,我必须布置我的 UITableView(我对所有其他子视图使用 NSLayoutConstraint.constraintsWithVisualFormat),但问题是 tableViews 的“高度”实际上是“宽度”,因为它被侧身90 度与 myTableView.transform = CGAffineTransformMakeRotation(-CGFloat(M_PI_2))。

我的 layoutSubviews() :

override func layoutSubviews() {
    super.layoutSubviews()

    let viewsDictionary = ["navigationTableView":navigationTableView, "settingsTableView":settingsTableView, "settingsTableViewContainerView":settingsTableViewContainerView, "settingsViewContainerView":settingsViewContainerView]
    let metricsDictionary = ["navigationTableViewHeight":100.0, "settingsTableViewContainerViewHeight":70.0, "settingsViewContainerViewHeight":0.0, "viewWidth":screen.bounds.width]

    navigationTableView.setTranslatesAutoresizingMaskIntoConstraints(false)
    settingsTableView.setTranslatesAutoresizingMaskIntoConstraints(false)
    settingsViewContainerView.setTranslatesAutoresizingMaskIntoConstraints(false)
    settingsTableViewContainerView.setTranslatesAutoresizingMaskIntoConstraints(false)
    // sizing constraints

    // navigationTableView
    let navigationTableView_constraint_H: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[navigationTableView(viewWidth)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
    let navigationTableView_constraint_V: Array = NSLayoutConstraint.constraintsWithVisualFormat("V:[navigationTableView(>=navigationTableViewHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)

    navigationTableView.addConstraints(navigationTableView_constraint_H)
    navigationTableView.addConstraints(navigationTableView_constraint_V)

    // settingsTableViewContainerView
    let settingsTableViewContainerView_constraint_H: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[settingsTableViewContainerView(viewWidth)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
    let settingsTableViewContainerView_constraint_V: Array = NSLayoutConstraint.constraintsWithVisualFormat("V:[settingsTableViewContainerView(settingsTableViewContainerViewHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)

    settingsTableViewContainerView.addConstraints(settingsTableViewContainerView_constraint_H)
    settingsTableViewContainerView.addConstraints(settingsTableViewContainerView_constraint_V)

    // settingsTableView
    /*let settingsTableView_constraint_H: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[settingsTableView(settingsTableViewContainerViewHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
    let settingsTableView_constraint_V: Array = NSLayoutConstraint.constraintsWithVisualFormat("V:[settingsTableView(viewWidth)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)

    settingsTableView.addConstraints(settingsTableView_constraint_H)
    settingsTableView.addConstraints(settingsTableView_constraint_V)*/

    // settingsViewContainerView
    let settingsViewContainerView_constraint_H: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[settingsViewContainerView(viewWidth)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
    let settingsViewContainerView_constraint_V: Array = NSLayoutConstraint.constraintsWithVisualFormat("V:[settingsViewContainerView(settingsViewContainerViewHeight)]", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)

    settingsViewContainerView.addConstraints(settingsViewContainerView_constraint_H)
    settingsViewContainerView.addConstraints(settingsViewContainerView_constraint_V)

    switch settingsTableViewPosition {
        case .Top:
            //Todo
        break
        case .Bottom:
            // positioning
            let settingsTableView_constraint_H: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:|[settingsTableView]|", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
            let settingsTableView_constraint_V: Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|[settingsTableView]|", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)

            settingsTableViewContainerView.addConstraints(settingsTableView_constraint_H)
            settingsTableViewContainerView.addConstraints(settingsTableView_constraint_V)

            let view_constraint_H_navigationTableView: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:|[navigationTableView]|", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
            let view_constraint_H_settingsTableView: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:|[settingsTableViewContainerView]|", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
            let view_constraint_H_settingsViewContainerView: Array = NSLayoutConstraint.constraintsWithVisualFormat("H:|[settingsViewContainerView]|", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)
            let view_constraint_V: Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|[navigationTableView][settingsTableViewContainerView][settingsViewContainerView]|", options: NSLayoutFormatOptions(0), metrics: metricsDictionary, views: viewsDictionary)

            self.addConstraints(view_constraint_H_settingsTableView)
            self.addConstraints(view_constraint_H_navigationTableView)
            self.addConstraints(view_constraint_H_settingsViewContainerView)
            self.addConstraints(view_constraint_V)
        break
    }
}

【问题讨论】:

    标签: ios swift autolayout tableview


    【解决方案1】:

    我建议你使用 UICollectionView 而不是 UITableView。 这将完全解决您的问题。 根据我的经验,如果您“将 tableview 侧向旋转 90 度”,您会遇到很多功能错误。

    我不确定,但您可以针对您的问题尝试将 tableview 添加到容器中。 将 tableview 的左、上、下、右约束连接到容器宽度 .constant = 0。然后像往常一样为容器设置约束。 如果它不能帮助将 tableview.height 约束设置为 container.width 约束并将 tableview.width 设置为 container.height。

    【讨论】:

    • 感谢您的回复,但我已经测试了您的建议,问题是 UITableView 的 .Top 是 .Trailing 在旋转 90 度后应该在的位置。但是我会检查 UICollectionView,如果这对我不起作用,我会编写自己的 UIHorizo​​ntalTableView,继承自 UIScrollView
    【解决方案2】:

    您也可以尝试为 UITableView 使用自定义容器视图。 为自定义容器视图设置所需的约束。 在自定义容器视图的layoutSubviews方法中调用它的超级实现设置uitableivew的宽度和高度(tableview.height = container.width,tableview.width = container.height)。 我的意思是不要对 uitableview 使用约束。

    【讨论】:

      猜你喜欢
      • 2017-05-19
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多