在uitableview

时间:2015-06-22 04:58:33

标签: ios swift autolayout

我有UINavigationController我的自定义ViewController,其中tableView占据了整个屏幕。

我想按下tableView并显示一个只有几个项目的设置菜单。我的SettingsView.xib我在一个单独的笔尖中创建了320 x 90,其中只有一个UISegmentedControl

我在NSLayoutConstraint和顶部布局指南之间创建了tableView的插座。当我的settingsButton被按下时,我会这样做

func showSettings(sender: UIBarButtonItem) {
    println(String(format: "%@", NSStringFromCGRect(settingsView.frame)))
    println(String(format: "tableview %@", NSStringFromCGRect(tableView.frame)))
    isSettingsOpen = !isSettingsOpen
    settingsHeightConstraint.constant = isSettingsOpen ? 90.0 : -64.0

    UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.4, initialSpringVelocity: 8.0, options: .CurveEaseIn, animations: {
        self.view.layoutIfNeeded()
        }, completion: nil)
}

该部分按照我的预期向下滑动。然后我添加了settingsView,如下所示:

lazy var settingsView: UIView = self.initializeSettingsView()

func initializeSettingsView() -> UIView {
    let nib = UINib(nibName: "SettingsView", bundle: nil)
    let nibView = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    return nibView;
}

    // in viewDidLoad
    settingsView.center.y -= self.settingsView.frame.height
    view.addSubview(settingsView)

    var constraints = [NSLayoutConstraint]()
    constraints.append(NSLayoutConstraint(item: settingsView, attribute: NSLayoutAttribute.Bottom, relatedBy: .Equal, toItem: tableView, attribute: .Top, multiplier: 1.0, constant: 0.0))  // this constraint seems to be the problem one
    constraints.append(NSLayoutConstraint(item: settingsView, attribute: .Left, relatedBy: .Equal, toItem: tableView, attribute: .Left, multiplier: 1.0, constant: 0.0))
    constraints.append(NSLayoutConstraint(item: settingsView, attribute: .Right, relatedBy: .Equal, toItem: tableView, attribute: .Right, multiplier: 1.0, constant: 0.0))
    NSLayoutConstraint.activateConstraints(constraints)

然后我得到了模糊的布局。我知道我尝试设置动画的高度限制以及我发表评论的第一个约束是相互冲突的,因为如果我评论其中一行,我就不会收到错误消息。

我试图用第一个约束做的只是让settingsView"固定"到tableView的边缘,这样当tableView动画向下移动90.0时,settingsView就会随之移动。

这似乎并非如此,我无法弄清楚原因。在涉及约束时,我没有真正完成动画视图。我是否正确设置了它?我是否需要删除其中一个约束,然后添加另一个约束?提前谢谢。

1 个答案:

答案 0 :(得分:1)

initializeSettingsView()添加nibView.setTranslatesAutoresizingMaskIntoConstraints(false)。然后在viewDidload中将hight约束添加到settingsView

constraints.append(NSLayoutConstraint(item: settingsView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 90.0))

并且您不需要设置settingsView的位置,因为它将根据您添加的约束布局在正确的位置。所以只需删除settingsView.center.y -= settingsView.frame.size.height

即可