【问题标题】:Animating a view on top of uitableview在 uitableview 之上为视图设置动画
【发布时间】:2015-09-07 10:56:33
【问题描述】:

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

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

我在tableView 和顶部布局指南之间创建了NSLayoutConstraint 的Outlet。当我的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 然后@987654335 @ 会同意的。

这似乎不是这样,我不知道为什么。当涉及约束时,我并没有真正对动画视图做太多事情。我设置正确了吗?我是否需要删除其中一个约束,然后再添加一个不同的约束?

【问题讨论】:

    标签: ios swift autolayout


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多