我想使用约束在运行时以编程方式更改视图的位置 我有以下观点安排
#include <iostream>
using namespace std;
template <typename T>
void modify(T a)
{
cout<<a<<endl; //to check if its working
}
//func converts int a into const int a
constexpr int func(int a)
{
return a;
}
int main(){
for(int i=0; i<10; i++){
modify(func(i));//here passing func(i) returned value which can be used as template argument now as it is converted to constexpr
}
return 0;
}
说我 |
viewA
|
viewB
|
viewC
viewA
约束设置为父视图边距的顶部,topAnchor
viewB
设置为topAnchor
,依此类推{ {1}}
我想在运行时更改某些操作的这些视图的位置
viewA
我为viewC
存储了两个不同的约束,其中 |
viewA
|
viewC
|
viewB
位于viewB
之上,另一个存在viewA
viewC
在我的切换操作方法中,我做过类似的事情
viewBTopConstraints = viewB.topAnchor.constraint(equalTo: viewA.bottomAnchor, constant: TOP_SPACE)
newViewBTopConstraints = viewB.topAnchor.constraint(equalTo: viewC.bottomAnchor, constant: TOP_SPACE)
这适用于第一次操作但是第二次失败,在视图调试器中进一步调试时我发现它创建了重复约束,而不是更改原始约束。
答案 0 :(得分:1)
您的要求听起来类似于我有一些基于横向或纵向更改的约束的应用。在那里,我设置了三个约束组:
isActive = true
isActive = true
的人isActive = true
横向诀窍是将后两者放入数组中,并在正确的时间激活/取消正确的数组。这是我的意思的片段:
var p = [NSLayoutConstraint]()
var l = [NSLayoutConstraint]()
////// portrait layout....
// pin info button above imageLayout, right justified
p.append(info.topAnchor.constraint(equalTo: margins.topAnchor, constant: 20.0))
p.append(info.trailingAnchor.constraint(equalTo: margins.trailingAnchor))
////// landscape layout....
// pin info button above buttons, right justified
l.append(info.topAnchor.constraint(equalTo: margins.topAnchor, constant: 20.0))
l.append(info.trailingAnchor.constraint(equalTo: margins.trailingAnchor))
请注意,我不设置任何isActive = true
。我只是根据需要将内容添加到两个数组中。现在,在viewWillLayoutSubviews()
- 根据您的需要,viewDidLayoutSubviews()
可能是更好的覆盖 - 您*激活/停用正确的数组:
NSLayoutConstraint.deactivate(l)
NSLayoutConstraint.deactivate(p)
if self.bounds.width > self.bounds.height {
NSLayoutConstraint.activate(l)
} else {
NSLayoutConstraint.activate(p)
}
我发现使用个别约束设置isActive
会大大增加冲突的风险。