我正在尝试使用自动布局为 Cocoa 中的控件设置动画。
现在,我可以设置 [[constraint animator] setConstant:newWidth];
,这很有效。
但是我怎样才能得到正确的约束呢?
使用[self constraints]
你可以获得所有的约束,在这种情况下我可以只选择constraints[0]
,但是约束的顺序可能会有所不同.
我如何确定我总是有正确的约束? 约束在 Interface Builder 中设置。我看到您可以向其中添加 IBOutlet,但似乎没有必要。
我的解决方案
谢谢,效果很好。我写了一个小类。
NSView+NSLayoutConstraintFilter.h
#import <Cocoa/Cocoa.h>
@interface NSView (NSLayoutConstraintFilter)
- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)attribute;
- (NSArray *)constaintsForAttribute:(NSLayoutAttribute)attribute;
@end
NSView+NSLayoutConstraintFilter.m
#import "NSView+NSLayoutConstraintFilter.h"
@implementation NSView (NSLayoutConstraintFilter)
- (NSArray *)constaintsForAttribute:(NSLayoutAttribute)attribute {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", attribute];
NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];
return filteredArray;
}
- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)attribute {
NSArray *constraints = [self constaintsForAttribute:attribute];
if (constraints.count) {
return constraints[0];
}
return nil;
}
@end
最佳答案
每个约束都有一个属性[constraint firstAttribute]
它返回一个枚举 NSLayoutAttribute
typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
NSLayoutAttributeLeft = 1,
NSLayoutAttributeRight,
NSLayoutAttributeTop,
NSLayoutAttributeBottom,
NSLayoutAttributeLeading,
NSLayoutAttributeTrailing,
NSLayoutAttributeWidth,
NSLayoutAttributeHeight,
NSLayoutAttributeCenterX,
NSLayoutAttributeCenterY,
NSLayoutAttributeBaseline,
NSLayoutAttributeNotAnAttribute = 0
};
所以你可以检查 NSLayoutAttributeWidth 的宽度。
示例代码:
NSArray constraints = [self constraints];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [constraints filteredArrayUsingPredicate:predicate];
if(filteredArray.count == 0){
return nil;
}
NSLayoutConstraint *constraint = [constraints objectAtIndex:0];
关于objective-c - 获取现有的 NSLayoutConstraint 宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857115/