用函数停用在 viewdidload 中声明的 nslayoutconstraint

Posted

技术标签:

【中文标题】用函数停用在 viewdidload 中声明的 nslayoutconstraint【英文标题】:deactivate nslayoutconstraint declared in viewdidload with function 【发布时间】:2019-10-19 01:23:31 【问题描述】:

我下面的代码在 viewdidload 中声明了布局约束。当调用函数 Selena 时,我希望将约束更改为函数 selena 中的内容。当我调用函数时,我不会改变对象。它没有效果。我知道我必须以某种方式停用原始约束。

   override func viewDidLoad() 

    NSLayoutConstraint.activate ([
        i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150),
        i.topAnchor.constraint(equalTo: view.centerYAnchor, constant : -200),

        i.widthAnchor.constraint(equalToConstant: 300),
        i.heightAnchor.constraint(equalToConstant: 450),

    ])




@objc func selena()
    NSLayoutConstraint.activate ([
        i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :50),
        i.topAnchor.constraint(equalTo: view.centerYAnchor, constant : -50),

        i.widthAnchor.constraint(equalToConstant: 20),
        i.heightAnchor.constraint(equalToConstant: 450),

    ])


【问题讨论】:

【参考方案1】:

您可以保留对它们的引用,然后使用deactivate

  var oldCons = [NSLayoutConstraint]()

   override func viewDidLoad() 
       super.viewDidLoad()
     oldCons = [
        i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150),
        i.topAnchor.constraint(equalTo: view.centerYAnchor, constant : -200), 
        i.widthAnchor.constraint(equalToConstant: 300),
        i.heightAnchor.constraint(equalToConstant: 450)
     ]
    NSLayoutConstraint.activate(oldCons)




@objc func selena()

    NSLayoutConstraint.deactivate(oldCons)
    NSLayoutConstraint.activate ([
        i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :50),
        i.topAnchor.constraint(equalTo: view.centerYAnchor, constant : -50), 
        i.widthAnchor.constraint(equalToConstant: 20),
        i.heightAnchor.constraint(equalToConstant: 450) 
    ])




高度约束没有改变,你可以将它从viewDidLoad中的数组中取出

 i.heightAnchor.constraint(equalToConstant: 450).isActive = true

并将其从selena 函数中删除

【讨论】:

【参考方案2】:

您需要将约束分配给变量,并在需要更改它们时更改它们的常量。这是带有尾随约束的示例。无需更改锚点,只需更改常量即可。这就是你的做法。

var iTrailingConstraint:NSLayoutConstraint?

override func viewDidLoad() 
   iTrailingConstraint = i.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant :150).isActive = true

当 selena 被调用时,您可以将常量设置为所需的动画。在控制器的视图上调用 layoutIfNeeded()

@objc func selena()
  UIView.animate(withDuration: 0.5, animations: 
    self.iTrailingConstraint?.constant = 50
    self.view.layoutIfNeeded()
  )

【讨论】:

以上是关于用函数停用在 viewdidload 中声明的 nslayoutconstraint的主要内容,如果未能解决你的问题,请参考以下文章

Play 商店控制台广告声明页面已停用

如何停用我的约束?

如何从 R 中的 ngram 标记列表中有效地删除停用词

结巴分词获取关键词时怎么过滤掉一些停用词

如何在 C++ 中声明后初始化 n 大小的数组

c语言怎样声明和定义全局变量