2015-02-10 60 views
1

我想知道是否有可能獲得通過使用視覺格式語言創建的約束的指針。指向視覺格式語言(VFL)約束的指針?

對於一個簡單的例子,假設我已經爲一個視圖創建了一個約束數組,它被固定到它的超級視圖的頂部,左側和底部,但寬度爲100,我想獲得一個指向此寬度約束的指針,以稍後以編程方式進行更改。

的VFL因爲那是沿着線的東西:

UIView *insertedView = [[UIView alloc] init]; 
insertedView.translatesAutoresizingMaskIntoConstraints = NO; 
[self.view addSubview: insertedView]; 

NSDictionary *views = NSDictionaryOfVariableBindings(insertedView); 
NSDictionary *metrics = @{ @"viewWidth" : @(100.0) }; 

NSArray *constraintsH = [NSLayoutConstraint constraintsWithVisualFormat:@"|[insertedView(viewWidth)" options:0 metrics:metrics views:views]; 

NSArray *constraintsV = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[insertedView]|" options:0 metrics:nil views:views]; 

[self.view addConstraints: constraintsH]; 
[self.view addConstraints: constraintsV]; 

是否有可能獲得NSLayoutConstraint在上面的例子中指向的100.0寬度約束的實例?

我知道我可以通過另一種方式,通過constraintWithItem分別創建寬度約束:attribute:relatedBy:toItem:attribute:multiplier:constant,但我很好奇是否有一種方法可以做到這一點純VFL。要做到這一點

回答

1

一種方法是用NSArray- objectAtIndex:- indexOfObjectPassingTest:

NSUInteger index = [constraints indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) { 
    return ((NSLayoutConstraint *)obj).firstAttribute == NSLayoutAttributeWidth; 
}]; 

NSLayoutConstraint *widthConstraint = [constraints objectAtIndex:index]; 

如果你有多個寬度的限制(如在不同的優先級,例如),你可以做的測試阻止更具體。

+0

真棒,在我所有的時間開發iOS應用程序我從來沒有在NSArrays上遇到這種方法,很酷的東西。謝謝。 – 2015-02-10 18:09:34

+0

我想知道是否有一種方法可以用VFL設置約束的標識符屬性。這可能是使用您的方法來獲取問題約束的最快方法。 – 2015-02-10 18:17:51

+0

同意。我原本希望找到一種方法來做到這一點,因爲我認爲它是最直接的,但我從文檔中看不到它是如何完成的。 – akivajgordon 2015-02-10 18:19:59