在运行时以编程方式激活约束

时间:2017-11-01 06:26:49

标签: ios swift autolayout constraints

我想使用约束在运行时以编程方式更改视图的位置 我有以下观点安排

#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)

这适用于第一次操作但是第二次失败,在视图调试器中进一步调试时我发现它创建了重复约束,而不是更改原始约束。

1 个答案:

答案 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会大大增加冲突的风险。