我有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
就会随之移动。
这似乎并非如此,我无法弄清楚原因。在涉及约束时,我没有真正完成动画视图。我是否正确设置了它?我是否需要删除其中一个约束,然后添加另一个约束?提前谢谢。
答案 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