iOS:如何以编程方式自动布局水平表视图?

时间:2015-04-12 13:51:31

标签: ios swift autolayout tableview

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

我的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
    }
}

2 个答案:

答案 0 :(得分:0)

我建议您使用UICollectionView而不是UITableView。 这将完全解决您的问题。 根据我的经验,如果你将"将桌面视图横向翻转90度"

,你会在功能上遇到很多错误。

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

答案 1 :(得分:0)

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