获取的宽度现有NSLayoutConstraint? [英] Getting an existing NSLayoutConstraint for the width?
问题描述
我想在动画可可自动布局的控制。
现在,我可以设置 [约束动画] setConstant:newWidth];
,其工作方式。
但我怎么能得到正确的约束?
使用 [自我约束]
你可以得到所有的约束,在这种情况下,我只能选择约束[0]
,但约束的顺序可以变化。
我怎么能肯定我总是有合适的约束?
这些约束在Interface Builder中设置的。我已经看到了你可以添加一个IBOutlet中来,但似乎有必要不。
我的解决方案
谢谢,它的工作太棒了。我写了一个小类别。
的NSView + NSLayoutConstraintFilter.h
#进口<可可/ Cocoa.h>@interface的NSView(NSLayoutConstraintFilter)
- (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute)属性;
- (NSArray的*)constaintsForAttribute:(NSLayoutAttribute)属性;
@结束
的NSView + NSLayoutConstraintFilter.m
#进口的NSView + NSLayoutConstraintFilter.h@implementation的NSView(NSLayoutConstraintFilter) - (NSArray的*)constaintsForAttribute:(NSLayoutAttribute){属性
NS predicate * predicate = NS predicate predicateWithFormat:@firstAttribute =%d个,属性]。
NSArray的* filteredArray = [[自我约束] filteredArrayUsing predicate:predicate]。 返回filteredArray;
} - (NSLayoutConstraint *)constraintForAttribute:(NSLayoutAttribute){属性
NSArray的*约束= [自我constaintsForAttribute:属性]。 如果(constraints.count){
返回约束[0];
} 回零;
}@结束
每一个约束实现有一个属性 [约束firstAttribute]
它返回一个枚举NSLayoutAttribute
的typedef NS_ENUM(NSInteger的,NSLayoutAttribute){
NSLayoutAttributeLeft = 1,
NSLayoutAttributeRight,
NSLayoutAttributeTop,
NSLayoutAttributeBottom,
NSLayoutAttributeLeading,
NSLayoutAttributeTrailing,
NSLayoutAttributeWidth,
NSLayoutAttributeHeight,
NSLayoutAttributeCenterX,
NSLayoutAttributeCenterY,
NSLayoutAttributeBaseline, NSLayoutAttributeNotAnAttribute = 0
};
所以你可以检查NSLayoutAttributeWidth的宽度。
样code:
NSArray的约束= [自我约束]
NS predicate * predicate = NS predicate predicateWithFormat:@firstAttribute =%d个,NSLayoutAttributeWidth]
NSArray的* filteredArray = [约束filteredArrayUsing predicate:predicate]。
如果(filteredArray.count == 0){
回零;
}
NSLayoutConstraint *约束= [约束objectAtIndex:0];
I'm trying to animate a control in Cocoa with auto layout.
Now, I can set [[constraint animator] setConstant:newWidth];
, which works.
But how can I get the right constraint?
With [self constraints]
you can get all the constraints, and in this case I can just select constraints[0]
, but the order of the constraints may vary.
How can I be certain I always have the right constraint? The constraints are set in Interface Builder. I have seen that you can add a IBOutlet to it, but it doesn't seem necessary.
My solution
Thanks, it worked great. I wrote a little category.
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
Every contraint has an attribute [constraint firstAttribute]
It returns an enum NSLayoutAttribute
typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
NSLayoutAttributeLeft = 1,
NSLayoutAttributeRight,
NSLayoutAttributeTop,
NSLayoutAttributeBottom,
NSLayoutAttributeLeading,
NSLayoutAttributeTrailing,
NSLayoutAttributeWidth,
NSLayoutAttributeHeight,
NSLayoutAttributeCenterX,
NSLayoutAttributeCenterY,
NSLayoutAttributeBaseline,
NSLayoutAttributeNotAnAttribute = 0
};
so you can check NSLayoutAttributeWidth for width.
Sample code:
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];
这篇关于获取的宽度现有NSLayoutConstraint?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!