2015-06-22 2 views
0

У меня есть UINavigationController, у которого есть мой пользовательский ViewController с tableView в нем, который занимает весь экран.анимирующий вид сверху uitableview

Я хочу надавить на 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) 
} 

Эта часть скользит вниз, как я ожидал. Затем я добавил настройкиView следующим образом:

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 добавить высота ограничение на 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