我正在尝试使用自动布局为Cocoa中的控件设置动画。
现在,我可以设置[[constraint animator] setConstant:newWidth];
,这有效。
但是我怎样才能得到正确的约束呢?
使用[self constraints]
,您可以获得所有约束,在这种情况下,我只需选择constraints[0]
,但约束的顺序可能会有所不同。
我怎样才能确定我总是有正确的约束? 约束在Interface Builder中设置。我已经看到你可以添加一个IBOutlet,但似乎没必要。
谢谢,它运作得很好。我写了一个小类。
#import <Cocoa/Cocoa.h>
@interface NSView (NSLayoutConstraintFilter)
- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)attribute;
- (NSArray *)constaintsForAttribute:(NSLayoutAttribute)attribute;
@end
#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
答案 0 :(得分:33)
每个约束都有一个属性[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];
答案 1 :(得分:3)
这是在Xcode 8.2.1和macOS 10.12.2上测试的swift 3版本。
代码显示了如何获取按钮的宽度和高度限制,但您可以从NSLayoutAttribute
枚举中过滤出您想要的任何内容。
let cons = signInButton.constraints.filter {
$0.firstAttribute == NSLayoutAttribute.width || $0.firstAttribute == NSLayoutAttribute.height /// or other from `NSLayoutAttribute`
}
// do something with the constraints array, e.g.
NSLayoutConstraint.deactivate(cons)
答案 2 :(得分:0)
/**
* Utils when working with constraints
*/
extension NSLayoutConstraint{
/**
* Returns all constraints of kinds
* EXAMPLE: NSLayoutConstraint.ofKind(rect.immediateConstraints, kinds: [.width,.height]) //width, height
*/
static func ofKind(_ constraints:[NSLayoutConstraint],kinds:[NSLayoutAttribute]) -> [NSLayoutConstraint]{
return kinds.map { kind in
return constraints.filter { constraint in
return constraint.firstAttribute == kind
}
}.flatMap({$0})//flattens 2d array to 1d array
}
}