tyb*_*103 97 uiview ios autolayout nslayoutconstraint swift
我在IB中设置了多组约束,我想根据某些状态以编程方式在它们之间切换.有一个constraintsA
出口集合,所有出口集合都标记为从IB安装,constraintsB
出口集合全部在IB中卸载.
我可以编程方式在两个集之间切换,如下所示:
NSLayoutConstraint.deactivateConstraints(constraintsA)
NSLayoutConstraint.activateConstraints(constraintsB)
Run Code Online (Sandbox Code Playgroud)
但是......我无法弄清楚何时这样做.看起来我应该能够做到这一点viewDidLoad
,但我不能让它工作.我已经尝试过调用view.updateConstraints()
并view.layoutSubviews()
在设置约束后,但无济于事.
我确实发现,如果我设置约束,viewDidLayoutSubviews
一切都按预期工作.我想我想知道两件事......
小智 168
我激活和停用NSLayoutConstraints
的viewDidLoad
,和我没有任何问题,它.所以它确实有效.您的应用和我的应用之间的设置必须有所不同:-)
我只是描述我的设置 - 也许它可以给你带头:
@IBOutlets
激活/停用所需的所有约束.ViewController
,我将约束保存到非弱的类属性中.原因是我发现在停用约束后,我无法重新激活它 - 它是零.因此,它似乎在停用时被删除.NSLayoutConstraint.deactivate/activate
不像你那样使用,我使用constraint.active = YES
/ NO
代替.view.layoutIfNeeded()
.Leo*_*Leo 45
也许你可以检查一下@properties
,替换weak
为strong
.
有时因为active = NO
设置self.yourConstraint = nil
,所以你不能再使用self.yourConstraint
了.
小智 29
override func viewDidLayoutSubviews() {
// do it here, after constraints have been materialized
}
Run Code Online (Sandbox Code Playgroud)
Ash*_*Ash 14
我相信您遇到的问题是由于在viewDidLoad()
调用AFTER之前没有将约束添加到其视图中.你有很多选择:
A)您可以将布局约束连接到IBOutlet,并通过这些引用在代码中访问它们.由于插座在viewDidLoad()
开始之前已连接,因此应该可以访问约束,您可以继续在那里激活和停用它们.
B)如果你想使用UIView的constraints()
函数来访问各种约束,你必须等待viewDidLayoutSubviews()
开始并在那里开始,因为这是从一个nib创建一个视图控制器之后的第一点,它将具有任何已安装的约束.完成后不要忘记打电话layoutIfNeeded()
.这样做的缺点是,如果要应用任何更改,布局传递将执行两次,并且您必须确保不会触发无限循环.
快速警告: 方法不会返回禁用的约束constraints()
!这意味着如果您要禁用约束以便稍后再打开它,则需要保留对它的引用.
C)您可以忘记故事板方法并手动添加约束.由于你这样做,viewDidLoad()
我认为目的只是在对象的整个生命周期内只进行一次,而不是动态地改变布局,所以这应该是一种可接受的方法.
您还可以调整priority
属性以"启用"和"禁用"它们(例如,750值启用,250禁用).出于某种原因,更改active
BOOL对我的UI没有任何影响.不需要layoutIfNeeded
也可以在viewDidLoad或之后的任何时间设置和更改.
停用未使用的约束的适当时间:
-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
self.myLittleConstraint.active = NO;
}
Run Code Online (Sandbox Code Playgroud)
请记住,viewWillLayoutSubviews
可以多次调用,所以这里没有繁重的计算,好吗?
注意:如果您想稍后反应某些约束,则始终存储strong
对它们的引用.
创建视图时,将按顺序调用以下生命周期方法:
现在回答你的问题。
- 为什么我会出现这种行为?
答:因为当你试图在viewDidLoad
视图上设置约束时,视图没有其边界,因此无法设置约束。只有在viewDidLayoutSubviews
最终确定视图的边界之后。
- 是否可以从 viewDidLoad 激活/停用约束?
答案:否。原因如上所述。
归档时间: |
|
查看次数: |
72138 次 |
最近记录: |