如何以编程方式更改在IB中设置的自动布局约束?

时间:2018-02-20 18:09:55

标签: ios swift autolayout constraints

This question似乎接近我需要的东西,但并不完全......

我有一个UIView(确切地说是UITableView),它有一组指定的AL约束,通常来自IB(它应该是一个可重用的类,所以这就是“通常”)的原因。

键盘弹出时我需要轻推底部。我知道如何获取键盘事件和键盘大小,因此获取数字和执行线程不是问题。

轻推底部是。因为这是一个可重用的类,并且控制器的权限不会扩展到UITableView之外(这是表的较低AL约束所在的位置),所以我不能将“约束绑定到控制器”这样做,否则我会做

这意味着我需要以编程方式获得约束。如果没有约束,那么我需要知道,所以我可以告诉视图以老式的方式搭起它的裙子。

如果存在布局约束,那么我需要获得一个锚定表视图底部的约束。

由于那里可能存在各种垃圾(就像人们分配多个约束一样),我不能只抓住锚中的第一个约束。

我有一种感觉,没有实际的解决方案,我最终会扩展表格视图的可滚动内容大小的底部,并且连接contentOffset。这样可行,但不会那么“酷”。 :)

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以将IB中的约束链接到您的代码文件,就像链接您的视图一样。

  • 打开文档大纲
  • 寻找你的tableView
  • 扩展其约束
  • 右键单击从约束拖动到代码文件以创建约束的出口

之后你可以在代码中执行此操作

constraintOutletName.constant = 100.0 //set the value of the constraint

答案 1 :(得分:1)

override func viewDidLoad() {
    super.viewDidLoad()            
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)    
}

@objc func keyboardWillShow(notification: NSNotification) {        
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {

        self.tableViewBotCon.constant = -1 * keyboardSize.height

        self.view.layoutIfNeeded()

    }        
}

@objc func keyboardWillHide(notification: NSNotification) {

      self.tableViewBotCon.constant = 0

      self.view.layoutIfNeeded()
}

答案 2 :(得分:0)

答案是...... 我能收到信封吗? ......

“Yew Cain't Git Thar F'm Here。” - 至少,不是以理智的方式。

主要是因为可以附加到锚点的约束数量混乱(包括不适合该法案的约束)。

我正在使用我已经在研究的技术(并通过上面的答案提到)更简单地解决这个问题。

我会绿色检查答案,即使它基本上说要做我已经在做的事情,因为这是解决问题的正确方法。

[更新] 嗯,这很烦人。显然,在iPad上,它已经在操作系统中执行此操作,因此我需要添加一个重复的“成语”检查。

[更新2] 并非如此简单。看起来好像iPad描述的键盘是屏幕上键盘高度的两倍。

[更新3] 嗯...... lookee here what I found

[更新4] 原来问题是关于开场动画。我需要进一步了解键盘记录。当我看到高度时,我正在看Y的起源。