2015-06-22 48 views
0

我有一個UINavigationController有我的自定義ViewControllertableView在它佔用整個屏幕。動畫在uitableview之上的視圖

我想按下tableView並顯示一個只有幾件物品的設置菜單。我的SettingsView.xib我在一個320×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

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