2015-05-25 52 views
0

我有我的應用程序的免費版本,我刪除+添加自動佈局約束(隱藏高級功能),但是如果用戶購買了我的應用程序,我想恢復到由界面構建器設置的約束。ObjC,在以編程方式添加/刪除之後,還原到界面構建器自動佈局約束?

我希望有一種方法可以實現這一目標,但目前我還找不到它?

這裏就是我有

if (!purchased) { 

[self.tblOtherAccounts addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:[tblOtherAccounts(==0)]" 
    options:0 
    metrics:nil 
    views:NSDictionaryOfVariableBindings(tblOtherAccounts)]]; 


NSDictionary *views = @{ @"tblOtherAccounts" : self.tblOtherAccounts, 
    @"butBackAllAc" : butBackAllAc }; 

[self.view removeConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:[tblOtherAccounts]-(12)-[butBackAllAc]" 
    options:0 
    metrics:nil 
    views:views]]; 

[self.view addConstraints:[NSLayoutConstraint 
    constraintsWithVisualFormat:@"V:[tblOtherAccounts]-(0)-[butBackAllAc]" 
    options:0 
    metrics:nil 
    views:views]]; 
} 

回答

0

添加一個IBOutlet將約束存儲在您的ViewController中:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *myConstraint; 

然後更新它的值:

_myConstraint.constant = 100.0f; 
[_myView setNeedsUpdateConstraints]; 
[_myView layoutIfNeeded]; 

關於對設置有關「等於」,我不認爲你可以做你的評論。

一兩件事你可以,雖然做的是使用你的故事板產生的約束作爲佔位符:

NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:_myConstraint.firstItem 
                   attribute:_myConstraint.firstAttribute 
                   relatedBy:_myConstraint.relation 
                    toItem:_myConstraint.secondItem 
                   attribute:_myConstraint.secondAttribute 
                   multiplier:_myConstraint.multiplier 
                    constant:_myConstraint.constant]; 

[_myConstraint.secondItem removeConstraint:_myConstraint]; 
[constraint.secondItem addConstraint:newConstraint]; 

當然上面的代碼將創建約束完全相同的副本,但可以對其進行編輯修改適當的價值,以適應您的需求。

+0

我不好,你應該在受影響的視圖上調用最後兩種方法,我編輯了我的答案。 – rdurand

+0

我已經添加了一些代碼到我的答案,我不知道是否有可能改變與出口 – Jules

+0

@Jules相等的關係:我添加了一些關於約束編輯的代碼,然後再添加代碼到您的問題。如果需要,我會檢查併爲我的答案添加更多精確度。 – rdurand

0

我認爲,你不能這樣做。 您需要在代碼中執行該邏輯。即應用一些約束,然後在用戶操作上應用另一組約束。

例: 你有2個限制:

@property ... topConstraint; 
@property ... leadingConstraint; 

一開始你給它們一些值:

topConstraint.constant = 100; 
leadingConstraint.constant = 100; 

後一些用戶操作,對其進行修改:

topConstraint.constant = 150; 
leadingConstraint.constant = 150; 
+0

感謝您的輸入,嗯,我想知道如果我可以將它們分配給一個變量,然後指派回來,仍然看.. – Jules

+0

是的,這是一個選項。 – Evgeniy

+0

沒有辦法。您只需將約束存儲在屬性中,然後根據需要進行修改。 – Evgeniy

相關問題